From 3c71759c42814ac26231d181f665346902f49a81 Mon Sep 17 00:00:00 2001 From: Saad Date: Mon, 4 Nov 2024 01:22:22 -0500 Subject: [PATCH] update --- .eslintrc.js | 50 + .gitattributes | 2 + .github/workflows/node.js.yml | 30 + .gitignore | 7 +- LICENSE | 39 +- README.md | 55 +- VERSION | 26 +- bin/cjs/core/Controller.js | 163 + bin/cjs/core/Model.js | 120 + bin/cjs/core/View.js | 218 + bin/cjs/index.js | 32 + bin/cjs/interfaces/ICommand.js | 9 + bin/cjs/interfaces/IController.js | 9 + bin/cjs/interfaces/IFacade.js | 9 + bin/cjs/interfaces/IMediator.js | 9 + bin/cjs/interfaces/IModel.js | 9 + bin/cjs/interfaces/INotification.js | 9 + bin/cjs/interfaces/INotifier.js | 9 + bin/cjs/interfaces/IObserver.js | 9 + bin/cjs/interfaces/IProxy.js | 9 + bin/cjs/interfaces/IView.js | 9 + bin/cjs/patterns/command/MacroCommand.js | 107 + bin/cjs/patterns/command/SimpleCommand.js | 40 + bin/cjs/patterns/facade/Facade.js | 284 + bin/cjs/patterns/mediator/Mediator.js | 99 + bin/cjs/patterns/observer/Notification.js | 107 + bin/cjs/patterns/observer/Notifier.js | 61 + bin/cjs/patterns/observer/Observer.js | 95 + bin/cjs/patterns/proxy/Proxy.js | 90 + bin/esm/core/Controller.js | 159 + bin/esm/core/Model.js | 116 + bin/esm/core/View.js | 214 + bin/esm/index.js | 18 + bin/esm/interfaces/ICommand.js | 8 + bin/esm/interfaces/IController.js | 8 + bin/esm/interfaces/IFacade.js | 8 + bin/esm/interfaces/IMediator.js | 8 + bin/esm/interfaces/IModel.js | 8 + bin/esm/interfaces/INotification.js | 8 + bin/esm/interfaces/INotifier.js | 8 + bin/esm/interfaces/IObserver.js | 8 + bin/esm/interfaces/IProxy.js | 8 + bin/esm/interfaces/IView.js | 8 + bin/esm/patterns/command/MacroCommand.js | 103 + bin/esm/patterns/command/SimpleCommand.js | 36 + bin/esm/patterns/facade/Facade.js | 280 + bin/esm/patterns/mediator/Mediator.js | 95 + bin/esm/patterns/observer/Notification.js | 103 + bin/esm/patterns/observer/Notifier.js | 57 + bin/esm/patterns/observer/Observer.js | 91 + bin/esm/patterns/proxy/Proxy.js | 86 + bin/puremvc-typescript-standard-1.0-min.js | 17 - bin/puremvc-typescript-standard-1.0.d.ts | 264 - bin/puremvc-typescript-standard-1.0.js | 528 -- bin/types/core/Controller.d.ts | 133 + bin/types/core/Model.d.ts | 98 + bin/types/core/View.d.ts | 140 + bin/types/index.d.ts | 21 + bin/types/interfaces/ICommand.d.ts | 19 + bin/types/interfaces/IController.d.ts | 52 + bin/types/interfaces/IFacade.d.ts | 114 + bin/types/interfaces/IMediator.d.ts | 74 + bin/types/interfaces/IModel.d.ts | 45 + bin/types/interfaces/INotification.d.ts | 56 + bin/types/interfaces/INotifier.d.ts | 33 + bin/types/interfaces/IObserver.d.ts | 64 + bin/types/interfaces/IProxy.d.ts | 51 + bin/types/interfaces/IView.d.ts | 90 + bin/types/patterns/command/MacroCommand.d.ts | 86 + bin/types/patterns/command/SimpleCommand.d.ts | 30 + bin/types/patterns/facade/Facade.d.ts | 236 + bin/types/patterns/mediator/Mediator.d.ts | 81 + bin/types/patterns/observer/Notification.d.ts | 86 + bin/types/patterns/observer/Notifier.d.ts | 47 + bin/types/patterns/observer/Observer.d.ts | 72 + bin/types/patterns/proxy/Proxy.d.ts | 74 + build/build.properties | 25 - build/build.xml | 316 - build/lib/yuiant/license.txt | 3 - build/lib/yuiant/yuiant.jar | Bin 6083 -> 0 bytes build/lib/yuicompressor/license.txt | 54 - .../lib/yuicompressor/yuicompressor-2.4.2.jar | Bin 851219 -> 0 bytes build/user.properties.sample | 12 - docs/.nojekyll | 1 + docs/assets/highlight.css | 64 + docs/assets/icons.js | 18 + docs/assets/icons.svg | 1 + docs/assets/main.js | 60 + docs/assets/navigation.js | 1 + docs/assets/search.js | 1 + docs/assets/style.css | 1493 +++++ docs/classes/Controller.html | 79 + docs/classes/Facade.html | 139 + docs/classes/MacroCommand.html | 58 + docs/classes/Mediator.html | 49 + docs/classes/Model.html | 55 + docs/classes/Notification.html | 45 + docs/classes/Notifier.html | 32 + docs/classes/Observer.html | 37 + docs/classes/Proxy.html | 46 + docs/classes/SimpleCommand.html | 28 + docs/classes/View.html | 75 + docs/hierarchy.html | 1 + docs/index.html | 43 + docs/interfaces/ICommand.html | 14 + docs/interfaces/IController.html | 36 + docs/interfaces/IFacade.html | 66 + docs/interfaces/IMediator.html | 57 + docs/interfaces/IModel.html | 29 + docs/interfaces/INotification.html | 33 + docs/interfaces/INotifier.html | 21 + docs/interfaces/IObserver.html | 45 + docs/interfaces/IProxy.html | 45 + docs/interfaces/IView.html | 62 + docs/modules.html | 22 + jest.config.js | 6 + package-lock.json | 5326 +++++++++++++++++ package.json | 61 + src/core/Controller.ts | 187 + src/core/Model.ts | 140 + src/core/View.ts | 257 + src/index.ts | 30 + src/interfaces/ICommand.ts | 28 + src/interfaces/IController.ts | 64 + src/interfaces/IFacade.ts | 136 + src/interfaces/IMediator.ts | 90 + src/interfaces/IModel.ts | 58 + src/interfaces/INotification.ts | 68 + src/interfaces/INotifier.ts | 42 + src/interfaces/IObserver.ts | 78 + src/interfaces/IProxy.ts | 65 + src/interfaces/IView.ts | 106 + src/org/puremvc/typescript/core/Controller.ts | 210 - src/org/puremvc/typescript/core/Model.ts | 160 - src/org/puremvc/typescript/core/View.ts | 293 - .../puremvc/typescript/interfaces/ICommand.ts | 24 - .../typescript/interfaces/IController.ts | 79 - .../puremvc/typescript/interfaces/IFacade.ts | 158 - .../typescript/interfaces/IMediator.ts | 106 - .../puremvc/typescript/interfaces/IModel.ts | 65 - .../typescript/interfaces/INotification.ts | 77 - .../typescript/interfaces/INotifier.ts | 38 - .../typescript/interfaces/IObserver.ts | 70 - .../puremvc/typescript/interfaces/IProxy.ts | 62 - .../puremvc/typescript/interfaces/IView.ts | 116 - .../patterns/command/MacroCommand.ts | 120 - .../patterns/command/SimpleCommand.ts | 36 - .../typescript/patterns/facade/Facade.ts | 404 -- .../typescript/patterns/mediator/Mediator.ts | 146 - .../patterns/observer/Notification.ts | 143 - .../typescript/patterns/observer/Notifier.ts | 64 - .../typescript/patterns/observer/Observer.ts | 134 - .../typescript/patterns/proxy/Proxy.ts | 124 - src/patterns/command/MacroCommand.ts | 117 + src/patterns/command/SimpleCommand.ts | 43 + src/patterns/facade/Facade.ts | 316 + src/patterns/mediator/Mediator.ts | 120 + src/patterns/observer/Notification.ts | 125 + src/patterns/observer/Notifier.ts | 62 + src/patterns/observer/Observer.ts | 106 + src/patterns/proxy/Proxy.ts | 107 + test.html | 81 - ...emvc-typescript-standard-1.0-unit-tests.js | 1079 ---- test/core/Controller.spec.ts | 160 + test/core/ControllerTestCommand.ts | 35 + test/core/ControllerTestCommand2.ts | 35 + test/core/ControllerTestVO.ts | 31 + test/core/Model.spec.ts | 119 + test/core/ModelTestProxy.ts | 33 + test/core/View.spec.ts | 356 ++ test/core/ViewTestMediator.ts | 34 + test/core/ViewTestMediator2.ts | 46 + test/core/ViewTestMediator3.ts | 43 + test/core/ViewTestMediator4.ts | 41 + test/core/ViewTestMediator5.ts | 44 + test/core/ViewTestMediator6.ts | 36 + test/core/ViewTestNote.ts | 40 + test/lib/YUITest.d.ts | 209 - test/lib/fonts-min.css | 8 - test/lib/require.js | 34 - test/lib/testrunner.css | 28 - test/lib/testrunner.js | 125 - test/lib/yui-min.js | 13 - test/lib/yuitest_1.0.0b1.js | 4322 ------------- test/patterns/command/MacroCommand.spec.ts | 66 + .../command/MacroCommandTestCommand.ts | 35 + .../command/MacroCommandTestSub1Command.ts | 36 + .../command/MacroCommandTestSub2Command.ts | 36 + test/patterns/command/MacroCommandTestVO.ts | 34 + test/patterns/command/SimpleCommand.spec.ts | 51 + .../command/SimpleCommandTestCommand.ts | 32 + test/patterns/command/SimpleCommandTestVO.ts | 31 + test/patterns/facade/Facade.spec.ts | 210 + test/patterns/facade/FacadeTestCommand.ts | 35 + test/patterns/facade/FacadeTestVO.ts | 28 + test/patterns/mediator/Mediator.spec.ts | 44 + test/patterns/observer/Notification.spec.ts | 66 + test/patterns/observer/Notifier.spec.ts | 33 + test/patterns/observer/Observer.spec.ts | 87 + test/patterns/proxy/Proxy.spec.ts | 66 + .../puremvc/typescript/core/ControllerTest.ts | 208 - .../typescript/core/ControllerTestCommand.ts | 30 - .../typescript/core/ControllerTestCommand2.ts | 33 - .../typescript/core/ControllerTestVO.ts | 31 - .../org/puremvc/typescript/core/ModelTest.ts | 197 - .../puremvc/typescript/core/ModelTestProxy.ts | 54 - .../org/puremvc/typescript/core/ViewTest.ts | 594 -- .../typescript/core/ViewTestMediator.ts | 44 - .../typescript/core/ViewTestMediator2.ts | 69 - .../typescript/core/ViewTestMediator3.ts | 68 - .../typescript/core/ViewTestMediator4.ts | 61 - .../typescript/core/ViewTestMediator5.ts | 67 - .../typescript/core/ViewTestMediator6.ts | 79 - .../puremvc/typescript/core/ViewTestNote.ts | 51 - .../patterns/command/MacroCommandTest.ts | 94 - .../command/MacroCommandTestCommand.ts | 29 - .../patterns/command/MacroCommandTestSub.ts | 27 - .../command/MacroCommandTestSub1Command.ts | 30 - .../command/MacroCommandTestSub2Command.ts | 30 - .../patterns/command/MacroCommandTestVO.ts | 36 - .../patterns/command/SimpleCommandTest.ts | 74 - .../command/SimpleCommandTestCommand.ts | 30 - .../patterns/command/SimpleCommandTestSub.ts | 29 - .../patterns/command/SimpleCommandTestVO.ts | 33 - .../typescript/patterns/facade/FacadeTest.ts | 317 - .../patterns/facade/FacadeTestCommand.ts | 30 - .../patterns/facade/FacadeTestVO.ts | 31 - .../patterns/mediator/MediatorTest.ts | 76 - .../patterns/mediator/MediatorTestSub.ts | 27 - .../patterns/observer/NotificationTest.ts | 104 - .../patterns/observer/NotifierTest.ts | 65 - .../patterns/observer/NotifierTestCommand.ts | 30 - .../patterns/observer/NotifierTestSub.ts | 27 - .../patterns/observer/NotifierTestVO.ts | 31 - .../patterns/observer/ObserverTest.ts | 123 - .../typescript/patterns/proxy/ProxyTest.ts | 116 - .../typescript/patterns/proxy/ProxyTestSub.ts | 27 - tsconfig.json | 17 + 238 files changed, 17242 insertions(+), 12816 deletions(-) create mode 100644 .eslintrc.js create mode 100644 .gitattributes create mode 100644 .github/workflows/node.js.yml create mode 100644 bin/cjs/core/Controller.js create mode 100644 bin/cjs/core/Model.js create mode 100644 bin/cjs/core/View.js create mode 100644 bin/cjs/index.js create mode 100644 bin/cjs/interfaces/ICommand.js create mode 100644 bin/cjs/interfaces/IController.js create mode 100644 bin/cjs/interfaces/IFacade.js create mode 100644 bin/cjs/interfaces/IMediator.js create mode 100644 bin/cjs/interfaces/IModel.js create mode 100644 bin/cjs/interfaces/INotification.js create mode 100644 bin/cjs/interfaces/INotifier.js create mode 100644 bin/cjs/interfaces/IObserver.js create mode 100644 bin/cjs/interfaces/IProxy.js create mode 100644 bin/cjs/interfaces/IView.js create mode 100644 bin/cjs/patterns/command/MacroCommand.js create mode 100644 bin/cjs/patterns/command/SimpleCommand.js create mode 100644 bin/cjs/patterns/facade/Facade.js create mode 100644 bin/cjs/patterns/mediator/Mediator.js create mode 100644 bin/cjs/patterns/observer/Notification.js create mode 100644 bin/cjs/patterns/observer/Notifier.js create mode 100644 bin/cjs/patterns/observer/Observer.js create mode 100644 bin/cjs/patterns/proxy/Proxy.js create mode 100644 bin/esm/core/Controller.js create mode 100644 bin/esm/core/Model.js create mode 100644 bin/esm/core/View.js create mode 100644 bin/esm/index.js create mode 100644 bin/esm/interfaces/ICommand.js create mode 100644 bin/esm/interfaces/IController.js create mode 100644 bin/esm/interfaces/IFacade.js create mode 100644 bin/esm/interfaces/IMediator.js create mode 100644 bin/esm/interfaces/IModel.js create mode 100644 bin/esm/interfaces/INotification.js create mode 100644 bin/esm/interfaces/INotifier.js create mode 100644 bin/esm/interfaces/IObserver.js create mode 100644 bin/esm/interfaces/IProxy.js create mode 100644 bin/esm/interfaces/IView.js create mode 100644 bin/esm/patterns/command/MacroCommand.js create mode 100644 bin/esm/patterns/command/SimpleCommand.js create mode 100644 bin/esm/patterns/facade/Facade.js create mode 100644 bin/esm/patterns/mediator/Mediator.js create mode 100644 bin/esm/patterns/observer/Notification.js create mode 100644 bin/esm/patterns/observer/Notifier.js create mode 100644 bin/esm/patterns/observer/Observer.js create mode 100644 bin/esm/patterns/proxy/Proxy.js delete mode 100644 bin/puremvc-typescript-standard-1.0-min.js delete mode 100644 bin/puremvc-typescript-standard-1.0.d.ts delete mode 100644 bin/puremvc-typescript-standard-1.0.js create mode 100644 bin/types/core/Controller.d.ts create mode 100644 bin/types/core/Model.d.ts create mode 100644 bin/types/core/View.d.ts create mode 100644 bin/types/index.d.ts create mode 100644 bin/types/interfaces/ICommand.d.ts create mode 100644 bin/types/interfaces/IController.d.ts create mode 100644 bin/types/interfaces/IFacade.d.ts create mode 100644 bin/types/interfaces/IMediator.d.ts create mode 100644 bin/types/interfaces/IModel.d.ts create mode 100644 bin/types/interfaces/INotification.d.ts create mode 100644 bin/types/interfaces/INotifier.d.ts create mode 100644 bin/types/interfaces/IObserver.d.ts create mode 100644 bin/types/interfaces/IProxy.d.ts create mode 100644 bin/types/interfaces/IView.d.ts create mode 100644 bin/types/patterns/command/MacroCommand.d.ts create mode 100644 bin/types/patterns/command/SimpleCommand.d.ts create mode 100644 bin/types/patterns/facade/Facade.d.ts create mode 100644 bin/types/patterns/mediator/Mediator.d.ts create mode 100644 bin/types/patterns/observer/Notification.d.ts create mode 100644 bin/types/patterns/observer/Notifier.d.ts create mode 100644 bin/types/patterns/observer/Observer.d.ts create mode 100644 bin/types/patterns/proxy/Proxy.d.ts delete mode 100644 build/build.properties delete mode 100644 build/build.xml delete mode 100644 build/lib/yuiant/license.txt delete mode 100644 build/lib/yuiant/yuiant.jar delete mode 100644 build/lib/yuicompressor/license.txt delete mode 100644 build/lib/yuicompressor/yuicompressor-2.4.2.jar delete mode 100644 build/user.properties.sample create mode 100644 docs/.nojekyll create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/icons.js create mode 100644 docs/assets/icons.svg create mode 100644 docs/assets/main.js create mode 100644 docs/assets/navigation.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css create mode 100644 docs/classes/Controller.html create mode 100644 docs/classes/Facade.html create mode 100644 docs/classes/MacroCommand.html create mode 100644 docs/classes/Mediator.html create mode 100644 docs/classes/Model.html create mode 100644 docs/classes/Notification.html create mode 100644 docs/classes/Notifier.html create mode 100644 docs/classes/Observer.html create mode 100644 docs/classes/Proxy.html create mode 100644 docs/classes/SimpleCommand.html create mode 100644 docs/classes/View.html create mode 100644 docs/hierarchy.html create mode 100644 docs/index.html create mode 100644 docs/interfaces/ICommand.html create mode 100644 docs/interfaces/IController.html create mode 100644 docs/interfaces/IFacade.html create mode 100644 docs/interfaces/IMediator.html create mode 100644 docs/interfaces/IModel.html create mode 100644 docs/interfaces/INotification.html create mode 100644 docs/interfaces/INotifier.html create mode 100644 docs/interfaces/IObserver.html create mode 100644 docs/interfaces/IProxy.html create mode 100644 docs/interfaces/IView.html create mode 100644 docs/modules.html create mode 100644 jest.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/core/Controller.ts create mode 100644 src/core/Model.ts create mode 100644 src/core/View.ts create mode 100644 src/index.ts create mode 100644 src/interfaces/ICommand.ts create mode 100644 src/interfaces/IController.ts create mode 100644 src/interfaces/IFacade.ts create mode 100644 src/interfaces/IMediator.ts create mode 100644 src/interfaces/IModel.ts create mode 100644 src/interfaces/INotification.ts create mode 100644 src/interfaces/INotifier.ts create mode 100644 src/interfaces/IObserver.ts create mode 100644 src/interfaces/IProxy.ts create mode 100644 src/interfaces/IView.ts delete mode 100644 src/org/puremvc/typescript/core/Controller.ts delete mode 100644 src/org/puremvc/typescript/core/Model.ts delete mode 100644 src/org/puremvc/typescript/core/View.ts delete mode 100644 src/org/puremvc/typescript/interfaces/ICommand.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IController.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IFacade.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IMediator.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IModel.ts delete mode 100644 src/org/puremvc/typescript/interfaces/INotification.ts delete mode 100644 src/org/puremvc/typescript/interfaces/INotifier.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IObserver.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IProxy.ts delete mode 100644 src/org/puremvc/typescript/interfaces/IView.ts delete mode 100644 src/org/puremvc/typescript/patterns/command/MacroCommand.ts delete mode 100644 src/org/puremvc/typescript/patterns/command/SimpleCommand.ts delete mode 100644 src/org/puremvc/typescript/patterns/facade/Facade.ts delete mode 100644 src/org/puremvc/typescript/patterns/mediator/Mediator.ts delete mode 100644 src/org/puremvc/typescript/patterns/observer/Notification.ts delete mode 100644 src/org/puremvc/typescript/patterns/observer/Notifier.ts delete mode 100644 src/org/puremvc/typescript/patterns/observer/Observer.ts delete mode 100644 src/org/puremvc/typescript/patterns/proxy/Proxy.ts create mode 100644 src/patterns/command/MacroCommand.ts create mode 100644 src/patterns/command/SimpleCommand.ts create mode 100644 src/patterns/facade/Facade.ts create mode 100644 src/patterns/mediator/Mediator.ts create mode 100644 src/patterns/observer/Notification.ts create mode 100644 src/patterns/observer/Notifier.ts create mode 100644 src/patterns/observer/Observer.ts create mode 100644 src/patterns/proxy/Proxy.ts delete mode 100644 test.html delete mode 100644 test/bin/puremvc-typescript-standard-1.0-unit-tests.js create mode 100644 test/core/Controller.spec.ts create mode 100644 test/core/ControllerTestCommand.ts create mode 100644 test/core/ControllerTestCommand2.ts create mode 100644 test/core/ControllerTestVO.ts create mode 100644 test/core/Model.spec.ts create mode 100644 test/core/ModelTestProxy.ts create mode 100644 test/core/View.spec.ts create mode 100644 test/core/ViewTestMediator.ts create mode 100644 test/core/ViewTestMediator2.ts create mode 100644 test/core/ViewTestMediator3.ts create mode 100644 test/core/ViewTestMediator4.ts create mode 100644 test/core/ViewTestMediator5.ts create mode 100644 test/core/ViewTestMediator6.ts create mode 100644 test/core/ViewTestNote.ts delete mode 100644 test/lib/YUITest.d.ts delete mode 100644 test/lib/fonts-min.css delete mode 100644 test/lib/require.js delete mode 100644 test/lib/testrunner.css delete mode 100644 test/lib/testrunner.js delete mode 100644 test/lib/yui-min.js delete mode 100644 test/lib/yuitest_1.0.0b1.js create mode 100644 test/patterns/command/MacroCommand.spec.ts create mode 100644 test/patterns/command/MacroCommandTestCommand.ts create mode 100644 test/patterns/command/MacroCommandTestSub1Command.ts create mode 100644 test/patterns/command/MacroCommandTestSub2Command.ts create mode 100644 test/patterns/command/MacroCommandTestVO.ts create mode 100644 test/patterns/command/SimpleCommand.spec.ts create mode 100644 test/patterns/command/SimpleCommandTestCommand.ts create mode 100644 test/patterns/command/SimpleCommandTestVO.ts create mode 100644 test/patterns/facade/Facade.spec.ts create mode 100644 test/patterns/facade/FacadeTestCommand.ts create mode 100644 test/patterns/facade/FacadeTestVO.ts create mode 100644 test/patterns/mediator/Mediator.spec.ts create mode 100644 test/patterns/observer/Notification.spec.ts create mode 100644 test/patterns/observer/Notifier.spec.ts create mode 100644 test/patterns/observer/Observer.spec.ts create mode 100644 test/patterns/proxy/Proxy.spec.ts delete mode 100644 test/src/org/puremvc/typescript/core/ControllerTest.ts delete mode 100644 test/src/org/puremvc/typescript/core/ControllerTestCommand.ts delete mode 100644 test/src/org/puremvc/typescript/core/ControllerTestCommand2.ts delete mode 100644 test/src/org/puremvc/typescript/core/ControllerTestVO.ts delete mode 100644 test/src/org/puremvc/typescript/core/ModelTest.ts delete mode 100644 test/src/org/puremvc/typescript/core/ModelTestProxy.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTest.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator2.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator3.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator4.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator5.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestMediator6.ts delete mode 100644 test/src/org/puremvc/typescript/core/ViewTestNote.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTestCommand.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTestSub.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTestSub1Command.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTestSub2Command.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/MacroCommandTestVO.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/SimpleCommandTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/SimpleCommandTestCommand.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/SimpleCommandTestSub.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/command/SimpleCommandTestVO.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/facade/FacadeTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/facade/FacadeTestCommand.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/facade/FacadeTestVO.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/mediator/MediatorTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/mediator/MediatorTestSub.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/NotificationTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/NotifierTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/NotifierTestCommand.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/NotifierTestSub.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/NotifierTestVO.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/observer/ObserverTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/proxy/ProxyTest.ts delete mode 100644 test/src/org/puremvc/typescript/patterns/proxy/ProxyTestSub.ts create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..2ef403f --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,50 @@ +module.exports = { + "env": { + "browser": true, + "commonjs": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "indent": [ + "error", + 4 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "double" + ], + "semi": [ + "error", + "always" + ] + } +}; diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..81f1786 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +bin/** linguist-vendored +*.js linguist-vendored \ No newline at end of file diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..c9ada81 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,30 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + +name: Node.js CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [20.x, 21.x, 22.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test diff --git a/.gitignore b/.gitignore index 5dfc634..9765d1c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -/.idea -/*.sublime-project -/*.sublime-workspace -/build/user.properties \ No newline at end of file +.idea +node_modules +.DS_Store diff --git a/LICENSE b/LICENSE index 04de5e7..8a4dfb4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,11 +1,28 @@ -* PureMVC Standard Framework for TypeScript - Copyright © 2012 Frederic Saunier -* PureMVC Framework - Copyright © 2006-2012 Futurescale, Inc. -* All rights reserved. - -* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Futurescale, Inc., PureMVC.org, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +BSD 3-Clause License + +Copyright (c) 2024, Saad Shams + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 0d6e34b..3204ac8 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,32 @@ -## [PureMVC](http://puremvc.github.com/) TypeScript Standard Framework -PureMVC is a lightweight framework for creating applications based upon the classic [Model-View-Controller](http://en.wikipedia.org/wiki/Model-view-controller) design meta-pattern. This is a TypeScript port of the [AS3 reference implementation of the Standard Version](https://github.com/PureMVC/puremvc-as3-standard-framework/wiki). It does not support modular programming since it uses [Singleton](http://en.wikipedia.org/wiki/Singleton_pattern)s as Core actors rather than the [Multiton](http://en.wikipedia.org/wiki/Multiton)s used in the [MultiCore Version](https://github.com/PureMVC/puremvc-typescript-multicore-framework/wiki/). +## [PureMVC](http://puremvc.org/) TypeScript Standard Framework [![Node.js CI](https://github.com/PureMVC/puremvc-typescript-standard-framework/actions/workflows/node.js.yml/badge.svg)](https://github.com/PureMVC/puremvc-typescript-standard-framework/actions/workflows/node.js.yml) -Unit Tests are included in this repository. +PureMVC is a lightweight framework for creating applications based upon the classic [Model-View-Controller](http://en.wikipedia.org/wiki/Model-view-controller) design meta-pattern. It does not support [modular programming](http://en.wikipedia.org/wiki/Modular_programming) since it uses [Singleton](http://en.wikipedia.org/wiki/Singleton_pattern)s as Core actors rather than the [Multiton](http://en.wikipedia.org/wiki/Multiton)s used in the [MultiCore](https://github.com/PureMVC/puremvc-typescript-multicore-framework/wiki/) Version. -* [Discussion](http://forums.puremvc.org/index.php?board=112.0) -* [Live Unit Test Runner](http://puremvc.org/pages/demos/TS/PureMVC_TS_Standard_UnitTests/) -* [Demo: Employee Admin](https://github.com/PureMVC/puremvc-typescript-demo-employeeadmin/wiki) - -## Status -Production- [Version 1.0](https://github.com/PureMVC/puremvc-typescript-standard-framework/blob/master/VERSION) +* [API Docs](https://puremvc.org/pages/docs/TypeScript/standard/) +* [Legacy Implementation](https://github.com/PureMVC/puremvc-typescript-standard-framework/tree/1.0.1) ## Platforms / Technologies -* [TypeScript](http://www.typescriptlang.org/) -* [YUI Test](https://github.com/yui/yuitest) -* [YUI Compressor](http://developer.yahoo.com/yui/compressor/) -* [YUIAnt](http://www.ubik-ingenierie.com/miscellanous/YUIAnt/) -* [Ant](http://ant.apache.org/) - -## Usage - -As this port depends on the TypeScript language you may want to start by reading [TypeScript getting started guide](http://www.typescriptlang.org/). - -Unit Test can be run live in the browser using included HTML file [test.html](https://github.com/PureMVC/puremvc-typescript-standard-framework/blob/master/test-minified.html) +* [TypeScript](https://en.wikipedia.org/wiki/TypeScript) +* [JavaScript](https://en.wikipedia.org/wiki/JavaScript) +* [ECMAScript](https://en.wikipedia.org/wiki/ECMAScript) +* [CommonJS](https://en.wikipedia.org/wiki/CommonJS) +* [Node.js](https://en.wikipedia.org/wiki/Node.js) +* [React](https://en.wikipedia.org/wiki/React_(JavaScript_library)) +* [React Native](https://en.wikipedia.org/wiki/React_Native) -## Build - -To build the project you'll need to download and install : -* [TypeScript compiler](http://www.typescriptlang.org/#Download) -* [Ant](http://ant.apache.org/) -* [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html/) (Ant need a JDK not a JRE, also don't forget to change environment var JAVA_HOME to the JDK path). - -1. Rename the file [user.properties.sample](https://github.com/PureMVC/puremvc-typescript-standard-framework/blob/master/user.properties.sample) to **user.properties** -2. Edit the file and replace **MY_TYPESCRIPT_COMPILER_PATH** by the real TypeScript compiler full -system path. e.g. on windows: ``typescript.compiler.path = C:/Documents and Settings/{USER NAME HERE}/Application Data/npm/tsc.cmd -3. Use your favorite editor to run Ant or simply type ``ant puremvc-typescript-standard-framework/build +## Status +Production - [Version 2.0.0](https://github.com/PureMVC/puremvc-typescript-standard-framework/blob/master/VERSION) ## License -* PureMVC TypeScript Standard Framework - Copyright © 2012 Frederic Saunier -* PureMVC - Copyright © 2006-2012 Futurescale, Inc. +* PureMVC Standard Framework for TypeScript - Copyright © 2024 [Saad Shams](https://www.linkedin.com/in/muizz) +* PureMVC - Copyright © 2024 [Futurescale, Inc.](http://futurescale.com/) * All rights reserved. * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Futurescale, Inc., PureMVC.org, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of Futurescale, Inc., PureMVC.org, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/VERSION b/VERSION index 86193ce..54b702d 100644 --- a/VERSION +++ b/VERSION @@ -1,16 +1,10 @@ -PureMVC Standard Framework for TypeScript ----------------------------------------------------------------------------------------------------- -Release Date: 11/10/2012 -Platform: TypeScript -Version: 1 -Revision: 0 -Author: Frederic Saunier ----------------------------------------------------------------------------------------------------- - -1.0 - First official PureMVC TypeScript Standard port. - -This port, is inspired originally from PureMVC Standard Framework for AS3 port by Cliff Hall but was -converted both from PureMVC AS3 Standard port and PureMVC JavaScript Standard for Objs Unit Tests. - -Will probably stay tagged as development while TypeScript language specification is not finalized, -but remember that any TypeScript PureMVC project will output ready for production JavaScript. \ No newline at end of file +PureMVC Standard Framework for TypeScript +-------------------------------------------------------------------------- +Release Date: 11/03/24 + Platform: TypeScript + Version: 2 + Revision: 0 + Minor: 0 + Authors: Saad Shams +-------------------------------------------------------------------------- +2.0.0 - Brand new implementation of ported code, equivalent to AS3 Standard Version 2.0.4. diff --git a/bin/cjs/core/Controller.js b/bin/cjs/core/Controller.js new file mode 100644 index 0000000..aa32303 --- /dev/null +++ b/bin/cjs/core/Controller.js @@ -0,0 +1,163 @@ +"use strict"; +// +// Controller.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Controller = void 0; +const View_1 = require("./View"); +const Observer_1 = require("../patterns/observer/Observer"); +/** + * A Singleton `Controller` implementation. + * + * In PureMVC, the `Controller` class follows the + * 'Command and Controller' strategy, and assumes these + * responsibilities: + * + * + * - Remembering which `Command`s + * are intended to handle which `Notifications`. + * - Registering itself as an `Observer` with + * the `View` for each `Notification` + * that it has a `Command` mapping for. + * - Creating a new instance of the proper `Command` + * to handle a given `Notification` when notified by the `View`. + * - Calling the `Command`'s `execute` + * method, passing in the `Notification`. + * + * + * Your application must register `Commands` with the + * Controller. + * + * The simplest way is to subclass `Facade`, + * and use its `initializeController` method to add your + * registrations. + * + * @see {@link View} + * @see {@link Observer} + * @see {@link Notification} + * @see {@link SimpleCommand} + * @see {@link MacroCommand} + * + * @class Controller + */ +class Controller { + /** + * Constructor. + * + * This `Controller` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton Factory method, + * `Controller.getInstance()` + * + * @throws {Error} Error if instance for this Singleton has already been constructed + */ + constructor() { + if (Controller.instance != null) { + throw Error(Controller.SINGLETON_MSG); + } + Controller.instance = this; + this.commandMap = {}; + this.initializeController(); + } + /** + * Initialize the Singleton `Controller` instance. + * + * Called automatically by the constructor. + * + * Note that if you are using a subclass of `View` + * in your application, you should also subclass `Controller` + * and override the `initializeController` method in the + * following way: + * + * ```ts + * // ensure that the Controller is talking to my View implementation + * initializeController() { + * this.view = MyView.getInstance(() => new View()); + * } + * ``` + * @returns {void} + */ + initializeController() { + this.view = View_1.View.getInstance(() => new View_1.View()); + } + /** + * `Controller` Singleton Factory method. + * + * @param {() => IController} factory - A factory function that creates a new instance of the controller if one does not already exist. + * @returns {IController} the Singleton instance of `Controller`. + */ + static getInstance(factory) { + if (Controller.instance == null) + Controller.instance = factory(); + return Controller.instance; + } + /** + * Register a particular `Command` class as the handler + * for a particular `Notification`. + * + * If an `Command` has already been registered to + * handle `Notification`s with this name, it is no longer + * used, the new `Command` is used instead. + * + * The Observer for the new Command is only created if this the + * first time a Command has been registered for this Notification name. + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of the command. + * @returns {void} + */ + registerCommand(notificationName, factory) { + var _a; + if (this.commandMap[notificationName] == null) { + (_a = this.view) === null || _a === void 0 ? void 0 : _a.registerObserver(notificationName, new Observer_1.Observer(this.executeCommand, this)); + } + this.commandMap[notificationName] = factory; + } + /** + * If a `Command` has previously been registered + * to handle the given `Notification`, then it is executed. + * + * @param {INotification} notification - The notification containing the data or command details needed for execution. + * @returns {void} + */ + executeCommand(notification) { + const factory = this.commandMap[notification.name]; + if (factory == null) + return; + const command = factory(); + command.execute(notification); + } + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check for a registered command. + * @returns {boolean} `true` if a command is registered for the specified notification name; otherwise, `false`. + */ + hasCommand(notificationName) { + return this.commandMap[notificationName] != null; + } + /** + * Remove a previously registered `Command` to `Notification` mapping. + * + * @param {string} notificationName - The name of the notification for which the associated command should be removed. + * @returns {void} + */ + removeCommand(notificationName) { + var _a; + // if the Command is registered... + if (this.hasCommand(notificationName)) { + // remove the observer + (_a = this.view) === null || _a === void 0 ? void 0 : _a.removeObserver(notificationName, this); + // remove the command + delete this.commandMap[notificationName]; + } + } +} +exports.Controller = Controller; +/** Message Constants + * @type {string} */ +Controller.SINGLETON_MSG = "Controller Singleton already constructed!"; diff --git a/bin/cjs/core/Model.js b/bin/cjs/core/Model.js new file mode 100644 index 0000000..3d921bb --- /dev/null +++ b/bin/cjs/core/Model.js @@ -0,0 +1,120 @@ +"use strict"; +// +// Model.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Model = void 0; +/** + * A Singleton `Model` implementation. + * + * In PureMVC, the `Model` class provides + * access to model objects (Proxies) by named lookup. + * + * The `Model` assumes these responsibilities: + * + * - Maintain a cache of `Proxy` instances. + * - Provide methods for registering, retrieving, and removing + * `Proxy` instances. + * + * Your application must register `Proxy` instances + * with the `Model`. Typically, you use an + * `Command` to create and register `Proxy` + * instances once the `Facade` has initialized the Core + * actors. + * + * @see {@link Proxy} + * + * @class Model + */ +class Model { + /** + * Constructor. + * + * This `Model` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `Model.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor() { + if (Model.instance != null) + throw Error(Model.SINGLETON_MSG); + Model.instance = this; + this.proxyMap = {}; + this.initializeModel(); + } + /** + * Initialize the `Model` instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + initializeModel() { + } + /** + * `Model` Singleton Factory method. + * + * @param {() => IModel} factory - A factory function that creates a new instance of the model if one does not already exist. + * @returns {IModel} The Singleton instance. + */ + static getInstance(factory) { + if (Model.instance == null) + Model.instance = factory(); + return Model.instance; + } + /** + * Register a `Proxy` with the `Model`. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy) { + this.proxyMap[proxy.name] = proxy; + proxy.onRegister(); + } + /** + * Retrieve a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName) { + return this.proxyMap[proxyName] || null; + } + /** + * Check if a Proxy is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy with the specified name is registered; otherwise, `false`. + */ + hasProxy(proxyName) { + return this.proxyMap[proxyName] != null; + } + /** + * Remove a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to be removed. + * @returns {IProxy | null} The removed proxy instance, or `null` if no proxy with the given name was found. + */ + removeProxy(proxyName) { + const proxy = this.proxyMap[proxyName]; + if (!proxy) + return null; + delete this.proxyMap[proxyName]; + proxy.onRemove(); + return proxy; + } +} +exports.Model = Model; +/** Message Constants + * @type {string} */ +Model.SINGLETON_MSG = "Model Singleton already constructed!"; diff --git a/bin/cjs/core/View.js b/bin/cjs/core/View.js new file mode 100644 index 0000000..48443c5 --- /dev/null +++ b/bin/cjs/core/View.js @@ -0,0 +1,218 @@ +"use strict"; +// +// View.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.View = void 0; +const Observer_1 = require("../patterns/observer/Observer"); +/** + * A Singleton `View` implementation. + * + * In PureMVC, the `View` class assumes these responsibilities: + * + * - Maintain a cache of `Mediator` instances. + * - Provide methods for registering, retrieving, and removing `Mediators`. + * - Notifying `Mediators` when they are registered or removed. + * - Managing the observer lists for each `Notification` in the application. + * - Providing a method for attaching `Observers` to a `Notification`'s observer list. + * - Providing a method for broadcasting a `Notification`. + * - Notifying the `Observers` of a given `Notification` when it broadcast. + * + * @see {@link Mediator} + * @see {@link Observer} + * @see {@link Notification} + * + * @class View + */ +class View { + /** + * Constructor. + * + * This `View` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `View.getInstance()` + * + * @throws {Error} Error if instance for this Singleton key has already been constructed + */ + constructor() { + if (View.instance != null) + throw Error(View.SINGLETON_MSG); + View.instance = this; + this.mediatorMap = {}; + this.observerMap = {}; + this.initializeView(); + } + /** + * Initialize the Singleton View instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + initializeView() { + } + /** + * View Singleton factory method. + * + * @param {() => IView} factory - A factory function that creates a new instance of the view if one does not already exist. + * @returns {IView} The view instance. + */ + static getInstance(factory) { + if (View.instance == null) + View.instance = factory(); + return View.instance; + } + /** + * Register an `Observer` to be notified + * of `Notifications` with a given name. + * + * @param {string} notificationName - The name of the notification to which the observer should be registered. + * @param {IObserver} observer - The observer instance to be registered. + * @returns {void} + */ + registerObserver(notificationName, observer) { + if (this.observerMap[notificationName] != null) { + this.observerMap[notificationName].push(observer); + } + else { + this.observerMap[notificationName] = [observer]; + } + } + /** + * Notify the `Observers` for a particular `Notification`. + * + * All previously attached `Observers` for this `Notification`'s + * list are notified and are passed a reference to the `Notification` in + * the order in which they were registered. + * + * @param {INotification} notification - The notification containing the data or command details to be sent to observers. + * @returns {void} + */ + notifyObservers(notification) { + if (this.observerMap[notification.name] == null) + return; + // Get a reference to the observer list for this notification name + // Copy observers from reference array to a working array, + // since the reference array may change during the notification loop + const observers = this.observerMap[notification.name].slice(); + // Notify Observers from the working array + for (let i = 0; i < observers.length; i++) { + observers[i].notifyObserver(notification); + } + } + /** + * Remove the observer for a given notifyContext from an observer list for a given Notification name. + * + * @param {string} notificationName - The name of the notification for which the observer should be removed. + * @param {object} notifyContext - The context of the observer to be removed. + * @returns {void} + */ + removeObserver(notificationName, notifyContext) { + // the observer list for the notification under inspection + const observers = this.observerMap[notificationName]; + // find the observer for the notifyContext + for (let i = 0; i < observers.length; i++) { + if (observers[i].compareNotifyContext(notifyContext)) { + // there can only be one Observer for a given notifyContext + // in any given Observer list, so remove it and break + observers.splice(i, 1); + break; + } + } + // Also, when a Notification's Observer list length falls to + // zero, delete the notification key from the observer map + if (observers.length == 0) { + delete this.observerMap[notificationName]; + } + } + /** + * Register a `Mediator` instance with the `View`. + * + * Registers the `Mediator` so that it can be retrieved by name, + * and further interrogates the `Mediator` for its + * `Notification` interests. + * + * If the `Mediator` returns any `Notification` + * names to be notified about, an `Observer` is created encapsulating + * the `Mediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `Notifications` the + * `Mediator` is interested in. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator) { + // do not allow re-registration (you must to removeMediator fist) + if (this.mediatorMap[mediator.name] != null) + return; + // Register the Mediator for retrieval by name + this.mediatorMap[mediator.name] = mediator; + // Get Notification interests, if any. + const interests = mediator.listNotificationInterests(); + // Register Mediator as an observer for each notification of interests + if (interests.length > 0) { + // Create Observer referencing this mediator's handleNotification method + const observer = new Observer_1.Observer(mediator.handleNotification, mediator); + // Register Mediator as Observer for its list of Notification interests + for (let i = 0; i < interests.length; i++) { + this.registerObserver(interests[i], observer); + } + } + // alert the mediator that it has been registered + mediator.onRegister(); + } + /** + * Retrieve a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName) { + return this.mediatorMap[mediatorName] || null; + } + /** + * Check if a Mediator is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator with the specified name is registered; otherwise, `false`. + */ + hasMediator(mediatorName) { + return this.mediatorMap[mediatorName] != null; + } + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to be removed. + * @returns {IMediator | null} The removed mediator instance, or `null` if no mediator with the given name was found. + */ + removeMediator(mediatorName) { + // Retrieve the named mediator + const mediator = this.mediatorMap[mediatorName]; + if (mediator == null) + return null; + // for every notification this mediator is interested in... + const interests = mediator.listNotificationInterests(); + for (let i = 0; i < interests.length; i++) { + // remove the observer linking the mediator + // to the notification interest + this.removeObserver(interests[i], mediator); + } + // remove the mediator from the map + delete this.mediatorMap[mediatorName]; + // alert the mediator that it has been removed + mediator.onRemove(); + return mediator; + } +} +exports.View = View; +/** Message Constants + * @type {string} */ +View.SINGLETON_MSG = "View Singleton already constructed!"; diff --git a/bin/cjs/index.js b/bin/cjs/index.js new file mode 100644 index 0000000..eef49cd --- /dev/null +++ b/bin/cjs/index.js @@ -0,0 +1,32 @@ +"use strict"; +// +// index.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Proxy = exports.Observer = exports.Notifier = exports.Notification = exports.Mediator = exports.Facade = exports.SimpleCommand = exports.MacroCommand = exports.View = exports.Model = exports.Controller = void 0; +var Controller_1 = require("./core/Controller"); +Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return Controller_1.Controller; } }); +var Model_1 = require("./core/Model"); +Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return Model_1.Model; } }); +var View_1 = require("./core/View"); +Object.defineProperty(exports, "View", { enumerable: true, get: function () { return View_1.View; } }); +var MacroCommand_1 = require("./patterns/command/MacroCommand"); +Object.defineProperty(exports, "MacroCommand", { enumerable: true, get: function () { return MacroCommand_1.MacroCommand; } }); +var SimpleCommand_1 = require("./patterns/command/SimpleCommand"); +Object.defineProperty(exports, "SimpleCommand", { enumerable: true, get: function () { return SimpleCommand_1.SimpleCommand; } }); +var Facade_1 = require("./patterns/facade/Facade"); +Object.defineProperty(exports, "Facade", { enumerable: true, get: function () { return Facade_1.Facade; } }); +var Mediator_1 = require("./patterns/mediator/Mediator"); +Object.defineProperty(exports, "Mediator", { enumerable: true, get: function () { return Mediator_1.Mediator; } }); +var Notification_1 = require("./patterns/observer/Notification"); +Object.defineProperty(exports, "Notification", { enumerable: true, get: function () { return Notification_1.Notification; } }); +var Notifier_1 = require("./patterns/observer/Notifier"); +Object.defineProperty(exports, "Notifier", { enumerable: true, get: function () { return Notifier_1.Notifier; } }); +var Observer_1 = require("./patterns/observer/Observer"); +Object.defineProperty(exports, "Observer", { enumerable: true, get: function () { return Observer_1.Observer; } }); +var Proxy_1 = require("./patterns/proxy/Proxy"); +Object.defineProperty(exports, "Proxy", { enumerable: true, get: function () { return Proxy_1.Proxy; } }); diff --git a/bin/cjs/interfaces/ICommand.js b/bin/cjs/interfaces/ICommand.js new file mode 100644 index 0000000..a2ebf98 --- /dev/null +++ b/bin/cjs/interfaces/ICommand.js @@ -0,0 +1,9 @@ +"use strict"; +// +// ICommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IController.js b/bin/cjs/interfaces/IController.js new file mode 100644 index 0000000..7b905bc --- /dev/null +++ b/bin/cjs/interfaces/IController.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IController.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IFacade.js b/bin/cjs/interfaces/IFacade.js new file mode 100644 index 0000000..17e026a --- /dev/null +++ b/bin/cjs/interfaces/IFacade.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IFacade.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IMediator.js b/bin/cjs/interfaces/IMediator.js new file mode 100644 index 0000000..f2db85b --- /dev/null +++ b/bin/cjs/interfaces/IMediator.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IMediator.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IModel.js b/bin/cjs/interfaces/IModel.js new file mode 100644 index 0000000..4955b8d --- /dev/null +++ b/bin/cjs/interfaces/IModel.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IModel.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/INotification.js b/bin/cjs/interfaces/INotification.js new file mode 100644 index 0000000..b748961 --- /dev/null +++ b/bin/cjs/interfaces/INotification.js @@ -0,0 +1,9 @@ +"use strict"; +// +// INotification.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/INotifier.js b/bin/cjs/interfaces/INotifier.js new file mode 100644 index 0000000..f856760 --- /dev/null +++ b/bin/cjs/interfaces/INotifier.js @@ -0,0 +1,9 @@ +"use strict"; +// +// INotifier.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IObserver.js b/bin/cjs/interfaces/IObserver.js new file mode 100644 index 0000000..2119660 --- /dev/null +++ b/bin/cjs/interfaces/IObserver.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IObserver.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IProxy.js b/bin/cjs/interfaces/IProxy.js new file mode 100644 index 0000000..953e8ea --- /dev/null +++ b/bin/cjs/interfaces/IProxy.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IProxy.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/interfaces/IView.js b/bin/cjs/interfaces/IView.js new file mode 100644 index 0000000..00af113 --- /dev/null +++ b/bin/cjs/interfaces/IView.js @@ -0,0 +1,9 @@ +"use strict"; +// +// IView.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/bin/cjs/patterns/command/MacroCommand.js b/bin/cjs/patterns/command/MacroCommand.js new file mode 100644 index 0000000..8e17451 --- /dev/null +++ b/bin/cjs/patterns/command/MacroCommand.js @@ -0,0 +1,107 @@ +"use strict"; +// +// MacroCommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MacroCommand = void 0; +const SimpleCommand_1 = require("./SimpleCommand"); +/** + * A base `Command` implementation that executes other `Command`s. + * + * A `MacroCommand` maintains a list of + * `Command` Class references called `SubCommands`. + * + * When `execute` is called, the `MacroCommand` + * instantiates and calls `execute` on each of its `SubCommands` turn. + * Each `SubCommand` will be passed a reference to the original + * `Notification` that was passed to the `MacroCommand`'s + * `execute` method. + * + * Unlike `SimpleCommand`, your subclass + * should not override `execute`, but instead, should + * override the `initializeMacroCommand` method, + * calling `addSubCommand` once for each `SubCommand` + * to be executed. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link SimpleCommand} + * + * @class MacroCommand + * @extends Notifier + */ +class MacroCommand extends SimpleCommand_1.SimpleCommand { + /** + * Constructor. + * + * You should not need to define a constructor, + * instead, override the `initializeMacroCommand` + * method. + * + * If your subclass does define a constructor, be + * sure to call `super()`. + * + */ + constructor() { + super(); + this.subCommands = []; + this.initializeMacroCommand(); + } + /** + * Initialize the `MacroCommand`. + * + * In your subclass, override this method to + * initialize the `MacroCommand`'s `SubCommand` + * list with `Command` class references like + * this: + * + * ```ts + * // Initialize MyMacroCommand + * initializeMacroCommand() { + * this.addSubCommand(() => new app.FirstCommand()); + * this.addSubCommand(() => new app.SecondCommand()); + * this.addSubCommand(() => new app.ThirdCommand()); + * } + * ``` + * + * Note that `SubCommand`s may be any `Command` implementor, + * `MacroCommand`s or `SimpleCommands` are both acceptable. + */ + initializeMacroCommand() { + } + /** + * Add a `SubCommand`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {() => ICommand} factory - A factory function that creates an instance of ICommand. This function will be used to generate the sub-command. + * @returns {void} + */ + addSubCommand(factory) { + this.subCommands.push(factory); + } + /** + * Execute this `MacroCommand`'s `SubCommands`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification) { + while (this.subCommands.length > 0) { + const factory = this.subCommands.shift(); + const command = factory === null || factory === void 0 ? void 0 : factory(); + if (command) { + command.execute(notification); + } + } + } +} +exports.MacroCommand = MacroCommand; diff --git a/bin/cjs/patterns/command/SimpleCommand.js b/bin/cjs/patterns/command/SimpleCommand.js new file mode 100644 index 0000000..9109753 --- /dev/null +++ b/bin/cjs/patterns/command/SimpleCommand.js @@ -0,0 +1,40 @@ +"use strict"; +// +// SimpleCommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SimpleCommand = void 0; +const Notifier_1 = require("../observer/Notifier"); +/** + * A base `Command` implementation. + * + * Your subclass should override the `execute` + * method where your business logic will handle the `Notification`. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link MacroCommand} + * + * @class SimpleCommand + * @extends Notifier + */ +class SimpleCommand extends Notifier_1.Notifier { + /** + * Fulfill the use-case initiated by the given `Notification`. + * + * In the Command Pattern, an application use-case typically + * begins with some user action, which results in a `Notification` being broadcast, which + * is handled by business logic in the `execute` method of an + * `Command`. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification) { + } +} +exports.SimpleCommand = SimpleCommand; diff --git a/bin/cjs/patterns/facade/Facade.js b/bin/cjs/patterns/facade/Facade.js new file mode 100644 index 0000000..68fc1d8 --- /dev/null +++ b/bin/cjs/patterns/facade/Facade.js @@ -0,0 +1,284 @@ +"use strict"; +// +// Facade.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Facade = void 0; +const Controller_1 = require("../../core/Controller"); +const Model_1 = require("../../core/Model"); +const View_1 = require("../../core/View"); +const Notification_1 = require("../observer/Notification"); +/** + * A base Singleton `Facade` implementation. + * + * @see {@link Model} + * @see {@link View} + * @see {@link Controller} + * + * @class Facade + */ +class Facade { + /** + * Constructor. + * + * This `Facade` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Factory method, + * passing the unique key for this instance + * `Facade.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor() { + if (Facade.instance != null) + throw Error(Facade.SINGLETON_MSG); + Facade.instance = this; + this.initializeFacade(); + } + /** + * Initialize the Singleton `Facade` instance. + * + * Called automatically by the constructor. Override in your + * subclass to do any subclass specific initializations. Be + * sure to call `super.initializeFacade()`, though. + * + * @returns {void} + */ + initializeFacade() { + this.initializeModel(); + this.initializeController(); + this.initializeView(); + } + /** + * Facade Singleton Factory method + * + * @param {(key: string) => IFacade} factory - A factory function that creates a new instance of the facade. + * @returns {IFacade} the Singleton instance of the Facade + */ + static getInstance(factory) { + if (Facade.instance == null) + Facade.instance = factory(); + return Facade.instance; + } + /** + * Initialize the `Model`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Model`. + * - You have `Proxy`s to register with the Model that do not + * retrieve a reference to the Facade at construction time.` + * + * If you don't want to initialize a different `Model`, + * call `super.initializeModel()` at the beginning of your + * method, then register `Proxy`s. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Proxy`s + * with the `Model`, since `Proxy`s with mutable data will likely + * need to send `Notification`s and thus will likely want to fetch a reference to + * the `Facade` during their construction. + * + * @returns {void} + */ + initializeModel() { + this.model = Model_1.Model.getInstance(() => new Model_1.Model()); + } + /** + * Initialize the `Controller`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Controller`. + * - You have `Commands` to register with the `Controller` at startup.`. + * + * If you don't want to initialize a different `Controller`, + * call `super.initializeController()` at the beginning of your + * method, then register `Command`s. + * + * @returns {void} + */ + initializeController() { + this.controller = Controller_1.Controller.getInstance(() => new Controller_1.Controller()); + } + /** + * Initialize the `View`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `View`. + * - You have `Observers` to register with the `View` + * + * If you don't want to initialize a different `View`, + * call `super.initializeView()` at the beginning of your + * method, then register `Mediator` instances. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Mediator`s + * with the `View`, since `Mediator` instances will need to send + * `Notification`s and thus will likely want to fetch a reference + * to the `Facade` during their construction. + * + * @returns {void} + */ + initializeView() { + this.view = View_1.View.getInstance(() => new View_1.View()); + } + /** + * Register a `Command` with the `Controller` by Notification name. * + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of ICommand. This function is used to create the command. + * @returns {void} + */ + registerCommand(notificationName, factory) { + var _a; + (_a = this.controller) === null || _a === void 0 ? void 0 : _a.registerCommand(notificationName, factory); + } + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification; otherwise, `false`. + */ + hasCommand(notificationName) { + var _a, _b; + return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.hasCommand(notificationName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a previously registered `Command` to `Notification` mapping from the Controller. + * + * @param {string} notificationName - The name of the notification for which the command should be removed. + * @returns {void} + */ + removeCommand(notificationName) { + var _a; + (_a = this.controller) === null || _a === void 0 ? void 0 : _a.removeCommand(notificationName); + } + /** + * Register a `Proxy` with the `Model` by name. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy) { + var _a; + (_a = this.model) === null || _a === void 0 ? void 0 : _a.registerProxy(proxy); + } + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.retrieveProxy(proxyName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered for the name; otherwise, `false`. + */ + hasProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.hasProxy(proxyName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed proxy instance, or `null` if no such proxy exists. + */ + removeProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.removeProxy(proxyName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Register a `Mediator` with the `View`. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator) { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.registerMediator(mediator); + } + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.retrieveMediator(mediatorName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered for the name; otherwise, `false`. + */ + hasMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.hasMediator(mediatorName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance, or `null` if no such mediator exists. + */ + removeMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.removeMediator(mediatorName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Notify `Observer`s. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - The notification to be sent to observers. + * @returns {void} + */ + notifyObservers(notification) { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.notifyObservers(notification); + } + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName, body, type) { + this.notifyObservers(new Notification_1.Notification(notificationName, body, type)); + } +} +exports.Facade = Facade; +/** Message Constants + * @type {string} */ +Facade.SINGLETON_MSG = "Facade Singleton already constructed!"; diff --git a/bin/cjs/patterns/mediator/Mediator.js b/bin/cjs/patterns/mediator/Mediator.js new file mode 100644 index 0000000..2f42028 --- /dev/null +++ b/bin/cjs/patterns/mediator/Mediator.js @@ -0,0 +1,99 @@ +"use strict"; +// +// Mediator.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Mediator = void 0; +const Notifier_1 = require("../observer/Notifier"); +/** + * A base `Mediator` implementation. + * + * @see {@link View} + * + * @class Mediator + * @extends Notifier + */ +class Mediator extends Notifier_1.Notifier { + /** + * Constructor. + * + * @param {string} [name] - Optional name for the mediator. Defaults to `Mediator.NAME`. + * @param {any} [viewComponent] - Optional view component associated with the mediator. + */ + constructor(name, viewComponent) { + super(); + this._name = name || Mediator.NAME; + this._viewComponent = viewComponent; + } + /** + * Called by the View when the Mediator is registered + * + * @returns {void} + */ + onRegister() { + } + /** + * Called by the View when the Mediator is removed + * + * @returns {void} + */ + onRemove() { + } + /** + * List the `Notification` names this + * `Mediator` is interested in being notified of. + * + * @returns {string[]} An array of notification names. + */ + listNotificationInterests() { + return []; + } + /** + * Handle `Notification`s. + * + * Typically, this will be handled in a switch statement, + * with one 'case' entry per `Notification` + * the `Mediator` is interested in. + * + * @param {INotification} notification - The notification to handle. + * @returns {void} + */ + handleNotification(notification) { + } + /** + * the mediator name + * + * @returns {string} The name of the mediator. + */ + get name() { + return this._name; + } + /** + * Get the `Mediator`'s view component. + * + * Additionally, an implicit getter will usually + * be defined in the subclass that casts the view + * object to a type, like this: + * + * @returns {any} The view component. + */ + get viewComponent() { + return this._viewComponent; + } + /** + * Set the `Mediator`'s view component. + * + * @param {any} value - The new view component. + */ + set viewComponent(value) { + this._viewComponent = value; + } +} +exports.Mediator = Mediator; +/** The default name for the mediator. + * @type {string} */ +Mediator.NAME = "Mediator"; diff --git a/bin/cjs/patterns/observer/Notification.js b/bin/cjs/patterns/observer/Notification.js new file mode 100644 index 0000000..d56a6ea --- /dev/null +++ b/bin/cjs/patterns/observer/Notification.js @@ -0,0 +1,107 @@ +"use strict"; +// +// Notification.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Notification = void 0; +/** + * A base `Notification` implementation. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The Observer Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * Notifications are not meant to be a replacement for Events + * in Flex/Flash/Apollo. Generally, `Mediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notification`s to + * trigger `Command`s or to communicate with other `Mediators`. `Proxy` and `Command` + * instances communicate with each other and `Mediator`s + * by broadcasting `Notification`s. + * + * A key difference between Flash `Event`s and PureMVC + * `Notification`s is that `Event`s follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the `Event`, while + * PureMVC `Notification`s follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notification`s. + * + * @class Notification + */ +class Notification { + /** + * Constructor. + * + * @param {string} name - The name of the notification. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + */ + constructor(name, body, type) { + this._name = name; + this._body = body; + this._type = type; + } + /** + * Get the name of the `Notification` instance. + * + * @returns {string} The name of the notification. + */ + get name() { + return this._name; + } + /** + * Get the body of the `Notification` instance. + * + * @returns {any} The body of the notification. + */ + get body() { + return this._body; + } + /** + * Set the body of the `Notification` instance. + * + * @param {any} value - The new body to be set for the notification. + */ + set body(value) { + this._body = value; + } + /** + * Get the type of the `Notification` instance. + * + * @returns {string | undefined} The type of the notification, or `undefined` if not set. + */ + get type() { + return this._type; + } + /** + * Set the type of the `Notification` instance. + * + * @param {string | undefined} value - The new type to be set for the notification. + */ + set type(value) { + this._type = value; + } + /** + * Get the string representation of the `Notification` instance. + * + * @returns {string} A string representation of the notification. + */ + toString() { + var _a; + let msg = `Notification Name: ${this.name}`; + msg += `\nBody: ${this.body ? this.body : "null"}`; + msg += `\nType: ${(_a = this.type) !== null && _a !== void 0 ? _a : "null"}`; + return msg; + } +} +exports.Notification = Notification; diff --git a/bin/cjs/patterns/observer/Notifier.js b/bin/cjs/patterns/observer/Notifier.js new file mode 100644 index 0000000..9e23fe3 --- /dev/null +++ b/bin/cjs/patterns/observer/Notifier.js @@ -0,0 +1,61 @@ +"use strict"; +// +// Notifier.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Notifier = void 0; +const Facade_1 = require("../facade/Facade"); +/** + * A Base `Notifier` implementation. + * + * `MacroCommand, Command, Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `Notifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @see {@link Proxy} + * @see {@link Facade} + * @see {@link Mediator} + * @see {@link MacroCommand} + * @see {@link SimpleCommand} + * + * @class Notifier + */ +class Notifier { + constructor() { + /** + * Return the Singleton Facade instance + * + * @returns {IFacade} The facade instance. + */ + this.facade = Facade_1.Facade.getInstance(() => new Facade_1.Facade()); + } + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new Notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName, body, type) { + this.facade.sendNotification(notificationName, body, type); + } +} +exports.Notifier = Notifier; diff --git a/bin/cjs/patterns/observer/Observer.js b/bin/cjs/patterns/observer/Observer.js new file mode 100644 index 0000000..750ace9 --- /dev/null +++ b/bin/cjs/patterns/observer/Observer.js @@ -0,0 +1,95 @@ +"use strict"; +// +// Observer.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Observer = void 0; +/** + * A base `Observer` implementation. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a method that should + * be called when a particular `Notification` is broadcast. + * + * In PureMVC, the `Observer` class assumes these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * - Encapsulate the notification context (this) of the interested object. + * - Provide methods for setting the notification method and context. + * - Provide a method for notifying the interested object. + * + * @class Observer + */ +class Observer { + /** + * Constructor. + * + * The notification method on the interested object should take + * one parameter of type `Notification` + * + * @param {((notification: INotification) => void) | null} notify - The method to be called when a notification is received. Can be `null`. + * @param {any | null} context - The context in which to call the `notifyMethod`. Can be `null`. + */ + constructor(notify, context) { + this._notifyMethod = notify; + this._notifyContext = context; + } + /** + * Get the notification method. + * + * @returns {((notification: INotification) => void) | null} The current method or `null` if no method is set. + */ + get notifyMethod() { + return this._notifyMethod; + } + /** + * Set the notification method. + * + * The notification method should take one parameter of type `Notification`. + * + * @param {((notification: INotification) => void) | null} value - The method to set for handling notifications. Can be `null`. + */ + set notifyMethod(value) { + this._notifyMethod = value; + } + /** + * Get the notifyContext + * + * @returns {any | null} The current context or `null` if no context is set. + */ + get notifyContext() { + return this._notifyContext; + } + /** + * Set the notification context. + * + * @param {any | null} value - The context to set. Can be `null`. + */ + set notifyContext(value) { + this._notifyContext = value; + } + /** + * Notify the interested object. + * + * @param {INotification} notification - The notification to send to the observer. + * @returns {void} + */ + notifyObserver(notification) { + var _a; + (_a = this.notifyMethod) === null || _a === void 0 ? void 0 : _a.call(this.notifyContext, notification); + } + /** + * Compare an object to the notification context. + * + * @param {any} object - The object to compare with the observer's context. + * @returns {boolean} `true` if the context is the same, otherwise `false`. + */ + compareNotifyContext(object) { + return object == this.notifyContext; + } +} +exports.Observer = Observer; diff --git a/bin/cjs/patterns/proxy/Proxy.js b/bin/cjs/patterns/proxy/Proxy.js new file mode 100644 index 0000000..5bf3207 --- /dev/null +++ b/bin/cjs/patterns/proxy/Proxy.js @@ -0,0 +1,90 @@ +"use strict"; +// +// Proxy.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Proxy = void 0; +const Notifier_1 = require("../observer/Notifier"); +/** + * A base `Proxy` implementation. + * + * In PureMVC, `Proxy` classes are used to manage parts of the + * application's data model. + * + * A `Proxy` might simply manage a reference to a local data object, + * in which case interacting with it might involve setting and + * getting of its data in synchronous fashion. + * + * `Proxy` classes are also used to encapsulate the application's + * interaction with remote services to save or retrieve data, in which case, + * we adopt an asynchronous idiom; setting data (or calling a method) on the + * `Proxy` and listening for a `Notification` to be sent + * when the `Proxy` has retrieved the data from the service. + * + * @see {@link Model} + * + * @class Proxy + * @extends Notifier + */ +class Proxy extends Notifier_1.Notifier { + /** + * Constructor + * + * @param {string} [name] - The name of the proxy. Defaults to `Proxy.NAME` if not provided. + * @param {any} [data] - The data associated with the proxy. Can be `null`. + */ + constructor(name, data) { + super(); + this._name = name || Proxy.NAME; + this._data = data; + } + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + onRegister() { + } + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + onRemove() { + } + /** + * Get the proxy name + * + * @returns {string} The name of the proxy. + */ + get name() { + return this._name; + } + /** + * Get the data object + * + * @returns {any} The current data or `undefined` if no data is set. + */ + get data() { + return this._data; + } + /** + * Set the data object + * + * @param {any} value - The data to set. Can be `null`. + */ + set data(value) { + this._data = value; + } +} +exports.Proxy = Proxy; +/** + * The default name for the Proxy. + * + * @type {string} + */ +Proxy.NAME = "Proxy"; diff --git a/bin/esm/core/Controller.js b/bin/esm/core/Controller.js new file mode 100644 index 0000000..d8fbdf2 --- /dev/null +++ b/bin/esm/core/Controller.js @@ -0,0 +1,159 @@ +// +// Controller.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { View } from "./View"; +import { Observer } from "../patterns/observer/Observer"; +/** + * A Singleton `Controller` implementation. + * + * In PureMVC, the `Controller` class follows the + * 'Command and Controller' strategy, and assumes these + * responsibilities: + * + * + * - Remembering which `Command`s + * are intended to handle which `Notifications`. + * - Registering itself as an `Observer` with + * the `View` for each `Notification` + * that it has a `Command` mapping for. + * - Creating a new instance of the proper `Command` + * to handle a given `Notification` when notified by the `View`. + * - Calling the `Command`'s `execute` + * method, passing in the `Notification`. + * + * + * Your application must register `Commands` with the + * Controller. + * + * The simplest way is to subclass `Facade`, + * and use its `initializeController` method to add your + * registrations. + * + * @see {@link View} + * @see {@link Observer} + * @see {@link Notification} + * @see {@link SimpleCommand} + * @see {@link MacroCommand} + * + * @class Controller + */ +export class Controller { + /** + * Constructor. + * + * This `Controller` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton Factory method, + * `Controller.getInstance()` + * + * @throws {Error} Error if instance for this Singleton has already been constructed + */ + constructor() { + if (Controller.instance != null) { + throw Error(Controller.SINGLETON_MSG); + } + Controller.instance = this; + this.commandMap = {}; + this.initializeController(); + } + /** + * Initialize the Singleton `Controller` instance. + * + * Called automatically by the constructor. + * + * Note that if you are using a subclass of `View` + * in your application, you should also subclass `Controller` + * and override the `initializeController` method in the + * following way: + * + * ```ts + * // ensure that the Controller is talking to my View implementation + * initializeController() { + * this.view = MyView.getInstance(() => new View()); + * } + * ``` + * @returns {void} + */ + initializeController() { + this.view = View.getInstance(() => new View()); + } + /** + * `Controller` Singleton Factory method. + * + * @param {() => IController} factory - A factory function that creates a new instance of the controller if one does not already exist. + * @returns {IController} the Singleton instance of `Controller`. + */ + static getInstance(factory) { + if (Controller.instance == null) + Controller.instance = factory(); + return Controller.instance; + } + /** + * Register a particular `Command` class as the handler + * for a particular `Notification`. + * + * If an `Command` has already been registered to + * handle `Notification`s with this name, it is no longer + * used, the new `Command` is used instead. + * + * The Observer for the new Command is only created if this the + * first time a Command has been registered for this Notification name. + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of the command. + * @returns {void} + */ + registerCommand(notificationName, factory) { + var _a; + if (this.commandMap[notificationName] == null) { + (_a = this.view) === null || _a === void 0 ? void 0 : _a.registerObserver(notificationName, new Observer(this.executeCommand, this)); + } + this.commandMap[notificationName] = factory; + } + /** + * If a `Command` has previously been registered + * to handle the given `Notification`, then it is executed. + * + * @param {INotification} notification - The notification containing the data or command details needed for execution. + * @returns {void} + */ + executeCommand(notification) { + const factory = this.commandMap[notification.name]; + if (factory == null) + return; + const command = factory(); + command.execute(notification); + } + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check for a registered command. + * @returns {boolean} `true` if a command is registered for the specified notification name; otherwise, `false`. + */ + hasCommand(notificationName) { + return this.commandMap[notificationName] != null; + } + /** + * Remove a previously registered `Command` to `Notification` mapping. + * + * @param {string} notificationName - The name of the notification for which the associated command should be removed. + * @returns {void} + */ + removeCommand(notificationName) { + var _a; + // if the Command is registered... + if (this.hasCommand(notificationName)) { + // remove the observer + (_a = this.view) === null || _a === void 0 ? void 0 : _a.removeObserver(notificationName, this); + // remove the command + delete this.commandMap[notificationName]; + } + } +} +/** Message Constants + * @type {string} */ +Controller.SINGLETON_MSG = "Controller Singleton already constructed!"; diff --git a/bin/esm/core/Model.js b/bin/esm/core/Model.js new file mode 100644 index 0000000..bc2c65a --- /dev/null +++ b/bin/esm/core/Model.js @@ -0,0 +1,116 @@ +// +// Model.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +/** + * A Singleton `Model` implementation. + * + * In PureMVC, the `Model` class provides + * access to model objects (Proxies) by named lookup. + * + * The `Model` assumes these responsibilities: + * + * - Maintain a cache of `Proxy` instances. + * - Provide methods for registering, retrieving, and removing + * `Proxy` instances. + * + * Your application must register `Proxy` instances + * with the `Model`. Typically, you use an + * `Command` to create and register `Proxy` + * instances once the `Facade` has initialized the Core + * actors. + * + * @see {@link Proxy} + * + * @class Model + */ +export class Model { + /** + * Constructor. + * + * This `Model` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `Model.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor() { + if (Model.instance != null) + throw Error(Model.SINGLETON_MSG); + Model.instance = this; + this.proxyMap = {}; + this.initializeModel(); + } + /** + * Initialize the `Model` instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + initializeModel() { + } + /** + * `Model` Singleton Factory method. + * + * @param {() => IModel} factory - A factory function that creates a new instance of the model if one does not already exist. + * @returns {IModel} The Singleton instance. + */ + static getInstance(factory) { + if (Model.instance == null) + Model.instance = factory(); + return Model.instance; + } + /** + * Register a `Proxy` with the `Model`. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy) { + this.proxyMap[proxy.name] = proxy; + proxy.onRegister(); + } + /** + * Retrieve a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName) { + return this.proxyMap[proxyName] || null; + } + /** + * Check if a Proxy is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy with the specified name is registered; otherwise, `false`. + */ + hasProxy(proxyName) { + return this.proxyMap[proxyName] != null; + } + /** + * Remove a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to be removed. + * @returns {IProxy | null} The removed proxy instance, or `null` if no proxy with the given name was found. + */ + removeProxy(proxyName) { + const proxy = this.proxyMap[proxyName]; + if (!proxy) + return null; + delete this.proxyMap[proxyName]; + proxy.onRemove(); + return proxy; + } +} +/** Message Constants + * @type {string} */ +Model.SINGLETON_MSG = "Model Singleton already constructed!"; diff --git a/bin/esm/core/View.js b/bin/esm/core/View.js new file mode 100644 index 0000000..6a3541b --- /dev/null +++ b/bin/esm/core/View.js @@ -0,0 +1,214 @@ +// +// View.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Observer } from "../patterns/observer/Observer"; +/** + * A Singleton `View` implementation. + * + * In PureMVC, the `View` class assumes these responsibilities: + * + * - Maintain a cache of `Mediator` instances. + * - Provide methods for registering, retrieving, and removing `Mediators`. + * - Notifying `Mediators` when they are registered or removed. + * - Managing the observer lists for each `Notification` in the application. + * - Providing a method for attaching `Observers` to a `Notification`'s observer list. + * - Providing a method for broadcasting a `Notification`. + * - Notifying the `Observers` of a given `Notification` when it broadcast. + * + * @see {@link Mediator} + * @see {@link Observer} + * @see {@link Notification} + * + * @class View + */ +export class View { + /** + * Constructor. + * + * This `View` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `View.getInstance()` + * + * @throws {Error} Error if instance for this Singleton key has already been constructed + */ + constructor() { + if (View.instance != null) + throw Error(View.SINGLETON_MSG); + View.instance = this; + this.mediatorMap = {}; + this.observerMap = {}; + this.initializeView(); + } + /** + * Initialize the Singleton View instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + initializeView() { + } + /** + * View Singleton factory method. + * + * @param {() => IView} factory - A factory function that creates a new instance of the view if one does not already exist. + * @returns {IView} The view instance. + */ + static getInstance(factory) { + if (View.instance == null) + View.instance = factory(); + return View.instance; + } + /** + * Register an `Observer` to be notified + * of `Notifications` with a given name. + * + * @param {string} notificationName - The name of the notification to which the observer should be registered. + * @param {IObserver} observer - The observer instance to be registered. + * @returns {void} + */ + registerObserver(notificationName, observer) { + if (this.observerMap[notificationName] != null) { + this.observerMap[notificationName].push(observer); + } + else { + this.observerMap[notificationName] = [observer]; + } + } + /** + * Notify the `Observers` for a particular `Notification`. + * + * All previously attached `Observers` for this `Notification`'s + * list are notified and are passed a reference to the `Notification` in + * the order in which they were registered. + * + * @param {INotification} notification - The notification containing the data or command details to be sent to observers. + * @returns {void} + */ + notifyObservers(notification) { + if (this.observerMap[notification.name] == null) + return; + // Get a reference to the observer list for this notification name + // Copy observers from reference array to a working array, + // since the reference array may change during the notification loop + const observers = this.observerMap[notification.name].slice(); + // Notify Observers from the working array + for (let i = 0; i < observers.length; i++) { + observers[i].notifyObserver(notification); + } + } + /** + * Remove the observer for a given notifyContext from an observer list for a given Notification name. + * + * @param {string} notificationName - The name of the notification for which the observer should be removed. + * @param {object} notifyContext - The context of the observer to be removed. + * @returns {void} + */ + removeObserver(notificationName, notifyContext) { + // the observer list for the notification under inspection + const observers = this.observerMap[notificationName]; + // find the observer for the notifyContext + for (let i = 0; i < observers.length; i++) { + if (observers[i].compareNotifyContext(notifyContext)) { + // there can only be one Observer for a given notifyContext + // in any given Observer list, so remove it and break + observers.splice(i, 1); + break; + } + } + // Also, when a Notification's Observer list length falls to + // zero, delete the notification key from the observer map + if (observers.length == 0) { + delete this.observerMap[notificationName]; + } + } + /** + * Register a `Mediator` instance with the `View`. + * + * Registers the `Mediator` so that it can be retrieved by name, + * and further interrogates the `Mediator` for its + * `Notification` interests. + * + * If the `Mediator` returns any `Notification` + * names to be notified about, an `Observer` is created encapsulating + * the `Mediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `Notifications` the + * `Mediator` is interested in. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator) { + // do not allow re-registration (you must to removeMediator fist) + if (this.mediatorMap[mediator.name] != null) + return; + // Register the Mediator for retrieval by name + this.mediatorMap[mediator.name] = mediator; + // Get Notification interests, if any. + const interests = mediator.listNotificationInterests(); + // Register Mediator as an observer for each notification of interests + if (interests.length > 0) { + // Create Observer referencing this mediator's handleNotification method + const observer = new Observer(mediator.handleNotification, mediator); + // Register Mediator as Observer for its list of Notification interests + for (let i = 0; i < interests.length; i++) { + this.registerObserver(interests[i], observer); + } + } + // alert the mediator that it has been registered + mediator.onRegister(); + } + /** + * Retrieve a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName) { + return this.mediatorMap[mediatorName] || null; + } + /** + * Check if a Mediator is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator with the specified name is registered; otherwise, `false`. + */ + hasMediator(mediatorName) { + return this.mediatorMap[mediatorName] != null; + } + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to be removed. + * @returns {IMediator | null} The removed mediator instance, or `null` if no mediator with the given name was found. + */ + removeMediator(mediatorName) { + // Retrieve the named mediator + const mediator = this.mediatorMap[mediatorName]; + if (mediator == null) + return null; + // for every notification this mediator is interested in... + const interests = mediator.listNotificationInterests(); + for (let i = 0; i < interests.length; i++) { + // remove the observer linking the mediator + // to the notification interest + this.removeObserver(interests[i], mediator); + } + // remove the mediator from the map + delete this.mediatorMap[mediatorName]; + // alert the mediator that it has been removed + mediator.onRemove(); + return mediator; + } +} +/** Message Constants + * @type {string} */ +View.SINGLETON_MSG = "View Singleton already constructed!"; diff --git a/bin/esm/index.js b/bin/esm/index.js new file mode 100644 index 0000000..501d571 --- /dev/null +++ b/bin/esm/index.js @@ -0,0 +1,18 @@ +// +// index.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export { Controller } from "./core/Controller"; +export { Model } from "./core/Model"; +export { View } from "./core/View"; +export { MacroCommand } from "./patterns/command/MacroCommand"; +export { SimpleCommand } from "./patterns/command/SimpleCommand"; +export { Facade } from "./patterns/facade/Facade"; +export { Mediator } from "./patterns/mediator/Mediator"; +export { Notification } from "./patterns/observer/Notification"; +export { Notifier } from "./patterns/observer/Notifier"; +export { Observer } from "./patterns/observer/Observer"; +export { Proxy } from "./patterns/proxy/Proxy"; diff --git a/bin/esm/interfaces/ICommand.js b/bin/esm/interfaces/ICommand.js new file mode 100644 index 0000000..1901952 --- /dev/null +++ b/bin/esm/interfaces/ICommand.js @@ -0,0 +1,8 @@ +// +// ICommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IController.js b/bin/esm/interfaces/IController.js new file mode 100644 index 0000000..54a4da6 --- /dev/null +++ b/bin/esm/interfaces/IController.js @@ -0,0 +1,8 @@ +// +// IController.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IFacade.js b/bin/esm/interfaces/IFacade.js new file mode 100644 index 0000000..111ca7a --- /dev/null +++ b/bin/esm/interfaces/IFacade.js @@ -0,0 +1,8 @@ +// +// IFacade.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IMediator.js b/bin/esm/interfaces/IMediator.js new file mode 100644 index 0000000..2914bb6 --- /dev/null +++ b/bin/esm/interfaces/IMediator.js @@ -0,0 +1,8 @@ +// +// IMediator.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IModel.js b/bin/esm/interfaces/IModel.js new file mode 100644 index 0000000..f47847e --- /dev/null +++ b/bin/esm/interfaces/IModel.js @@ -0,0 +1,8 @@ +// +// IModel.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/INotification.js b/bin/esm/interfaces/INotification.js new file mode 100644 index 0000000..d08ee67 --- /dev/null +++ b/bin/esm/interfaces/INotification.js @@ -0,0 +1,8 @@ +// +// INotification.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/INotifier.js b/bin/esm/interfaces/INotifier.js new file mode 100644 index 0000000..7549339 --- /dev/null +++ b/bin/esm/interfaces/INotifier.js @@ -0,0 +1,8 @@ +// +// INotifier.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IObserver.js b/bin/esm/interfaces/IObserver.js new file mode 100644 index 0000000..e0402aa --- /dev/null +++ b/bin/esm/interfaces/IObserver.js @@ -0,0 +1,8 @@ +// +// IObserver.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IProxy.js b/bin/esm/interfaces/IProxy.js new file mode 100644 index 0000000..725848e --- /dev/null +++ b/bin/esm/interfaces/IProxy.js @@ -0,0 +1,8 @@ +// +// IProxy.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/interfaces/IView.js b/bin/esm/interfaces/IView.js new file mode 100644 index 0000000..305677b --- /dev/null +++ b/bin/esm/interfaces/IView.js @@ -0,0 +1,8 @@ +// +// IView.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +export {}; diff --git a/bin/esm/patterns/command/MacroCommand.js b/bin/esm/patterns/command/MacroCommand.js new file mode 100644 index 0000000..dde866a --- /dev/null +++ b/bin/esm/patterns/command/MacroCommand.js @@ -0,0 +1,103 @@ +// +// MacroCommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { SimpleCommand } from "./SimpleCommand"; +/** + * A base `Command` implementation that executes other `Command`s. + * + * A `MacroCommand` maintains a list of + * `Command` Class references called `SubCommands`. + * + * When `execute` is called, the `MacroCommand` + * instantiates and calls `execute` on each of its `SubCommands` turn. + * Each `SubCommand` will be passed a reference to the original + * `Notification` that was passed to the `MacroCommand`'s + * `execute` method. + * + * Unlike `SimpleCommand`, your subclass + * should not override `execute`, but instead, should + * override the `initializeMacroCommand` method, + * calling `addSubCommand` once for each `SubCommand` + * to be executed. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link SimpleCommand} + * + * @class MacroCommand + * @extends Notifier + */ +export class MacroCommand extends SimpleCommand { + /** + * Constructor. + * + * You should not need to define a constructor, + * instead, override the `initializeMacroCommand` + * method. + * + * If your subclass does define a constructor, be + * sure to call `super()`. + * + */ + constructor() { + super(); + this.subCommands = []; + this.initializeMacroCommand(); + } + /** + * Initialize the `MacroCommand`. + * + * In your subclass, override this method to + * initialize the `MacroCommand`'s `SubCommand` + * list with `Command` class references like + * this: + * + * ```ts + * // Initialize MyMacroCommand + * initializeMacroCommand() { + * this.addSubCommand(() => new app.FirstCommand()); + * this.addSubCommand(() => new app.SecondCommand()); + * this.addSubCommand(() => new app.ThirdCommand()); + * } + * ``` + * + * Note that `SubCommand`s may be any `Command` implementor, + * `MacroCommand`s or `SimpleCommands` are both acceptable. + */ + initializeMacroCommand() { + } + /** + * Add a `SubCommand`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {() => ICommand} factory - A factory function that creates an instance of ICommand. This function will be used to generate the sub-command. + * @returns {void} + */ + addSubCommand(factory) { + this.subCommands.push(factory); + } + /** + * Execute this `MacroCommand`'s `SubCommands`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification) { + while (this.subCommands.length > 0) { + const factory = this.subCommands.shift(); + const command = factory === null || factory === void 0 ? void 0 : factory(); + if (command) { + command.execute(notification); + } + } + } +} diff --git a/bin/esm/patterns/command/SimpleCommand.js b/bin/esm/patterns/command/SimpleCommand.js new file mode 100644 index 0000000..e063eea --- /dev/null +++ b/bin/esm/patterns/command/SimpleCommand.js @@ -0,0 +1,36 @@ +// +// SimpleCommand.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Notifier } from "../observer/Notifier"; +/** + * A base `Command` implementation. + * + * Your subclass should override the `execute` + * method where your business logic will handle the `Notification`. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link MacroCommand} + * + * @class SimpleCommand + * @extends Notifier + */ +export class SimpleCommand extends Notifier { + /** + * Fulfill the use-case initiated by the given `Notification`. + * + * In the Command Pattern, an application use-case typically + * begins with some user action, which results in a `Notification` being broadcast, which + * is handled by business logic in the `execute` method of an + * `Command`. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification) { + } +} diff --git a/bin/esm/patterns/facade/Facade.js b/bin/esm/patterns/facade/Facade.js new file mode 100644 index 0000000..c511166 --- /dev/null +++ b/bin/esm/patterns/facade/Facade.js @@ -0,0 +1,280 @@ +// +// Facade.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Controller } from "../../core/Controller"; +import { Model } from "../../core/Model"; +import { View } from "../../core/View"; +import { Notification } from "../observer/Notification"; +/** + * A base Singleton `Facade` implementation. + * + * @see {@link Model} + * @see {@link View} + * @see {@link Controller} + * + * @class Facade + */ +export class Facade { + /** + * Constructor. + * + * This `Facade` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Factory method, + * passing the unique key for this instance + * `Facade.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor() { + if (Facade.instance != null) + throw Error(Facade.SINGLETON_MSG); + Facade.instance = this; + this.initializeFacade(); + } + /** + * Initialize the Singleton `Facade` instance. + * + * Called automatically by the constructor. Override in your + * subclass to do any subclass specific initializations. Be + * sure to call `super.initializeFacade()`, though. + * + * @returns {void} + */ + initializeFacade() { + this.initializeModel(); + this.initializeController(); + this.initializeView(); + } + /** + * Facade Singleton Factory method + * + * @param {(key: string) => IFacade} factory - A factory function that creates a new instance of the facade. + * @returns {IFacade} the Singleton instance of the Facade + */ + static getInstance(factory) { + if (Facade.instance == null) + Facade.instance = factory(); + return Facade.instance; + } + /** + * Initialize the `Model`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Model`. + * - You have `Proxy`s to register with the Model that do not + * retrieve a reference to the Facade at construction time.` + * + * If you don't want to initialize a different `Model`, + * call `super.initializeModel()` at the beginning of your + * method, then register `Proxy`s. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Proxy`s + * with the `Model`, since `Proxy`s with mutable data will likely + * need to send `Notification`s and thus will likely want to fetch a reference to + * the `Facade` during their construction. + * + * @returns {void} + */ + initializeModel() { + this.model = Model.getInstance(() => new Model()); + } + /** + * Initialize the `Controller`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Controller`. + * - You have `Commands` to register with the `Controller` at startup.`. + * + * If you don't want to initialize a different `Controller`, + * call `super.initializeController()` at the beginning of your + * method, then register `Command`s. + * + * @returns {void} + */ + initializeController() { + this.controller = Controller.getInstance(() => new Controller()); + } + /** + * Initialize the `View`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `View`. + * - You have `Observers` to register with the `View` + * + * If you don't want to initialize a different `View`, + * call `super.initializeView()` at the beginning of your + * method, then register `Mediator` instances. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Mediator`s + * with the `View`, since `Mediator` instances will need to send + * `Notification`s and thus will likely want to fetch a reference + * to the `Facade` during their construction. + * + * @returns {void} + */ + initializeView() { + this.view = View.getInstance(() => new View()); + } + /** + * Register a `Command` with the `Controller` by Notification name. * + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of ICommand. This function is used to create the command. + * @returns {void} + */ + registerCommand(notificationName, factory) { + var _a; + (_a = this.controller) === null || _a === void 0 ? void 0 : _a.registerCommand(notificationName, factory); + } + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification; otherwise, `false`. + */ + hasCommand(notificationName) { + var _a, _b; + return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.hasCommand(notificationName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a previously registered `Command` to `Notification` mapping from the Controller. + * + * @param {string} notificationName - The name of the notification for which the command should be removed. + * @returns {void} + */ + removeCommand(notificationName) { + var _a; + (_a = this.controller) === null || _a === void 0 ? void 0 : _a.removeCommand(notificationName); + } + /** + * Register a `Proxy` with the `Model` by name. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy) { + var _a; + (_a = this.model) === null || _a === void 0 ? void 0 : _a.registerProxy(proxy); + } + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.retrieveProxy(proxyName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered for the name; otherwise, `false`. + */ + hasProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.hasProxy(proxyName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed proxy instance, or `null` if no such proxy exists. + */ + removeProxy(proxyName) { + var _a, _b; + return (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.removeProxy(proxyName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Register a `Mediator` with the `View`. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator) { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.registerMediator(mediator); + } + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.retrieveMediator(mediatorName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered for the name; otherwise, `false`. + */ + hasMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.hasMediator(mediatorName)) !== null && _b !== void 0 ? _b : false; + } + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance, or `null` if no such mediator exists. + */ + removeMediator(mediatorName) { + var _a, _b; + return (_b = (_a = this.view) === null || _a === void 0 ? void 0 : _a.removeMediator(mediatorName)) !== null && _b !== void 0 ? _b : null; + } + /** + * Notify `Observer`s. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - The notification to be sent to observers. + * @returns {void} + */ + notifyObservers(notification) { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.notifyObservers(notification); + } + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName, body, type) { + this.notifyObservers(new Notification(notificationName, body, type)); + } +} +/** Message Constants + * @type {string} */ +Facade.SINGLETON_MSG = "Facade Singleton already constructed!"; diff --git a/bin/esm/patterns/mediator/Mediator.js b/bin/esm/patterns/mediator/Mediator.js new file mode 100644 index 0000000..6691376 --- /dev/null +++ b/bin/esm/patterns/mediator/Mediator.js @@ -0,0 +1,95 @@ +// +// Mediator.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Notifier } from "../observer/Notifier"; +/** + * A base `Mediator` implementation. + * + * @see {@link View} + * + * @class Mediator + * @extends Notifier + */ +export class Mediator extends Notifier { + /** + * Constructor. + * + * @param {string} [name] - Optional name for the mediator. Defaults to `Mediator.NAME`. + * @param {any} [viewComponent] - Optional view component associated with the mediator. + */ + constructor(name, viewComponent) { + super(); + this._name = name || Mediator.NAME; + this._viewComponent = viewComponent; + } + /** + * Called by the View when the Mediator is registered + * + * @returns {void} + */ + onRegister() { + } + /** + * Called by the View when the Mediator is removed + * + * @returns {void} + */ + onRemove() { + } + /** + * List the `Notification` names this + * `Mediator` is interested in being notified of. + * + * @returns {string[]} An array of notification names. + */ + listNotificationInterests() { + return []; + } + /** + * Handle `Notification`s. + * + * Typically, this will be handled in a switch statement, + * with one 'case' entry per `Notification` + * the `Mediator` is interested in. + * + * @param {INotification} notification - The notification to handle. + * @returns {void} + */ + handleNotification(notification) { + } + /** + * the mediator name + * + * @returns {string} The name of the mediator. + */ + get name() { + return this._name; + } + /** + * Get the `Mediator`'s view component. + * + * Additionally, an implicit getter will usually + * be defined in the subclass that casts the view + * object to a type, like this: + * + * @returns {any} The view component. + */ + get viewComponent() { + return this._viewComponent; + } + /** + * Set the `Mediator`'s view component. + * + * @param {any} value - The new view component. + */ + set viewComponent(value) { + this._viewComponent = value; + } +} +/** The default name for the mediator. + * @type {string} */ +Mediator.NAME = "Mediator"; diff --git a/bin/esm/patterns/observer/Notification.js b/bin/esm/patterns/observer/Notification.js new file mode 100644 index 0000000..2af6b95 --- /dev/null +++ b/bin/esm/patterns/observer/Notification.js @@ -0,0 +1,103 @@ +// +// Notification.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +/** + * A base `Notification` implementation. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The Observer Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * Notifications are not meant to be a replacement for Events + * in Flex/Flash/Apollo. Generally, `Mediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notification`s to + * trigger `Command`s or to communicate with other `Mediators`. `Proxy` and `Command` + * instances communicate with each other and `Mediator`s + * by broadcasting `Notification`s. + * + * A key difference between Flash `Event`s and PureMVC + * `Notification`s is that `Event`s follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the `Event`, while + * PureMVC `Notification`s follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notification`s. + * + * @class Notification + */ +export class Notification { + /** + * Constructor. + * + * @param {string} name - The name of the notification. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + */ + constructor(name, body, type) { + this._name = name; + this._body = body; + this._type = type; + } + /** + * Get the name of the `Notification` instance. + * + * @returns {string} The name of the notification. + */ + get name() { + return this._name; + } + /** + * Get the body of the `Notification` instance. + * + * @returns {any} The body of the notification. + */ + get body() { + return this._body; + } + /** + * Set the body of the `Notification` instance. + * + * @param {any} value - The new body to be set for the notification. + */ + set body(value) { + this._body = value; + } + /** + * Get the type of the `Notification` instance. + * + * @returns {string | undefined} The type of the notification, or `undefined` if not set. + */ + get type() { + return this._type; + } + /** + * Set the type of the `Notification` instance. + * + * @param {string | undefined} value - The new type to be set for the notification. + */ + set type(value) { + this._type = value; + } + /** + * Get the string representation of the `Notification` instance. + * + * @returns {string} A string representation of the notification. + */ + toString() { + var _a; + let msg = `Notification Name: ${this.name}`; + msg += `\nBody: ${this.body ? this.body : "null"}`; + msg += `\nType: ${(_a = this.type) !== null && _a !== void 0 ? _a : "null"}`; + return msg; + } +} diff --git a/bin/esm/patterns/observer/Notifier.js b/bin/esm/patterns/observer/Notifier.js new file mode 100644 index 0000000..43d0e06 --- /dev/null +++ b/bin/esm/patterns/observer/Notifier.js @@ -0,0 +1,57 @@ +// +// Notifier.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Facade } from "../facade/Facade"; +/** + * A Base `Notifier` implementation. + * + * `MacroCommand, Command, Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `Notifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @see {@link Proxy} + * @see {@link Facade} + * @see {@link Mediator} + * @see {@link MacroCommand} + * @see {@link SimpleCommand} + * + * @class Notifier + */ +export class Notifier { + constructor() { + /** + * Return the Singleton Facade instance + * + * @returns {IFacade} The facade instance. + */ + this.facade = Facade.getInstance(() => new Facade()); + } + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new Notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName, body, type) { + this.facade.sendNotification(notificationName, body, type); + } +} diff --git a/bin/esm/patterns/observer/Observer.js b/bin/esm/patterns/observer/Observer.js new file mode 100644 index 0000000..23f81ca --- /dev/null +++ b/bin/esm/patterns/observer/Observer.js @@ -0,0 +1,91 @@ +// +// Observer.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +/** + * A base `Observer` implementation. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a method that should + * be called when a particular `Notification` is broadcast. + * + * In PureMVC, the `Observer` class assumes these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * - Encapsulate the notification context (this) of the interested object. + * - Provide methods for setting the notification method and context. + * - Provide a method for notifying the interested object. + * + * @class Observer + */ +export class Observer { + /** + * Constructor. + * + * The notification method on the interested object should take + * one parameter of type `Notification` + * + * @param {((notification: INotification) => void) | null} notify - The method to be called when a notification is received. Can be `null`. + * @param {any | null} context - The context in which to call the `notifyMethod`. Can be `null`. + */ + constructor(notify, context) { + this._notifyMethod = notify; + this._notifyContext = context; + } + /** + * Get the notification method. + * + * @returns {((notification: INotification) => void) | null} The current method or `null` if no method is set. + */ + get notifyMethod() { + return this._notifyMethod; + } + /** + * Set the notification method. + * + * The notification method should take one parameter of type `Notification`. + * + * @param {((notification: INotification) => void) | null} value - The method to set for handling notifications. Can be `null`. + */ + set notifyMethod(value) { + this._notifyMethod = value; + } + /** + * Get the notifyContext + * + * @returns {any | null} The current context or `null` if no context is set. + */ + get notifyContext() { + return this._notifyContext; + } + /** + * Set the notification context. + * + * @param {any | null} value - The context to set. Can be `null`. + */ + set notifyContext(value) { + this._notifyContext = value; + } + /** + * Notify the interested object. + * + * @param {INotification} notification - The notification to send to the observer. + * @returns {void} + */ + notifyObserver(notification) { + var _a; + (_a = this.notifyMethod) === null || _a === void 0 ? void 0 : _a.call(this.notifyContext, notification); + } + /** + * Compare an object to the notification context. + * + * @param {any} object - The object to compare with the observer's context. + * @returns {boolean} `true` if the context is the same, otherwise `false`. + */ + compareNotifyContext(object) { + return object == this.notifyContext; + } +} diff --git a/bin/esm/patterns/proxy/Proxy.js b/bin/esm/patterns/proxy/Proxy.js new file mode 100644 index 0000000..5d42dc2 --- /dev/null +++ b/bin/esm/patterns/proxy/Proxy.js @@ -0,0 +1,86 @@ +// +// Proxy.ts +// PureMVC TypeScript Multicore +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// +import { Notifier } from "../observer/Notifier"; +/** + * A base `Proxy` implementation. + * + * In PureMVC, `Proxy` classes are used to manage parts of the + * application's data model. + * + * A `Proxy` might simply manage a reference to a local data object, + * in which case interacting with it might involve setting and + * getting of its data in synchronous fashion. + * + * `Proxy` classes are also used to encapsulate the application's + * interaction with remote services to save or retrieve data, in which case, + * we adopt an asynchronous idiom; setting data (or calling a method) on the + * `Proxy` and listening for a `Notification` to be sent + * when the `Proxy` has retrieved the data from the service. + * + * @see {@link Model} + * + * @class Proxy + * @extends Notifier + */ +export class Proxy extends Notifier { + /** + * Constructor + * + * @param {string} [name] - The name of the proxy. Defaults to `Proxy.NAME` if not provided. + * @param {any} [data] - The data associated with the proxy. Can be `null`. + */ + constructor(name, data) { + super(); + this._name = name || Proxy.NAME; + this._data = data; + } + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + onRegister() { + } + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + onRemove() { + } + /** + * Get the proxy name + * + * @returns {string} The name of the proxy. + */ + get name() { + return this._name; + } + /** + * Get the data object + * + * @returns {any} The current data or `undefined` if no data is set. + */ + get data() { + return this._data; + } + /** + * Set the data object + * + * @param {any} value - The data to set. Can be `null`. + */ + set data(value) { + this._data = value; + } +} +/** + * The default name for the Proxy. + * + * @type {string} + */ +Proxy.NAME = "Proxy"; diff --git a/bin/puremvc-typescript-standard-1.0-min.js b/bin/puremvc-typescript-standard-1.0-min.js deleted file mode 100644 index 717918b..0000000 --- a/bin/puremvc-typescript-standard-1.0-min.js +++ /dev/null @@ -1,17 +0,0 @@ -if(typeof define==="function"){define("puremvc",[],function(){var b;(function(d){var c=(function(){function e(f,g){this.notify=null;this.context=null;this.setNotifyMethod(f);this.setNotifyContext(g)}e.prototype.getNotifyMethod=function(){return this.notify};e.prototype.setNotifyMethod=function(f){this.notify=f};e.prototype.getNotifyContext=function(){return this.context};e.prototype.setNotifyContext=function(f){this.context=f};e.prototype.notifyObserver=function(f){this.getNotifyMethod().call(this.getNotifyContext(),f) -};e.prototype.compareNotifyContext=function(f){return f===this.context};return e})();d.Observer=c})(b||(b={}));var b;(function(c){var d=(function(){function f(){this.mediatorMap=null;this.observerMap=null;if(f.instance){throw Error(f.SINGLETON_MSG)}f.instance=this;this.mediatorMap={};this.observerMap={};this.initializeView()}f.prototype.initializeView=function(){};f.prototype.registerObserver=function(h,g){var i=this.observerMap[h];if(i){i.push(g)}else{this.observerMap[h]=[g]}};f.prototype.removeObserver=function(k,j){var l=this.observerMap[k]; -var h=l.length;while(h--){var g=l[h];if(g.compareNotifyContext(j)){l.splice(h,1);break}}if(l.length==0){delete this.observerMap[k]}};f.prototype.notifyObservers=function(l){var k=l.getName();var n=this.observerMap[k];if(n){var m=n.slice(0);var g=m.length;for(var j=0;j0){var h=new c.Observer(l.handleNotification,l); -for(var k=0;k 0) { - var observer = new puremvc.Observer(mediator.handleNotification, mediator); - for(var i = 0; i < len; i++) { - this.registerObserver(interests[i], observer); - } - } - mediator.onRegister(); - }; - View.prototype.retrieveMediator = function (mediatorName) { - return this.mediatorMap[mediatorName] || null; - }; - View.prototype.removeMediator = function (mediatorName) { - var mediator = this.mediatorMap[mediatorName]; - if(!mediator) { - return null; - } - var interests = mediator.listNotificationInterests(); - var i = interests.length; - while(i--) { - this.removeObserver(interests[i], mediator); - } - delete this.mediatorMap[mediatorName]; - mediator.onRemove(); - return mediator; - }; - View.prototype.hasMediator = function (mediatorName) { - return this.mediatorMap[mediatorName] != null; - }; - View.SINGLETON_MSG = "View singleton already constructed!"; - View.instance = null; - View.getInstance = function getInstance() { - if(!View.instance) { - View.instance = new View(); - } - return View.instance; - } - return View; - })(); - puremvc.View = View; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Controller = (function () { - function Controller() { - this.view = null; - this.commandMap = null; - if(Controller.instance) { - throw Error(Controller.SINGLETON_MSG); - } - Controller.instance = this; - this.commandMap = { - }; - this.initializeController(); - } - Controller.prototype.initializeController = function () { - this.view = puremvc.View.getInstance(); - }; - Controller.prototype.executeCommand = function (notification) { - var commandClassRef = this.commandMap[notification.getName()]; - if(commandClassRef) { - var command = new commandClassRef(); - command.execute(notification); - } - }; - Controller.prototype.registerCommand = function (notificationName, commandClassRef) { - if(!this.commandMap[notificationName]) { - this.view.registerObserver(notificationName, new puremvc.Observer(this.executeCommand, this)); - } - this.commandMap[notificationName] = commandClassRef; - }; - Controller.prototype.hasCommand = function (notificationName) { - return this.commandMap[notificationName] != null; - }; - Controller.prototype.removeCommand = function (notificationName) { - if(this.hasCommand(notificationName)) { - this.view.removeObserver(notificationName, this); - delete this.commandMap[notificationName]; - } - }; - Controller.instance = null; - Controller.SINGLETON_MSG = "Controller singleton already constructed!"; - Controller.getInstance = function getInstance() { - if(!Controller.instance) { - Controller.instance = new Controller(); - } - return Controller.instance; - } - return Controller; - })(); - puremvc.Controller = Controller; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Model = (function () { - function Model() { - this.proxyMap = null; - if(Model.instance) { - throw Error(Model.SINGLETON_MSG); - } - Model.instance = this; - this.proxyMap = { - }; - this.initializeModel(); - } - Model.prototype.initializeModel = function () { - }; - Model.prototype.registerProxy = function (proxy) { - this.proxyMap[proxy.getProxyName()] = proxy; - proxy.onRegister(); - }; - Model.prototype.removeProxy = function (proxyName) { - var proxy = this.proxyMap[proxyName]; - if(proxy) { - delete this.proxyMap[proxyName]; - proxy.onRemove(); - } - return proxy; - }; - Model.prototype.retrieveProxy = function (proxyName) { - return this.proxyMap[proxyName] || null; - }; - Model.prototype.hasProxy = function (proxyName) { - return this.proxyMap[proxyName] != null; - }; - Model.SINGLETON_MSG = "Model singleton already constructed!"; - Model.instance = null; - Model.getInstance = function getInstance() { - if(!Model.instance) { - Model.instance = new Model(); - } - return Model.instance; - } - return Model; - })(); - puremvc.Model = Model; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Notification = (function () { - function Notification(name, body, type) { - if (typeof body === "undefined") { body = null; } - if (typeof type === "undefined") { type = null; } - this.name = null; - this.body = null; - this.type = null; - this.name = name; - this.body = body; - this.type = type; - } - Notification.prototype.getName = function () { - return this.name; - }; - Notification.prototype.setBody = function (body) { - this.body = body; - }; - Notification.prototype.getBody = function () { - return this.body; - }; - Notification.prototype.setType = function (type) { - this.type = type; - }; - Notification.prototype.getType = function () { - return this.type; - }; - Notification.prototype.toString = function () { - var msg = "Notification Name: " + this.getName(); - msg += "\nBody:" + ((this.getBody() == null) ? "null" : this.getBody().toString()); - msg += "\nType:" + ((this.getType() == null) ? "null" : this.getType()); - return msg; - }; - return Notification; - })(); - puremvc.Notification = Notification; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Facade = (function () { - function Facade() { - this.model = null; - this.view = null; - this.controller = null; - if(Facade.instance) { - throw Error(Facade.SINGLETON_MSG); - } - Facade.instance = this; - this.initializeFacade(); - } - Facade.prototype.initializeFacade = function () { - this.initializeModel(); - this.initializeController(); - this.initializeView(); - }; - Facade.prototype.initializeModel = function () { - if(!this.model) { - this.model = puremvc.Model.getInstance(); - } - }; - Facade.prototype.initializeController = function () { - if(!this.controller) { - this.controller = puremvc.Controller.getInstance(); - } - }; - Facade.prototype.initializeView = function () { - if(!this.view) { - this.view = puremvc.View.getInstance(); - } - }; - Facade.prototype.registerCommand = function (notificationName, commandClassRef) { - this.controller.registerCommand(notificationName, commandClassRef); - }; - Facade.prototype.removeCommand = function (notificationName) { - this.controller.removeCommand(notificationName); - }; - Facade.prototype.hasCommand = function (notificationName) { - return this.controller.hasCommand(notificationName); - }; - Facade.prototype.registerProxy = function (proxy) { - this.model.registerProxy(proxy); - }; - Facade.prototype.retrieveProxy = function (proxyName) { - return this.model.retrieveProxy(proxyName); - }; - Facade.prototype.removeProxy = function (proxyName) { - var proxy; - if(this.model) { - proxy = this.model.removeProxy(proxyName); - } - return proxy; - }; - Facade.prototype.hasProxy = function (proxyName) { - return this.model.hasProxy(proxyName); - }; - Facade.prototype.registerMediator = function (mediator) { - if(this.view) { - this.view.registerMediator(mediator); - } - }; - Facade.prototype.retrieveMediator = function (mediatorName) { - return this.view.retrieveMediator(mediatorName); - }; - Facade.prototype.removeMediator = function (mediatorName) { - var mediator; - if(this.view) { - mediator = this.view.removeMediator(mediatorName); - } - return mediator; - }; - Facade.prototype.hasMediator = function (mediatorName) { - return this.view.hasMediator(mediatorName); - }; - Facade.prototype.notifyObservers = function (notification) { - if(this.view) { - this.view.notifyObservers(notification); - } - }; - Facade.prototype.sendNotification = function (name, body, type) { - if (typeof body === "undefined") { body = null; } - if (typeof type === "undefined") { type = null; } - this.notifyObservers(new puremvc.Notification(name, body, type)); - }; - Facade.SINGLETON_MSG = "Facade singleton already constructed!"; - Facade.instance = null; - Facade.getInstance = function getInstance() { - if(!Facade.instance) { - Facade.instance = new Facade(); - } - return Facade.instance; - } - return Facade; - })(); - puremvc.Facade = Facade; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Notifier = (function () { - function Notifier() { - this.facade = null; - this.facade = puremvc.Facade.getInstance(); - } - Notifier.prototype.sendNotification = function (name, body, type) { - if (typeof body === "undefined") { body = null; } - if (typeof type === "undefined") { type = null; } - this.facade.sendNotification(name, body, type); - }; - return Notifier; - })(); - puremvc.Notifier = Notifier; - })(puremvc || (puremvc = {})); - - var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); - } - var puremvc; - (function (puremvc) { - "use strict"; - var MacroCommand = (function (_super) { - __extends(MacroCommand, _super); - function MacroCommand() { - _super.call(this); - this.subCommands = null; - this.subCommands = new Array(); - this.initializeMacroCommand(); - } - MacroCommand.prototype.initializeMacroCommand = function () { - }; - MacroCommand.prototype.addSubCommand = function (commandClassRef) { - this.subCommands.push(commandClassRef); - }; - MacroCommand.prototype.execute = function (notification) { - var subCommands = this.subCommands.slice(0); - var len = this.subCommands.length; - for(var i = 0; i < len; i++) { - var commandClassRef = subCommands[i]; - var commandInstance = new commandClassRef(); - commandInstance.execute(notification); - } - this.subCommands.splice(0); - }; - return MacroCommand; - })(puremvc.Notifier); - puremvc.MacroCommand = MacroCommand; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var SimpleCommand = (function (_super) { - __extends(SimpleCommand, _super); - function SimpleCommand() { - _super.apply(this, arguments); - - } - SimpleCommand.prototype.execute = function (notification) { - }; - return SimpleCommand; - })(puremvc.Notifier); - puremvc.SimpleCommand = SimpleCommand; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Mediator = (function (_super) { - __extends(Mediator, _super); - function Mediator(mediatorName, viewComponent) { - if (typeof mediatorName === "undefined") { mediatorName = null; } - if (typeof viewComponent === "undefined") { viewComponent = null; } - _super.call(this); - this.mediatorName = null; - this.viewComponent = null; - this.mediatorName = (mediatorName != null) ? mediatorName : Mediator.NAME; - this.viewComponent = viewComponent; - } - Mediator.prototype.getMediatorName = function () { - return this.mediatorName; - }; - Mediator.prototype.getViewComponent = function () { - return this.viewComponent; - }; - Mediator.prototype.setViewComponent = function (viewComponent) { - this.viewComponent = viewComponent; - }; - Mediator.prototype.listNotificationInterests = function () { - return new Array(); - }; - Mediator.prototype.handleNotification = function (notification) { - }; - Mediator.prototype.onRegister = function () { - }; - Mediator.prototype.onRemove = function () { - }; - Mediator.NAME = 'Mediator'; - return Mediator; - })(puremvc.Notifier); - puremvc.Mediator = Mediator; - })(puremvc || (puremvc = {})); - - var puremvc; - (function (puremvc) { - "use strict"; - var Proxy = (function (_super) { - __extends(Proxy, _super); - function Proxy(proxyName, data) { - if (typeof proxyName === "undefined") { proxyName = null; } - if (typeof data === "undefined") { data = null; } - _super.call(this); - this.proxyName = null; - this.data = null; - this.proxyName = (proxyName != null) ? proxyName : Proxy.NAME; - if(data != null) { - this.setData(data); - } - } - Proxy.prototype.getProxyName = function () { - return this.proxyName; - }; - Proxy.prototype.setData = function (data) { - this.data = data; - }; - Proxy.prototype.getData = function () { - return this.data; - }; - Proxy.prototype.onRegister = function () { - }; - Proxy.prototype.onRemove = function () { - }; - Proxy.NAME = "Proxy"; - return Proxy; - })(puremvc.Notifier); - puremvc.Proxy = Proxy; - })(puremvc || (puremvc = {})); - - - return puremvc; - }); -} \ No newline at end of file diff --git a/bin/types/core/Controller.d.ts b/bin/types/core/Controller.d.ts new file mode 100644 index 0000000..8b21dcc --- /dev/null +++ b/bin/types/core/Controller.d.ts @@ -0,0 +1,133 @@ +import { IController } from "../interfaces/IController"; +import { IView } from "../interfaces/IView"; +import { ICommand } from "../interfaces/ICommand"; +import { INotification } from "../interfaces/INotification"; +/** + * A Singleton `Controller` implementation. + * + * In PureMVC, the `Controller` class follows the + * 'Command and Controller' strategy, and assumes these + * responsibilities: + * + * + * - Remembering which `Command`s + * are intended to handle which `Notifications`. + * - Registering itself as an `Observer` with + * the `View` for each `Notification` + * that it has a `Command` mapping for. + * - Creating a new instance of the proper `Command` + * to handle a given `Notification` when notified by the `View`. + * - Calling the `Command`'s `execute` + * method, passing in the `Notification`. + * + * + * Your application must register `Commands` with the + * Controller. + * + * The simplest way is to subclass `Facade`, + * and use its `initializeController` method to add your + * registrations. + * + * @see {@link View} + * @see {@link Observer} + * @see {@link Notification} + * @see {@link SimpleCommand} + * @see {@link MacroCommand} + * + * @class Controller + */ +export declare class Controller implements IController { + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string; + /** + * Singleton instance + * + * @type {IController} + * @protected + */ + protected static instance: IController; + /** Local reference to View + * @type {IView | undefined} */ + protected view?: IView; + /** Mapping of Notification names to Command factories + * @type {{ [key: string]: () => ICommand }} */ + protected commandMap: { + [key: string]: () => ICommand; + }; + /** + * Constructor. + * + * This `Controller` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton Factory method, + * `Controller.getInstance()` + * + * @throws {Error} Error if instance for this Singleton has already been constructed + */ + constructor(); + /** + * Initialize the Singleton `Controller` instance. + * + * Called automatically by the constructor. + * + * Note that if you are using a subclass of `View` + * in your application, you should also subclass `Controller` + * and override the `initializeController` method in the + * following way: + * + * ```ts + * // ensure that the Controller is talking to my View implementation + * initializeController() { + * this.view = MyView.getInstance(() => new View()); + * } + * ``` + * @returns {void} + */ + protected initializeController(): void; + /** + * `Controller` Singleton Factory method. + * + * @param {() => IController} factory - A factory function that creates a new instance of the controller if one does not already exist. + * @returns {IController} the Singleton instance of `Controller`. + */ + static getInstance(factory: () => IController): IController; + /** + * Register a particular `Command` class as the handler + * for a particular `Notification`. + * + * If an `Command` has already been registered to + * handle `Notification`s with this name, it is no longer + * used, the new `Command` is used instead. + * + * The Observer for the new Command is only created if this the + * first time a Command has been registered for this Notification name. + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of the command. + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + /** + * If a `Command` has previously been registered + * to handle the given `Notification`, then it is executed. + * + * @param {INotification} notification - The notification containing the data or command details needed for execution. + * @returns {void} + */ + executeCommand(notification: INotification): void; + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check for a registered command. + * @returns {boolean} `true` if a command is registered for the specified notification name; otherwise, `false`. + */ + hasCommand(notificationName: string): boolean; + /** + * Remove a previously registered `Command` to `Notification` mapping. + * + * @param {string} notificationName - The name of the notification for which the associated command should be removed. + * @returns {void} + */ + removeCommand(notificationName: string): void; +} diff --git a/bin/types/core/Model.d.ts b/bin/types/core/Model.d.ts new file mode 100644 index 0000000..5eb78b7 --- /dev/null +++ b/bin/types/core/Model.d.ts @@ -0,0 +1,98 @@ +import { IModel } from "../interfaces/IModel"; +import { IProxy } from "../interfaces/IProxy"; +/** + * A Singleton `Model` implementation. + * + * In PureMVC, the `Model` class provides + * access to model objects (Proxies) by named lookup. + * + * The `Model` assumes these responsibilities: + * + * - Maintain a cache of `Proxy` instances. + * - Provide methods for registering, retrieving, and removing + * `Proxy` instances. + * + * Your application must register `Proxy` instances + * with the `Model`. Typically, you use an + * `Command` to create and register `Proxy` + * instances once the `Facade` has initialized the Core + * actors. + * + * @see {@link Proxy} + * + * @class Model + */ +export declare class Model implements IModel { + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string; + /** + * Singleton instance + * + * @type {IModel} + * @protected + */ + protected static instance: IModel; + /** Mapping of proxyNames to IProxy instances + * @type {{ [key: string]: IProxy }} */ + protected proxyMap: { + [key: string]: IProxy; + }; + /** + * Constructor. + * + * This `Model` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `Model.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor(); + /** + * Initialize the `Model` instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + protected initializeModel(): void; + /** + * `Model` Singleton Factory method. + * + * @param {() => IModel} factory - A factory function that creates a new instance of the model if one does not already exist. + * @returns {IModel} The Singleton instance. + */ + static getInstance(factory: () => IModel): IModel; + /** + * Register a `Proxy` with the `Model`. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + /** + * Retrieve a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName: string): IProxy | null; + /** + * Check if a Proxy is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy with the specified name is registered; otherwise, `false`. + */ + hasProxy(proxyName: string): boolean; + /** + * Remove a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to be removed. + * @returns {IProxy | null} The removed proxy instance, or `null` if no proxy with the given name was found. + */ + removeProxy(proxyName: string): IProxy | null; +} diff --git a/bin/types/core/View.d.ts b/bin/types/core/View.d.ts new file mode 100644 index 0000000..5924ae2 --- /dev/null +++ b/bin/types/core/View.d.ts @@ -0,0 +1,140 @@ +import { IView } from "../interfaces/IView"; +import { IMediator } from "../interfaces/IMediator"; +import { IObserver } from "../interfaces/IObserver"; +import { INotification } from "../interfaces/INotification"; +/** + * A Singleton `View` implementation. + * + * In PureMVC, the `View` class assumes these responsibilities: + * + * - Maintain a cache of `Mediator` instances. + * - Provide methods for registering, retrieving, and removing `Mediators`. + * - Notifying `Mediators` when they are registered or removed. + * - Managing the observer lists for each `Notification` in the application. + * - Providing a method for attaching `Observers` to a `Notification`'s observer list. + * - Providing a method for broadcasting a `Notification`. + * - Notifying the `Observers` of a given `Notification` when it broadcast. + * + * @see {@link Mediator} + * @see {@link Observer} + * @see {@link Notification} + * + * @class View + */ +export declare class View implements IView { + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string; + /** + * Singleton instance + * + * @type {IView} + * @protected + */ + protected static instance: IView; + /** Mapping of Mediator names to Mediator instances + * @type {{ [key: string]: IMediator }} */ + protected mediatorMap: { + [key: string]: IMediator; + }; + /** Mapping of Notification names to Observer lists + * @type {{ [key: string]: IObserver[] }} */ + protected observerMap: { + [key: string]: IObserver[]; + }; + /** + * Constructor. + * + * This `View` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `View.getInstance()` + * + * @throws {Error} Error if instance for this Singleton key has already been constructed + */ + constructor(); + /** + * Initialize the Singleton View instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + private initializeView; + /** + * View Singleton factory method. + * + * @param {() => IView} factory - A factory function that creates a new instance of the view if one does not already exist. + * @returns {IView} The view instance. + */ + static getInstance(factory: () => IView): IView; + /** + * Register an `Observer` to be notified + * of `Notifications` with a given name. + * + * @param {string} notificationName - The name of the notification to which the observer should be registered. + * @param {IObserver} observer - The observer instance to be registered. + * @returns {void} + */ + registerObserver(notificationName: string, observer: IObserver): void; + /** + * Notify the `Observers` for a particular `Notification`. + * + * All previously attached `Observers` for this `Notification`'s + * list are notified and are passed a reference to the `Notification` in + * the order in which they were registered. + * + * @param {INotification} notification - The notification containing the data or command details to be sent to observers. + * @returns {void} + */ + notifyObservers(notification: INotification): void; + /** + * Remove the observer for a given notifyContext from an observer list for a given Notification name. + * + * @param {string} notificationName - The name of the notification for which the observer should be removed. + * @param {object} notifyContext - The context of the observer to be removed. + * @returns {void} + */ + removeObserver(notificationName: string, notifyContext: object): void; + /** + * Register a `Mediator` instance with the `View`. + * + * Registers the `Mediator` so that it can be retrieved by name, + * and further interrogates the `Mediator` for its + * `Notification` interests. + * + * If the `Mediator` returns any `Notification` + * names to be notified about, an `Observer` is created encapsulating + * the `Mediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `Notifications` the + * `Mediator` is interested in. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + /** + * Retrieve a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName: string): IMediator | null; + /** + * Check if a Mediator is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator with the specified name is registered; otherwise, `false`. + */ + hasMediator(mediatorName: string): boolean; + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to be removed. + * @returns {IMediator | null} The removed mediator instance, or `null` if no mediator with the given name was found. + */ + removeMediator(mediatorName: string): IMediator | null; +} diff --git a/bin/types/index.d.ts b/bin/types/index.d.ts new file mode 100644 index 0000000..e00756d --- /dev/null +++ b/bin/types/index.d.ts @@ -0,0 +1,21 @@ +export type { IController } from "./interfaces/IController"; +export type { IModel } from "./interfaces/IModel"; +export type { IView } from "./interfaces/IView"; +export type { ICommand } from "./interfaces/ICommand"; +export type { IFacade } from "./interfaces/IFacade"; +export type { IMediator } from "./interfaces/IMediator"; +export type { INotification } from "./interfaces/INotification"; +export type { INotifier } from "./interfaces/INotifier"; +export type { IObserver } from "./interfaces/IObserver"; +export type { IProxy } from "./interfaces/IProxy"; +export { Controller } from "./core/Controller"; +export { Model } from "./core/Model"; +export { View } from "./core/View"; +export { MacroCommand } from "./patterns/command/MacroCommand"; +export { SimpleCommand } from "./patterns/command/SimpleCommand"; +export { Facade } from "./patterns/facade/Facade"; +export { Mediator } from "./patterns/mediator/Mediator"; +export { Notification } from "./patterns/observer/Notification"; +export { Notifier } from "./patterns/observer/Notifier"; +export { Observer } from "./patterns/observer/Observer"; +export { Proxy } from "./patterns/proxy/Proxy"; diff --git a/bin/types/interfaces/ICommand.d.ts b/bin/types/interfaces/ICommand.d.ts new file mode 100644 index 0000000..0d5ff7f --- /dev/null +++ b/bin/types/interfaces/ICommand.d.ts @@ -0,0 +1,19 @@ +import { INotifier } from "./INotifier"; +import { INotification } from "./INotification"; +/** + * The interface definition for a PureMVC Command. + * + * @see {@link INotification} + * + * @interface ICommand + * @extends {INotifier} + */ +export interface ICommand extends INotifier { + /** + * Execute the `ICommand`'s logic to handle a given `INotification`. + * + * @param {INotification} notification - The notification carrying the data and type necessary for executing the command. + * @returns {void} + */ + execute(notification: INotification): void; +} diff --git a/bin/types/interfaces/IController.d.ts b/bin/types/interfaces/IController.d.ts new file mode 100644 index 0000000..b50de86 --- /dev/null +++ b/bin/types/interfaces/IController.d.ts @@ -0,0 +1,52 @@ +import { ICommand } from "./ICommand"; +import { INotification } from "./INotification"; +/** + * `IController` The interface definition for a PureMVC `Controller`. + * + * In PureMVC, an `IController` implementor + * follows the 'Command and Controller' strategy, and + * assumes these responsibilities: + * + * - Remembering which `ICommands` are intended to handle which `INotifications`. + * + * - Registering itself as an `IObserver` with the View for each `INotification` that it has an `ICommand` mapping for. + * + * - Creating a new instance of the proper `ICommand` to handle a given `INotification` when notified by the `View`. + * + * - Calling the `ICommand`'s execute method, passing in the `INotification`. + * + * @interface IController + */ +export interface IController { + /** + * Register a particular `ICommand` class as the handler + * for a particular INotification. + * + * @param {string} notificationName - the name of the `INotification` + * @param {() => ICommand} factory - A factory that returns `ICommand` + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + /** + * Execute the `ICommand` previously registered as the + * handler for `INotifications` with the given notification name. + * + * @param {INotification} notification - the `INotification` to execute the associated `ICommand` for + * @returns {void} + */ + executeCommand(notification: INotification): void; + /** + * Check if a `Command` is registered for a given `Notification` + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification name, `false` otherwise. + */ + hasCommand(notificationName: string): boolean; + /** + * Remove a previously registered `ICommand` to `INotification` mapping. + * + * @param {string} notificationName - the name of the INotification to remove the ICommand mapping for + * @returns {void} + */ + removeCommand(notificationName: string): void; +} diff --git a/bin/types/interfaces/IFacade.d.ts b/bin/types/interfaces/IFacade.d.ts new file mode 100644 index 0000000..c239e71 --- /dev/null +++ b/bin/types/interfaces/IFacade.d.ts @@ -0,0 +1,114 @@ +import { INotifier } from "./INotifier"; +import { ICommand } from "./ICommand"; +import { IMediator } from "./IMediator"; +import { INotification } from "./INotification"; +import { IProxy } from "./IProxy"; +/** + * `IFacade` The interface definition for a PureMVC `Facade`. + * + * The `Facade` Pattern suggests providing a single + * class to act as a central point of communication + * for a subsystem. + * + * In PureMVC, the `Facade` acts as an interface between + * the core MVC actors (`Model`, `View`, `Controller`) and + * the rest of your application. + * + * @interface IFacade + * @extends {INotifier} + */ +export interface IFacade extends INotifier { + /** + * Register an `ICommand` with the `Controller` + * + * @param {string} notificationName - the name of the `INotification` to associate the `ICommand` with. + * @param {() => ICommand} factory - A factory that creates an instance of the `ICommand` to be registered. + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + /** + * Check if a `ICommand` is registered for a given `Notification` + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification name, `false` otherwise. + */ + hasCommand(notificationName: string): boolean; + /** + * Remove a previously registered `ICommand` to `INotification` mapping from the `Controller`. + * + * @param {string} notificationName - the name of the `INotification` to remove the `ICommand` mapping for + * @returns {void} + */ + removeCommand(notificationName: string): void; + /** + * Register an `IProxy` with the `Model` by name. + * + * @param {IProxy} proxy - the IProxy to be registered with the Model. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + /** + * Retrieve a `IProxy` from the `Model` by name. + * + * @param {string} proxyName - the name of the `IProxy` instance to be retrieved. + * @returns {IProxy | null} the `IProxy` previously registered by `proxyName` with the `Model`. + */ + retrieveProxy(proxyName: string): IProxy | null; + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered with the name, `false` otherwise. + */ + hasProxy(proxyName: string): boolean; + /** + * Remove an `IProxy` instance from the `Model` by name. + * + * @param {string} proxyName - the `IProxy` to remove from the `Model`. + * @returns {IProxy | null} The removed proxy instance if found, or `null` if no proxy was registered with the given name. + */ + removeProxy(proxyName: string): IProxy | null; + /** + * Register an `IMediator` instance with the `View`. + * + * @param {IMediator} mediator - a reference to the `IMediator` instance + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + /** + * Retrieve an `IMediator` instance from the `View`. + * + * @param {string} mediatorName - the name of the `IMediator` instance to retrieve + * @returns {IMediator | null} The mediator instance if found, or `null` if no mediator is registered with the given name. + */ + retrieveMediator(mediatorName: string): IMediator | null; + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered with the name, `false` otherwise. + */ + hasMediator(mediatorName: string): boolean; + /** + * Remove a `IMediator` instance from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance if found, or `null` if no mediator was registered with the given name. + */ + removeMediator(mediatorName: string): IMediator | null; + /** + * Notify Observers. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - the `INotification` to have the `View` notify `Observers` of. + * @returns {void} + */ + notifyObservers(notification: INotification): void; +} diff --git a/bin/types/interfaces/IMediator.d.ts b/bin/types/interfaces/IMediator.d.ts new file mode 100644 index 0000000..999e382 --- /dev/null +++ b/bin/types/interfaces/IMediator.d.ts @@ -0,0 +1,74 @@ +import { INotifier } from "./INotifier"; +import { INotification } from "./INotification"; +/** + * `IMediator` The interface definition for a PureMVC `Mediator`. + * + * In PureMVC, `IMediator` implementors assume these responsibilities: + * + * - Implement a common method which returns a list of all `INotifications` the `IMediator` has interest in. + * + * - Implement a notification callback method. + * + * - Implement methods that are called when the `IMediator` is registered or removed from the View. + * + * Additionally, `IMediators` typically: + * + * - Act as an intermediary between one or more view components such as text boxes or list controls, maintaining references and coordinating their behavior. + * + * - In Flash-based apps, this is often the place where event listeners are added to view components, and their handlers implemented. + * + * - Respond to and generate `INotifications`, interacting with of the rest of the PureMVC app. + * + * When an `IMediator` is registered with the `IView`, + * the `IView` will call the `IMediator`'s + * `listNotificationInterests` method. The `IMediator` will + * return an Array of `INotification` names which + * it wishes to be notified about. + * + * The `IView` will then create an `Observer` object + * encapsulating that `IMediator`'s (`handleNotification`) method + * and register it as an `Observer` for each `INotification` name returned by + * `listNotificationInterests`. + * + * @interface IMediator + * @extends {INotifier} + */ +export interface IMediator extends INotifier { + /** + * The name of the mediator. + * + * @type {string} + */ + readonly name: string; + /** + * The view component associated with the mediator. + * + * @type {any} + */ + viewComponent: any; + /** + * Called by the View when the `Mediator` is registered + * + * @returns {void} + */ + onRegister(): void; + /** + * Called by the View when the `Mediator` is removed + * + * @returns {void} + */ + onRemove(): void; + /** + * List `INotification` interests. + * + * @returns {string[]} an Array of the `INotification` names this `IMediator` has an interest in. + */ + listNotificationInterests(): string[]; + /** + * Handle an `INotification`. + * + * @param {INotification} notification - the `INotification` to be handled + * @returns {void} + */ + handleNotification(notification: INotification): void; +} diff --git a/bin/types/interfaces/IModel.d.ts b/bin/types/interfaces/IModel.d.ts new file mode 100644 index 0000000..7d013a1 --- /dev/null +++ b/bin/types/interfaces/IModel.d.ts @@ -0,0 +1,45 @@ +import { IProxy } from "./IProxy"; +/** + * `IModel` The interface definition for a PureMVC `Model`. + * + * In PureMVC, `IModel` implementors provide + * access to `IProxy` objects by named lookup. + * + * An `IModel` assumes these responsibilities: + * + * - Maintain a cache of `IProxy` instances + * + * - Provide methods for registering, retrieving, and removing `IProxy` instances + * + * @interface IModel + */ +export interface IModel { + /** + * Register an `IProxy` instance with the `Model`. + * + * @param {IProxy} proxy - an object reference to be held by the `Model`. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + /** + * Retrieve an `IProxy` instance from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The `IProxy` if registered, otherwise null. + */ + retrieveProxy(proxyName: string): IProxy | null; + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} True if the `IProxy` is registered, otherwise false. + */ + hasProxy(proxyName: string): boolean; + /** + * Remove an `IProxy` instance from the `Model`. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed `IProxy` if found, otherwise null. + */ + removeProxy(proxyName: string): IProxy | null; +} diff --git a/bin/types/interfaces/INotification.d.ts b/bin/types/interfaces/INotification.d.ts new file mode 100644 index 0000000..a864ac2 --- /dev/null +++ b/bin/types/interfaces/INotification.d.ts @@ -0,0 +1,56 @@ +/** + * `INotification` The interface definition for a PureMVC `Notification`. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The `Observer` Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * `Notifications` are not meant to be a replacement for Events + * in Flex/Flash/AIR. Generally, `IMediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notifications` to + * trigger `ICommands` or to communicate with other `IMediators`. `IProxy` and `ICommand` + * instances communicate with each other and `IMediators` + * by broadcasting `INotifications`. + * + * A key difference between Flash Events and PureMVC + * `Notifications` is that Events follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the Event, while + * PureMVC `Notifications` follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notifications`. + * + * @interface INotification + */ +export interface INotification { + /** + * The name of the notification. + * + * @type {string} + */ + readonly name: string; + /** + * The body of the notification. + * + * @type {any} + */ + body?: any; + /** + * The type of the notification. + * + * @type {string} + */ + type?: string; + /** + * Get the string representation of the `INotification` instance + * + * @returns {string} A string representation of the notification. + */ + toString(): string; +} diff --git a/bin/types/interfaces/INotifier.d.ts b/bin/types/interfaces/INotifier.d.ts new file mode 100644 index 0000000..2388037 --- /dev/null +++ b/bin/types/interfaces/INotifier.d.ts @@ -0,0 +1,33 @@ +/** + * `INotifier` The interface definition for a PureMVC `Notifier`. + * + * `MacroCommand`, `Command`, `Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `INotifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, also provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @interface INotifier + */ +export interface INotifier { + /** + * Send a `INotification`. + * + * Convenience method to prevent having to construct new + * notification instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to send. + * @param {any} [body] - Optional data associated with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName: string, body?: any, type?: string): void; +} diff --git a/bin/types/interfaces/IObserver.d.ts b/bin/types/interfaces/IObserver.d.ts new file mode 100644 index 0000000..dd5123f --- /dev/null +++ b/bin/types/interfaces/IObserver.d.ts @@ -0,0 +1,64 @@ +import { INotification } from "./INotification"; +/** + * `IObserver` The interface definition for a PureMVC `Observer`. + * + * In PureMVC, `IObserver` implementors assume these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * + * - Encapsulate the notification context (self) of the interested object. + * + * - Provide methods for setting the interested object notification method and context. + * + * - Provide a method for notifying the interested object. + * + * PureMVC does not rely upon underlying event + * models such as the one provided with Flash, + * and ActionScript 3 does not have an inherent + * event model. + * + * The `Observer` Pattern as implemented within + * PureMVC exists to support event driven communication + * between the application and the actors of the + * MVC triad. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a notification method that + * should be called when an `INotification` is broadcast. + * The Observer then acts as a proxy for notifying the interested object. + * + * Observers can receive Notifications by having their + * `notifyObserver` method invoked, passing + * in an object implementing the `INotification` interface, such + * as a subclass of `Notification`. + * + * @interface IObserver + */ +export interface IObserver { + /** + * The method to be called when a notification is received. + * + * @type {((notification: INotification) => void) | null} + */ + notifyMethod?: ((notification: INotification) => void) | null; + /** + * The context in which the notification method should be called. + * + * @type {any | null} + */ + notifyContext?: any | null; + /** + * Notify the interested object. + * + * @param {INotification} notification - the `INotification` to pass to the interested object's notification method + * @returns {void} + */ + notifyObserver(notification: INotification): void; + /** + * Compare the given object to the notification context object. + * + * @param {any} object - The object to compare with the `notifyContext`. + * @returns {boolean} `true` if the object is the same as the `notifyContext`, otherwise `false`. + */ + compareNotifyContext(object: any): boolean; +} diff --git a/bin/types/interfaces/IProxy.d.ts b/bin/types/interfaces/IProxy.d.ts new file mode 100644 index 0000000..9021103 --- /dev/null +++ b/bin/types/interfaces/IProxy.d.ts @@ -0,0 +1,51 @@ +import { INotifier } from "./INotifier"; +/** + * `IProxy` The interface definition for a PureMVC `Proxy`. + * + * In PureMVC, `IProxy` implementors assume these responsibilities: + * + * - Implement a common method which returns the name of the Proxy. + * + * - Provide methods for setting and getting the data object. + * + * Additionally, `IProxy`ies typically: + * + * - Maintain references to one or more pieces of model data. + * + * - Provide methods for manipulating that data. + * + * - Generate `INotifications` when their model data changes. + * + * - Expose their name as a public static const called `NAME`, if they are not instantiated multiple times. + * + * - Encapsulate interaction with local or remote services used to fetch and persist model data. + * + * @interface IProxy + * @extends INotifier + */ +export interface IProxy extends INotifier { + /** + * The name of the proxy. + * + * @type {string} + */ + readonly name: string; + /** + * The data associated with the proxy. + * + * @type {any} + */ + data?: any; + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + onRegister(): void; + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + onRemove(): void; +} diff --git a/bin/types/interfaces/IView.d.ts b/bin/types/interfaces/IView.d.ts new file mode 100644 index 0000000..72f2737 --- /dev/null +++ b/bin/types/interfaces/IView.d.ts @@ -0,0 +1,90 @@ +import { IMediator } from "./IMediator"; +import { INotification } from "./INotification"; +import { IObserver } from "./IObserver"; +/** + * `IView` The interface definition for a PureMVC `View`. + * + * In PureMVC, the View class assumes these responsibilities: + * + * - Maintain a cache of `IMediator` instances. + * + * - Provide methods for registering, retrieving, and removing `IMediators`. + * + * - Managing the observer lists for each `INotification` in the application. + * + * - Providing a method for attaching `IObservers` to an `INotification`'s observer list. + * + * - Providing a method for broadcasting an `INotification`. + * + * - Notifying the `IObservers` of a given `INotification` when it is broadcast. + * + * @interface IView + */ +export interface IView { + /** + * Register an `IObserver` to be notified + * of `INotifications` with a given name. + * + * @param {string} notificationName - The name of the notification to register the observer for. + * @param {IObserver} observer - The observer to be registered. + * @returns {void} + */ + registerObserver(notificationName: string, observer: IObserver): void; + /** + * Notify the `IObservers` for a particular `INotification`. + * + * All previously attached `IObservers` for this `INotification`'s + * list are notified and are passed a reference to the `INotification` in + * the order in which they were registered. + * + * @param {INotification} notification - the `INotification` to notify `IObservers` of. + * @returns {void} + */ + notifyObservers(notification: INotification): void; + /** + * Remove a group of observers from the observer list for a given Notification name. + * + * @param {string} notificationName - which observer list to remove from + * @param {any} notifyContext - removed the observers with this object as their `notifyContext` + * @returns {void} + */ + removeObserver(notificationName: string, notifyContext: any): void; + /** + * Register an `IMediator` instance with the View. + * + * Registers the `IMediator` so that it can be retrieved by name, + * and further interrogates the `IMediator` for its + * `INotification` interests. + * + * If the `IMediator` returns any `INotification` + * names to be notified about, an `Observer` is created encapsulating + * the `IMediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `INotifications` the + * `IMediator` is interested in. + * + * @param {IMediator} mediator - The `IMediator` to be registered. + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + /** + * Retrieve an `IMediator` from the View. + * + * @param {string} mediatorName - the name of the `IMediator` instance to retrieve. + * @returns {IMediator | null} The `IMediator` associated with the given name, or `null` if not found. + */ + retrieveMediator(mediatorName: string): IMediator | null; + /** + * Check if a `IMediator` is registered or not + * + * @param {string} mediatorName - The name of the `IMediator` to check. + * @returns {boolean} `true` if the `IMediator` is registered, otherwise `false`. + */ + hasMediator(mediatorName: string): boolean; + /** + * Remove an `IMediator` from the View. + * + * @param {string} mediatorName - name of the `IMediator` instance to be removed. + * @returns {IMediator | null} The removed `IMediator`, or `null` if not found. + */ + removeMediator(mediatorName: string): IMediator | null; +} diff --git a/bin/types/patterns/command/MacroCommand.d.ts b/bin/types/patterns/command/MacroCommand.d.ts new file mode 100644 index 0000000..e520a5f --- /dev/null +++ b/bin/types/patterns/command/MacroCommand.d.ts @@ -0,0 +1,86 @@ +import { ICommand } from "../../interfaces/ICommand"; +import { INotification } from "../../interfaces/INotification"; +import { SimpleCommand } from "./SimpleCommand"; +/** + * A base `Command` implementation that executes other `Command`s. + * + * A `MacroCommand` maintains a list of + * `Command` Class references called `SubCommands`. + * + * When `execute` is called, the `MacroCommand` + * instantiates and calls `execute` on each of its `SubCommands` turn. + * Each `SubCommand` will be passed a reference to the original + * `Notification` that was passed to the `MacroCommand`'s + * `execute` method. + * + * Unlike `SimpleCommand`, your subclass + * should not override `execute`, but instead, should + * override the `initializeMacroCommand` method, + * calling `addSubCommand` once for each `SubCommand` + * to be executed. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link SimpleCommand} + * + * @class MacroCommand + * @extends Notifier + */ +export declare class MacroCommand extends SimpleCommand { + /** An array of functions, each of which returns an instance of ICommand. + * @type {(() => ICommand)[]} */ + private subCommands; + /** + * Constructor. + * + * You should not need to define a constructor, + * instead, override the `initializeMacroCommand` + * method. + * + * If your subclass does define a constructor, be + * sure to call `super()`. + * + */ + constructor(); + /** + * Initialize the `MacroCommand`. + * + * In your subclass, override this method to + * initialize the `MacroCommand`'s `SubCommand` + * list with `Command` class references like + * this: + * + * ```ts + * // Initialize MyMacroCommand + * initializeMacroCommand() { + * this.addSubCommand(() => new app.FirstCommand()); + * this.addSubCommand(() => new app.SecondCommand()); + * this.addSubCommand(() => new app.ThirdCommand()); + * } + * ``` + * + * Note that `SubCommand`s may be any `Command` implementor, + * `MacroCommand`s or `SimpleCommands` are both acceptable. + */ + initializeMacroCommand(): void; + /** + * Add a `SubCommand`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {() => ICommand} factory - A factory function that creates an instance of ICommand. This function will be used to generate the sub-command. + * @returns {void} + */ + protected addSubCommand(factory: () => ICommand): void; + /** + * Execute this `MacroCommand`'s `SubCommands`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification: INotification): void; +} diff --git a/bin/types/patterns/command/SimpleCommand.d.ts b/bin/types/patterns/command/SimpleCommand.d.ts new file mode 100644 index 0000000..47a80f0 --- /dev/null +++ b/bin/types/patterns/command/SimpleCommand.d.ts @@ -0,0 +1,30 @@ +import { ICommand } from "../../interfaces/ICommand"; +import { INotification } from "../../interfaces/INotification"; +import { Notifier } from "../observer/Notifier"; +/** + * A base `Command` implementation. + * + * Your subclass should override the `execute` + * method where your business logic will handle the `Notification`. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link MacroCommand} + * + * @class SimpleCommand + * @extends Notifier + */ +export declare class SimpleCommand extends Notifier implements ICommand { + /** + * Fulfill the use-case initiated by the given `Notification`. + * + * In the Command Pattern, an application use-case typically + * begins with some user action, which results in a `Notification` being broadcast, which + * is handled by business logic in the `execute` method of an + * `Command`. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + execute(notification: INotification): void; +} diff --git a/bin/types/patterns/facade/Facade.d.ts b/bin/types/patterns/facade/Facade.d.ts new file mode 100644 index 0000000..f35cc10 --- /dev/null +++ b/bin/types/patterns/facade/Facade.d.ts @@ -0,0 +1,236 @@ +import { IController } from "../../interfaces/IController"; +import { IModel } from "../../interfaces/IModel"; +import { IView } from "../../interfaces/IView"; +import { ICommand } from "../../interfaces/ICommand"; +import { IFacade } from "../../interfaces/IFacade"; +import { IMediator } from "../../interfaces/IMediator"; +import { INotification } from "../../interfaces/INotification"; +import { IProxy } from "../../interfaces/IProxy"; +/** + * A base Singleton `Facade` implementation. + * + * @see {@link Model} + * @see {@link View} + * @see {@link Controller} + * + * @class Facade + */ +export declare class Facade implements IFacade { + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string; + /** + * Singleton instance + * + * @type {IFacade} + * @protected + */ + protected static instance: IFacade; + /** Reference to Controller + * @type {IController | undefined} */ + protected controller?: IController; + /** Reference to Model + * @type {IModel | undefined} */ + protected model?: IModel; + /** Reference to View + * @type {IView | undefined} */ + protected view?: IView; + /** + * Constructor. + * + * This `Facade` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Factory method, + * passing the unique key for this instance + * `Facade.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + constructor(); + /** + * Initialize the Singleton `Facade` instance. + * + * Called automatically by the constructor. Override in your + * subclass to do any subclass specific initializations. Be + * sure to call `super.initializeFacade()`, though. + * + * @returns {void} + */ + protected initializeFacade(): void; + /** + * Facade Singleton Factory method + * + * @param {(key: string) => IFacade} factory - A factory function that creates a new instance of the facade. + * @returns {IFacade} the Singleton instance of the Facade + */ + static getInstance(factory: () => IFacade): IFacade; + /** + * Initialize the `Model`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Model`. + * - You have `Proxy`s to register with the Model that do not + * retrieve a reference to the Facade at construction time.` + * + * If you don't want to initialize a different `Model`, + * call `super.initializeModel()` at the beginning of your + * method, then register `Proxy`s. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Proxy`s + * with the `Model`, since `Proxy`s with mutable data will likely + * need to send `Notification`s and thus will likely want to fetch a reference to + * the `Facade` during their construction. + * + * @returns {void} + */ + protected initializeModel(): void; + /** + * Initialize the `Controller`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Controller`. + * - You have `Commands` to register with the `Controller` at startup.`. + * + * If you don't want to initialize a different `Controller`, + * call `super.initializeController()` at the beginning of your + * method, then register `Command`s. + * + * @returns {void} + */ + protected initializeController(): void; + /** + * Initialize the `View`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `View`. + * - You have `Observers` to register with the `View` + * + * If you don't want to initialize a different `View`, + * call `super.initializeView()` at the beginning of your + * method, then register `Mediator` instances. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Mediator`s + * with the `View`, since `Mediator` instances will need to send + * `Notification`s and thus will likely want to fetch a reference + * to the `Facade` during their construction. + * + * @returns {void} + */ + protected initializeView(): void; + /** + * Register a `Command` with the `Controller` by Notification name. * + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of ICommand. This function is used to create the command. + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification; otherwise, `false`. + */ + hasCommand(notificationName: string): boolean; + /** + * Remove a previously registered `Command` to `Notification` mapping from the Controller. + * + * @param {string} notificationName - The name of the notification for which the command should be removed. + * @returns {void} + */ + removeCommand(notificationName: string): void; + /** + * Register a `Proxy` with the `Model` by name. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + retrieveProxy(proxyName: string): IProxy | null; + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered for the name; otherwise, `false`. + */ + hasProxy(proxyName: string): boolean; + /** + * Remove a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed proxy instance, or `null` if no such proxy exists. + */ + removeProxy(proxyName: string): IProxy | null; + /** + * Register a `Mediator` with the `View`. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + retrieveMediator(mediatorName: string): IMediator | null; + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered for the name; otherwise, `false`. + */ + hasMediator(mediatorName: string): boolean; + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance, or `null` if no such mediator exists. + */ + removeMediator(mediatorName: string): IMediator | null; + /** + * Notify `Observer`s. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - The notification to be sent to observers. + * @returns {void} + */ + notifyObservers(notification: INotification): void; + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName: string, body?: any, type?: string): void; +} diff --git a/bin/types/patterns/mediator/Mediator.d.ts b/bin/types/patterns/mediator/Mediator.d.ts new file mode 100644 index 0000000..f95c0cd --- /dev/null +++ b/bin/types/patterns/mediator/Mediator.d.ts @@ -0,0 +1,81 @@ +import { IMediator } from "../../interfaces/IMediator"; +import { INotification } from "../../interfaces/INotification"; +import { Notifier } from "../observer/Notifier"; +/** + * A base `Mediator` implementation. + * + * @see {@link View} + * + * @class Mediator + * @extends Notifier + */ +export declare class Mediator extends Notifier implements IMediator { + /** The default name for the mediator. + * @type {string} */ + static NAME: string; + /** the mediator name + @type {string} */ + protected readonly _name: string; + /** The view component + * @type {any} */ + protected _viewComponent?: any; + /** + * Constructor. + * + * @param {string} [name] - Optional name for the mediator. Defaults to `Mediator.NAME`. + * @param {any} [viewComponent] - Optional view component associated with the mediator. + */ + constructor(name?: string, viewComponent?: any); + /** + * Called by the View when the Mediator is registered + * + * @returns {void} + */ + onRegister(): void; + /** + * Called by the View when the Mediator is removed + * + * @returns {void} + */ + onRemove(): void; + /** + * List the `Notification` names this + * `Mediator` is interested in being notified of. + * + * @returns {string[]} An array of notification names. + */ + listNotificationInterests(): string[]; + /** + * Handle `Notification`s. + * + * Typically, this will be handled in a switch statement, + * with one 'case' entry per `Notification` + * the `Mediator` is interested in. + * + * @param {INotification} notification - The notification to handle. + * @returns {void} + */ + handleNotification(notification: INotification): void; + /** + * the mediator name + * + * @returns {string} The name of the mediator. + */ + get name(): string; + /** + * Get the `Mediator`'s view component. + * + * Additionally, an implicit getter will usually + * be defined in the subclass that casts the view + * object to a type, like this: + * + * @returns {any} The view component. + */ + get viewComponent(): any; + /** + * Set the `Mediator`'s view component. + * + * @param {any} value - The new view component. + */ + set viewComponent(value: any); +} diff --git a/bin/types/patterns/observer/Notification.d.ts b/bin/types/patterns/observer/Notification.d.ts new file mode 100644 index 0000000..3ca60d6 --- /dev/null +++ b/bin/types/patterns/observer/Notification.d.ts @@ -0,0 +1,86 @@ +import { INotification } from "../../interfaces/INotification"; +/** + * A base `Notification` implementation. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The Observer Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * Notifications are not meant to be a replacement for Events + * in Flex/Flash/Apollo. Generally, `Mediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notification`s to + * trigger `Command`s or to communicate with other `Mediators`. `Proxy` and `Command` + * instances communicate with each other and `Mediator`s + * by broadcasting `Notification`s. + * + * A key difference between Flash `Event`s and PureMVC + * `Notification`s is that `Event`s follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the `Event`, while + * PureMVC `Notification`s follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notification`s. + * + * @class Notification + */ +export declare class Notification implements INotification { + /** the name of the notification instance + * @type {string} */ + private readonly _name; + /** the body of the notification instance + * @type {any} */ + private _body?; + /** + * @type {string | undefined } */ + private _type?; + /** + * Constructor. + * + * @param {string} name - The name of the notification. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + */ + constructor(name: string, body?: any, type?: string); + /** + * Get the name of the `Notification` instance. + * + * @returns {string} The name of the notification. + */ + get name(): string; + /** + * Get the body of the `Notification` instance. + * + * @returns {any} The body of the notification. + */ + get body(): any; + /** + * Set the body of the `Notification` instance. + * + * @param {any} value - The new body to be set for the notification. + */ + set body(value: any); + /** + * Get the type of the `Notification` instance. + * + * @returns {string | undefined} The type of the notification, or `undefined` if not set. + */ + get type(): string | undefined; + /** + * Set the type of the `Notification` instance. + * + * @param {string | undefined} value - The new type to be set for the notification. + */ + set type(value: string | undefined); + /** + * Get the string representation of the `Notification` instance. + * + * @returns {string} A string representation of the notification. + */ + toString(): string; +} diff --git a/bin/types/patterns/observer/Notifier.d.ts b/bin/types/patterns/observer/Notifier.d.ts new file mode 100644 index 0000000..3760fd1 --- /dev/null +++ b/bin/types/patterns/observer/Notifier.d.ts @@ -0,0 +1,47 @@ +import { INotifier } from "../../interfaces/INotifier"; +import { IFacade } from "../../interfaces/IFacade"; +/** + * A Base `Notifier` implementation. + * + * `MacroCommand, Command, Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `Notifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @see {@link Proxy} + * @see {@link Facade} + * @see {@link Mediator} + * @see {@link MacroCommand} + * @see {@link SimpleCommand} + * + * @class Notifier + */ +export declare class Notifier implements INotifier { + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new Notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName: string, body?: any, type?: string): void; + /** + * Return the Singleton Facade instance + * + * @returns {IFacade} The facade instance. + */ + protected facade: IFacade; +} diff --git a/bin/types/patterns/observer/Observer.d.ts b/bin/types/patterns/observer/Observer.d.ts new file mode 100644 index 0000000..dc21316 --- /dev/null +++ b/bin/types/patterns/observer/Observer.d.ts @@ -0,0 +1,72 @@ +import { IObserver } from "../../interfaces/IObserver"; +import { INotification } from "../../interfaces/INotification"; +/** + * A base `Observer` implementation. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a method that should + * be called when a particular `Notification` is broadcast. + * + * In PureMVC, the `Observer` class assumes these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * - Encapsulate the notification context (this) of the interested object. + * - Provide methods for setting the notification method and context. + * - Provide a method for notifying the interested object. + * + * @class Observer + */ +export declare class Observer implements IObserver { + private _notifyMethod?; + private _notifyContext?; + /** + * Constructor. + * + * The notification method on the interested object should take + * one parameter of type `Notification` + * + * @param {((notification: INotification) => void) | null} notify - The method to be called when a notification is received. Can be `null`. + * @param {any | null} context - The context in which to call the `notifyMethod`. Can be `null`. + */ + constructor(notify?: ((notification: INotification) => void) | null, context?: any | null); + /** + * Get the notification method. + * + * @returns {((notification: INotification) => void) | null} The current method or `null` if no method is set. + */ + get notifyMethod(): ((notification: INotification) => void) | null | undefined; + /** + * Set the notification method. + * + * The notification method should take one parameter of type `Notification`. + * + * @param {((notification: INotification) => void) | null} value - The method to set for handling notifications. Can be `null`. + */ + set notifyMethod(value: ((notification: INotification) => void) | null); + /** + * Get the notifyContext + * + * @returns {any | null} The current context or `null` if no context is set. + */ + get notifyContext(): any | null; + /** + * Set the notification context. + * + * @param {any | null} value - The context to set. Can be `null`. + */ + set notifyContext(value: any | null); + /** + * Notify the interested object. + * + * @param {INotification} notification - The notification to send to the observer. + * @returns {void} + */ + notifyObserver(notification: INotification): void; + /** + * Compare an object to the notification context. + * + * @param {any} object - The object to compare with the observer's context. + * @returns {boolean} `true` if the context is the same, otherwise `false`. + */ + compareNotifyContext(object: any): boolean; +} diff --git a/bin/types/patterns/proxy/Proxy.d.ts b/bin/types/patterns/proxy/Proxy.d.ts new file mode 100644 index 0000000..61d0f91 --- /dev/null +++ b/bin/types/patterns/proxy/Proxy.d.ts @@ -0,0 +1,74 @@ +import { IProxy } from "../../interfaces/IProxy"; +import { Notifier } from "../observer/Notifier"; +/** + * A base `Proxy` implementation. + * + * In PureMVC, `Proxy` classes are used to manage parts of the + * application's data model. + * + * A `Proxy` might simply manage a reference to a local data object, + * in which case interacting with it might involve setting and + * getting of its data in synchronous fashion. + * + * `Proxy` classes are also used to encapsulate the application's + * interaction with remote services to save or retrieve data, in which case, + * we adopt an asynchronous idiom; setting data (or calling a method) on the + * `Proxy` and listening for a `Notification` to be sent + * when the `Proxy` has retrieved the data from the service. + * + * @see {@link Model} + * + * @class Proxy + * @extends Notifier + */ +export declare class Proxy extends Notifier implements IProxy { + /** + * The default name for the Proxy. + * + * @type {string} + */ + static NAME: string; + /** the proxy name + * @type {string} _name */ + protected readonly _name: string; + /** the data object + * @type {any} _data */ + protected _data?: any; + /** + * Constructor + * + * @param {string} [name] - The name of the proxy. Defaults to `Proxy.NAME` if not provided. + * @param {any} [data] - The data associated with the proxy. Can be `null`. + */ + constructor(name?: string, data?: any); + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + onRegister(): void; + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + onRemove(): void; + /** + * Get the proxy name + * + * @returns {string} The name of the proxy. + */ + get name(): string; + /** + * Get the data object + * + * @returns {any} The current data or `undefined` if no data is set. + */ + get data(): any; + /** + * Set the data object + * + * @param {any} value - The data to set. Can be `null`. + */ + set data(value: any); +} diff --git a/build/build.properties b/build/build.properties deleted file mode 100644 index 5324a10..0000000 --- a/build/build.properties +++ /dev/null @@ -1,25 +0,0 @@ -;Version for this build. -version = 1.0 - -;Absolute path of the project directory. -project.dir = ${basedir}/.. - -;YuiCompressor is used to minify compiled JavaScript file into a smaller version for the web. -yuicompressor.file = lib/yuicompressor/yuicompressor-2.4.2.jar -yuiant.file = lib/yuiant/yuiant.jar - -;Ant contrib is used to generate compile list from existing TypeScript files. -antcontrib.file = lib/ant-contrib/ant-contrib-1.0b3.jar - -;Absolute paths of project directories used in the build. -src.dir = ${project.dir}/src/ -src.bin.dir = ${project.dir}/bin/ -test.src.dir = ${project.dir}/test/src/ -test.bin.dir = ${project.dir}/test/bin/ - -;Name of the file used for release on the web and tests. -declarations-file-path = ${src.bin.dir}puremvc-typescript-standard-${version}.d.ts -release-file-path = ${src.bin.dir}puremvc-typescript-standard-${version}.js - -;Name of the file used by Unit Tests. -unit-test-file-path = ${test.bin.dir}puremvc-typescript-standard-${version}-unit-tests.js \ No newline at end of file diff --git a/build/build.xml b/build/build.xml deleted file mode 100644 index 52b165c..0000000 --- a/build/build.xml +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if( typeof define === "function" )${line.separator}{${line.separator} define( "@{module}", [@{paths}], function(@{params})${line.separator} {${line.separator}${file.content}${line.separator} return @{module};${line.separator} });${line.separator}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/lib/yuiant/license.txt b/build/lib/yuiant/license.txt deleted file mode 100644 index 74cbc55..0000000 --- a/build/lib/yuiant/license.txt +++ /dev/null @@ -1,3 +0,0 @@ -ANT Task used to compress a set of files to a target folder. -author Philippe Mouawad -www.ubik-ingenierie.com \ No newline at end of file diff --git a/build/lib/yuiant/yuiant.jar b/build/lib/yuiant/yuiant.jar deleted file mode 100644 index dbc999e7c4a7db7f88dd10a2944255cb30bb3ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6083 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
vQWQ81PSRYsyy%}BasMgW*@C!F^ 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

mDlI*-YYr4^5Gs;u7l7((%~7noXQa; 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�y9sA{K37k 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 z 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 XH3K=u5BCppxNtlQhqw|l4gU3i%C&)! diff --git a/build/user.properties.sample b/build/user.properties.sample deleted file mode 100644 index 067306c..0000000 --- a/build/user.properties.sample +++ /dev/null @@ -1,12 +0,0 @@ -; SAMPLE FILE -; The user.properties file contains a single property named typescript.compiler.path which -; (on Windows) contains system login name, what you may don't want to include in your sources. This -; is why this file is ignored in git and that you have to first rename this one before editing it to -; reflect your configuration. -; -; 1) Rename this file to «user.properties» -; 2) Set the TypeScript compiler full system path here instead of «MY_TYPESCRIPT_COMPILER_PATH». -; -; e.g. on windows: typescript.compiler.path = C:/Documents and Settings/{USER NAME HERE}/Application Data/npm/tsc.cmd - -typescript.compiler.path = MY_TYPESCRIPT_COMPILER_PATH \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 0000000..21a513a --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,64 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #008000; + --dark-hl-3: #6A9955; + --light-hl-4: #0000FF; + --dark-hl-4: #569CD6; + --light-hl-5: #001080; + --dark-hl-5: #9CDCFE; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/icons.js b/docs/assets/icons.js new file mode 100644 index 0000000..3dfbd32 --- /dev/null +++ b/docs/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/assets/icons.svg b/docs/assets/icons.svg new file mode 100644 index 0000000..a19417d --- /dev/null +++ b/docs/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 0000000..99097a0 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.appendChild(document.createElement("span")).textContent=t.text}}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js new file mode 100644 index 0000000..78c3d9d --- /dev/null +++ b/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE4WSQUsDMRBG/8ucF4sFRfZaEHrQCoKX0kNMpjSYzZQk2Ir0v8sqq0lmNl7z8V6W7Nt+QsJzgh5W5FMg5zBAB0eVDtCDdipGjIu/7eqQBgcdvFlvoL9e3l26X8O90sogp3/OW+SD0oFWNAzKG87na9OCxqpEwvdPS5Mmg05Ax+MW90jJ7q1WyZLneL7+b5Heflpa9OY1YniX6Glp0U+Bzh8c/T5ucc92ODqc/W3F3PK8WDxxfDxtUWt2sfUJw15pjIu1eO3y5rYU8OJLh1x9pamzzxVS+hXOq80Fcrm1oky34Hm+FSz3mzvmGxZVc88ph1wpeMm5Qq65UlQ557yQdAWXLeYs73FEd18SpZQwQQUAAA==" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 0000000..69b4366 --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 0000000..178bfb0 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1493 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: #4d7fff; + --light-color-ts-property: #ff984d; + --light-color-ts-method: #ff4db8; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #ff4d4d; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: #4d7fff; + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff4d4d; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} +footer > p { + margin: 0 1em; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} +a.tsd-anchor-link { + color: var(--color-text); +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; +} + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-navigation .tsd-nav-link { + display: none; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-reference { + color: var(--color-ts-reference); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/docs/classes/Controller.html b/docs/classes/Controller.html new file mode 100644 index 0000000..f34e346 --- /dev/null +++ b/docs/classes/Controller.html @@ -0,0 +1,79 @@ +Controller | @puremvc/puremvc-typescript-multicore-framework

A Singleton Controller implementation.

+

In PureMVC, the Controller class follows the +'Command and Controller' strategy, and assumes these +responsibilities:

+
    +
  • Remembering which Commands +are intended to handle which Notifications.
  • +
  • Registering itself as an Observer with +the View for each Notification +that it has a Command mapping for.
  • +
  • Creating a new instance of the proper Command +to handle a given Notification when notified by the View.
  • +
  • Calling the Command's execute +method, passing in the Notification.
  • +
+

Your application must register Commands with the +Controller.

+

The simplest way is to subclass Facade, +and use its initializeController method to add your +registrations.

+

Implements

Constructors

  • Constructor.

    +

    This Controller implementation is a Singleton, +so you should not call the constructor +directly, but instead call the static Singleton Factory method, +Controller.getInstance()

    +

    Returns Controller

    Error if instance for this Singleton has already been constructed

    +

Properties

commandMap: {
    [key: string]: (() => ICommand);
}

Mapping of Notification names to Command factories

+
view?: IView

Local reference to View

+
instance: IController

Singleton instance

+
SINGLETON_MSG: string = "Controller Singleton already constructed!"

Message Constants

+

Methods

  • If a Command has previously been registered +to handle the given Notification, then it is executed.

    +

    Parameters

    • notification: INotification

      The notification containing the data or command details needed for execution.

      +

    Returns void

  • Check if a Command is registered for a given Notification

    +

    Parameters

    • notificationName: string

      The name of the notification to check for a registered command.

      +

    Returns boolean

    true if a command is registered for the specified notification name; otherwise, false.

    +
  • Initialize the Singleton Controller instance.

    +

    Called automatically by the constructor.

    +

    Note that if you are using a subclass of View +in your application, you should also subclass Controller +and override the initializeController method in the +following way:

    +
    // ensure that the Controller is talking to my View implementation
    initializeController() {
    this.view = MyView.getInstance(() => new View());
    } +
    + +

    Returns void

  • Register a particular Command class as the handler +for a particular Notification.

    +

    If an Command has already been registered to +handle Notifications with this name, it is no longer +used, the new Command is used instead.

    +

    The Observer for the new Command is only created if this the +first time a Command has been registered for this Notification name.

    +

    Parameters

    • notificationName: string

      The name of the notification to associate with the command.

      +
    • factory: (() => ICommand)

      A factory function that returns an instance of the command.

      +

    Returns void

  • Remove a previously registered Command to Notification mapping.

    +

    Parameters

    • notificationName: string

      The name of the notification for which the associated command should be removed.

      +

    Returns void

  • Controller Singleton Factory method.

    +

    Parameters

    Returns IController

    the Singleton instance of Controller.

    +
diff --git a/docs/classes/Facade.html b/docs/classes/Facade.html new file mode 100644 index 0000000..2369d85 --- /dev/null +++ b/docs/classes/Facade.html @@ -0,0 +1,139 @@ +Facade | @puremvc/puremvc-typescript-multicore-framework

A base Singleton Facade implementation.

+
+

Facade

+

Implements

Constructors

  • Constructor.

    +

    This Facade implementation is a Singleton, +so you should not call the constructor +directly, but instead call the static Factory method, +passing the unique key for this instance +Facade.getInstance()

    +

    Returns Facade

    Error if instance for this Singleton instance has already been constructed

    +

Properties

controller?: IController

Reference to Controller

+
model?: IModel

Reference to Model

+
view?: IView

Reference to View

+
instance: IFacade

Singleton instance

+
SINGLETON_MSG: string = "Facade Singleton already constructed!"

Message Constants

+

Methods

  • Check if a Command is registered for a given Notification

    +

    Parameters

    • notificationName: string

      The name of the notification to check.

      +

    Returns boolean

    true if a command is registered for the notification; otherwise, false.

    +
  • Check if a Mediator is registered or not

    +

    Parameters

    • mediatorName: string

      The name of the mediator to check.

      +

    Returns boolean

    true if a mediator is registered for the name; otherwise, false.

    +
  • Check if a Proxy is registered

    +

    Parameters

    • proxyName: string

      The name of the proxy to check.

      +

    Returns boolean

    true if a proxy is registered for the name; otherwise, false.

    +
  • Initialize the Controller.

    +

    Called by the initializeFacade method. +Override this method in your subclass of Facade +if one or both of the following are true:

    +
      +
    • You wish to initialize a different Controller.
    • +
    • You have Commands to register with the Controller at startup.`.
    • +
    +

    If you don't want to initialize a different Controller, +call super.initializeController() at the beginning of your +method, then register Commands.

    +

    Returns void

  • Initialize the Singleton Facade instance.

    +

    Called automatically by the constructor. Override in your +subclass to do any subclass specific initializations. Be +sure to call super.initializeFacade(), though.

    +

    Returns void

  • Initialize the Model.

    +

    Called by the initializeFacade method. +Override this method in your subclass of Facade +if one or both of the following are true:

    +
      +
    • You wish to initialize a different Model.
    • +
    • You have Proxys to register with the Model that do not +retrieve a reference to the Facade at construction time.`
    • +
    +

    If you don't want to initialize a different Model, +call super.initializeModel() at the beginning of your +method, then register Proxys.

    +

    Note: This method is rarely overridden; in practice you are more +likely to use a Command to create and register Proxys +with the Model, since Proxys with mutable data will likely +need to send Notifications and thus will likely want to fetch a reference to +the Facade during their construction.

    +

    Returns void

  • Initialize the View.

    +

    Called by the initializeFacade method. +Override this method in your subclass of Facade +if one or both of the following are true:

    +
      +
    • You wish to initialize a different View.
    • +
    • You have Observers to register with the View
    • +
    +

    If you don't want to initialize a different View, +call super.initializeView() at the beginning of your +method, then register Mediator instances.

    +

    Note: This method is rarely overridden; in practice you are more +likely to use a Command to create and register Mediators +with the View, since Mediator instances will need to send +Notifications and thus will likely want to fetch a reference +to the Facade during their construction.

    +

    Returns void

  • Notify Observers.

    +

    This method is left public mostly for backward +compatibility, and to allow you to send custom +notification classes using the facade.

    +

    Usually you should just call sendNotification +and pass the parameters, never having to +construct the notification yourself.

    +

    Parameters

    • notification: INotification

      The notification to be sent to observers.

      +

    Returns void

  • Register a Command with the Controller by Notification name. *

    +

    Parameters

    • notificationName: string

      The name of the notification to associate with the command.

      +
    • factory: (() => ICommand)

      A factory function that returns an instance of ICommand. This function is used to create the command.

      +

    Returns void

  • Register a Mediator with the View.

    +

    Parameters

    • mediator: IMediator

      The mediator instance to be registered.

      +

    Returns void

  • Register a Proxy with the Model by name.

    +

    Parameters

    • proxy: IProxy

      The proxy instance to be registered.

      +

    Returns void

  • Remove a previously registered Command to Notification mapping from the Controller.

    +

    Parameters

    • notificationName: string

      The name of the notification for which the command should be removed.

      +

    Returns void

  • Remove a Mediator from the View.

    +

    Parameters

    • mediatorName: string

      The name of the mediator to remove.

      +

    Returns null | IMediator

    The removed mediator instance, or null if no such mediator exists.

    +
  • Remove a Proxy from the Model by name.

    +

    Parameters

    • proxyName: string

      The name of the proxy to remove.

      +

    Returns null | IProxy

    The removed proxy instance, or null if no such proxy exists.

    +
  • Retrieve a Proxy from the Model by name.

    +

    Parameters

    • mediatorName: string

      The name of the mediator to retrieve.

      +

    Returns null | IMediator

    The mediator instance associated with the given name, or null if no such mediator exists.

    +
  • Retrieve a Proxy from the Model by name.

    +

    Parameters

    • proxyName: string

      The name of the proxy to retrieve.

      +

    Returns null | IProxy

    The proxy instance associated with the given name, or null if no such proxy exists.

    +
  • Create and send an Notification.

    +

    Keeps us from having to construct new notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

  • Facade Singleton Factory method

    +

    Parameters

    • factory: (() => IFacade)

      A factory function that creates a new instance of the facade.

      +

    Returns IFacade

    the Singleton instance of the Facade

    +
diff --git a/docs/classes/MacroCommand.html b/docs/classes/MacroCommand.html new file mode 100644 index 0000000..b8405ba --- /dev/null +++ b/docs/classes/MacroCommand.html @@ -0,0 +1,58 @@ +MacroCommand | @puremvc/puremvc-typescript-multicore-framework

A base Command implementation that executes other Commands.

+

A MacroCommand maintains a list of +Command Class references called SubCommands.

+

When execute is called, the MacroCommand +instantiates and calls execute on each of its SubCommands turn. +Each SubCommand will be passed a reference to the original +Notification that was passed to the MacroCommand's +execute method.

+

Unlike SimpleCommand, your subclass +should not override execute, but instead, should +override the initializeMacroCommand method, +calling addSubCommand once for each SubCommand +to be executed.

+
+

MacroCommand

+

Hierarchy (view full)

Constructors

  • Constructor.

    +

    You should not need to define a constructor, +instead, override the initializeMacroCommand +method.

    +

    If your subclass does define a constructor, be +sure to call super().

    +

    Returns MacroCommand

Properties

facade: IFacade = ...

Return the Singleton Facade instance

+

The facade instance.

+

Methods

  • Add a SubCommand.

    +

    The SubCommands will be called in First In/First Out (FIFO) +order.

    +

    Parameters

    • factory: (() => ICommand)

      A factory function that creates an instance of ICommand. This function will be used to generate the sub-command.

      +

    Returns void

  • Execute this MacroCommand's SubCommands.

    +

    The SubCommands will be called in First In/First Out (FIFO) +order.

    +

    Parameters

    • notification: INotification

      The notification containing the data or command details to be processed.

      +

    Returns void

  • Initialize the MacroCommand.

    +

    In your subclass, override this method to +initialize the MacroCommand's SubCommand +list with Command class references like +this:

    +
    // Initialize MyMacroCommand
    initializeMacroCommand() {
    this.addSubCommand(() => new app.FirstCommand());
    this.addSubCommand(() => new app.SecondCommand());
    this.addSubCommand(() => new app.ThirdCommand());
    } +
    + +

    Note that SubCommands may be any Command implementor, +MacroCommands or SimpleCommands are both acceptable.

    +

    Returns void

  • Create and send an Notification.

    +

    Keeps us from having to construct new Notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/classes/Mediator.html b/docs/classes/Mediator.html new file mode 100644 index 0000000..babf7bf --- /dev/null +++ b/docs/classes/Mediator.html @@ -0,0 +1,49 @@ +Mediator | @puremvc/puremvc-typescript-multicore-framework

A base Mediator implementation.

+

View

+

Mediator

+

Hierarchy (view full)

Implements

Constructors

  • Constructor.

    +

    Parameters

    • Optionalname: string

      Optional name for the mediator. Defaults to Mediator.NAME.

      +
    • OptionalviewComponent: any

      Optional view component associated with the mediator.

      +

    Returns Mediator

Properties

_name: string

the mediator name

+
_viewComponent?: any

The view component

+
facade: IFacade = ...

Return the Singleton Facade instance

+

The facade instance.

+
NAME: string = "Mediator"

The default name for the mediator.

+

Accessors

  • get name(): string
  • the mediator name

    +

    Returns string

    The name of the mediator.

    +
  • get viewComponent(): any
  • Get the Mediator's view component.

    +

    Additionally, an implicit getter will usually +be defined in the subclass that casts the view +object to a type, like this:

    +

    Returns any

    The view component.

    +
  • set viewComponent(value): void
  • Set the Mediator's view component.

    +

    Parameters

    • value: any

      The new view component.

      +

    Returns void

Methods

  • Handle Notifications.

    +

    Typically, this will be handled in a switch statement, +with one 'case' entry per Notification +the Mediator is interested in.

    +

    Parameters

    Returns void

  • List the Notification names this +Mediator is interested in being notified of.

    +

    Returns string[]

    An array of notification names.

    +
  • Called by the View when the Mediator is registered

    +

    Returns void

  • Called by the View when the Mediator is removed

    +

    Returns void

  • Create and send an Notification.

    +

    Keeps us from having to construct new Notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/classes/Model.html b/docs/classes/Model.html new file mode 100644 index 0000000..ba79312 --- /dev/null +++ b/docs/classes/Model.html @@ -0,0 +1,55 @@ +Model | @puremvc/puremvc-typescript-multicore-framework

A Singleton Model implementation.

+

In PureMVC, the Model class provides +access to model objects (Proxies) by named lookup.

+

The Model assumes these responsibilities:

+
    +
  • Maintain a cache of Proxy instances.
  • +
  • Provide methods for registering, retrieving, and removing +Proxy instances.
  • +
+

Your application must register Proxy instances +with the Model. Typically, you use an +Command to create and register Proxy +instances once the Facade has initialized the Core +actors.

+

Proxy

+

Model

+

Implements

Constructors

  • Constructor.

    +

    This Model implementation is a Singleton, +so you should not call the constructor +directly, but instead call the static Singleton +Factory method Model.getInstance()

    +

    Returns Model

    Error if instance for this Singleton instance has already been constructed

    +

Properties

proxyMap: {
    [key: string]: IProxy;
}

Mapping of proxyNames to IProxy instances

+
instance: IModel

Singleton instance

+
SINGLETON_MSG: string = "Model Singleton already constructed!"

Message Constants

+

Methods

  • Check if a Proxy is registered

    +

    Parameters

    • proxyName: string

      The name of the proxy to check.

      +

    Returns boolean

    true if a proxy with the specified name is registered; otherwise, false.

    +
  • Initialize the Model instance.

    +

    Called automatically by the constructor, this +is your opportunity to initialize the Singleton +instance in your subclass without overriding the +constructor.

    +

    Returns void

  • Register a Proxy with the Model.

    +

    Parameters

    • proxy: IProxy

      The proxy instance to be registered.

      +

    Returns void

  • Remove a Proxy from the Model.

    +

    Parameters

    • proxyName: string

      The name of the proxy to be removed.

      +

    Returns null | IProxy

    The removed proxy instance, or null if no proxy with the given name was found.

    +
  • Retrieve a Proxy from the Model.

    +

    Parameters

    • proxyName: string

      The name of the proxy to retrieve.

      +

    Returns null | IProxy

    The proxy instance associated with the given name, or null if no such proxy exists.

    +
  • Model Singleton Factory method.

    +

    Parameters

    • factory: (() => IModel)

      A factory function that creates a new instance of the model if one does not already exist.

      +

    Returns IModel

    The Singleton instance.

    +
diff --git a/docs/classes/Notification.html b/docs/classes/Notification.html new file mode 100644 index 0000000..d9f2ce1 --- /dev/null +++ b/docs/classes/Notification.html @@ -0,0 +1,45 @@ +Notification | @puremvc/puremvc-typescript-multicore-framework

A base Notification implementation.

+

PureMVC does not rely upon underlying event models such +as the one provided with Flash, and ActionScript 3 does +not have an inherent event model.

+

The Observer Pattern as implemented within PureMVC exists +to support event-driven communication between the +application and the actors of the MVC triad.

+

Notifications are not meant to be a replacement for Events +in Flex/Flash/Apollo. Generally, Mediator implementors +place event listeners on their view components, which they +then handle in the usual way. This may lead to the broadcast of Notifications to +trigger Commands or to communicate with other Mediators. Proxy and Command +instances communicate with each other and Mediators +by broadcasting Notifications.

+

A key difference between Flash Events and PureMVC +Notifications is that Events follow the +'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy +until some parent component handles the Event, while +PureMVC Notifications follow a 'Publish/Subscribe' +pattern. PureMVC classes need not be related to each other in a +parent/child relationship in order to communicate with one another +using Notifications.

+

Notification

+

Implements

Constructors

Accessors

Methods

Constructors

  • Constructor.

    +

    Parameters

    • name: string

      The name of the notification.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns Notification

Accessors

  • get body(): any
  • Get the body of the Notification instance.

    +

    Returns any

    The body of the notification.

    +
  • set body(value): void
  • Set the body of the Notification instance.

    +

    Parameters

    • value: any

      The new body to be set for the notification.

      +

    Returns void

  • get name(): string
  • Get the name of the Notification instance.

    +

    Returns string

    The name of the notification.

    +
  • get type(): undefined | string
  • Get the type of the Notification instance.

    +

    Returns undefined | string

    The type of the notification, or undefined if not set.

    +
  • set type(value): void
  • Set the type of the Notification instance.

    +

    Parameters

    • value: undefined | string

      The new type to be set for the notification.

      +

    Returns void

Methods

  • Get the string representation of the Notification instance.

    +

    Returns string

    A string representation of the notification.

    +
diff --git a/docs/classes/Notifier.html b/docs/classes/Notifier.html new file mode 100644 index 0000000..871623c --- /dev/null +++ b/docs/classes/Notifier.html @@ -0,0 +1,32 @@ +Notifier | @puremvc/puremvc-typescript-multicore-framework

A Base Notifier implementation.

+

MacroCommand, Command, Mediator and Proxy +all have a need to send Notifications.

+

The Notifier interface provides a common method called +sendNotification that relieves implementation code of +the necessity to actually construct Notifications.

+

The Notifier class, which all the above-mentioned classes +extend, provides an initialized reference to the Facade +Singleton, which is required for the convenience method +for sending Notifications, but also eases implementation as these +classes have frequent Facade interactions and usually require +access to the facade anyway.

+

Hierarchy (view full)

Implements

Constructors

Properties

Methods

Constructors

Properties

facade: IFacade = ...

Return the Singleton Facade instance

+

The facade instance.

+

Methods

  • Create and send an Notification.

    +

    Keeps us from having to construct new Notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/classes/Observer.html b/docs/classes/Observer.html new file mode 100644 index 0000000..d69231f --- /dev/null +++ b/docs/classes/Observer.html @@ -0,0 +1,37 @@ +Observer | @puremvc/puremvc-typescript-multicore-framework

A base Observer implementation.

+

An Observer is an object that encapsulates information +about an interested object with a method that should +be called when a particular Notification is broadcast.

+

In PureMVC, the Observer class assumes these responsibilities:

+
    +
  • Encapsulate the notification (callback) method of the interested object.
  • +
  • Encapsulate the notification context (this) of the interested object.
  • +
  • Provide methods for setting the notification method and context.
  • +
  • Provide a method for notifying the interested object.
  • +
+

Observer

+

Implements

Constructors

  • Constructor.

    +

    The notification method on the interested object should take +one parameter of type Notification

    +

    Parameters

    • Optionalnotify: null | ((notification: INotification) => void)

      The method to be called when a notification is received. Can be null.

      +
    • Optionalcontext: any

      The context in which to call the notifyMethod. Can be null.

      +

    Returns Observer

Accessors

  • get notifyContext(): any
  • Get the notifyContext

    +

    Returns any

    The current context or null if no context is set.

    +
  • set notifyContext(value): void
  • Set the notification context.

    +

    Parameters

    • value: any

      The context to set. Can be null.

      +

    Returns void

  • get notifyMethod(): undefined | null | ((notification: INotification) => void)
  • Get the notification method.

    +

    Returns undefined | null | ((notification: INotification) => void)

    The current method or null if no method is set.

    +
  • set notifyMethod(value): void
  • Set the notification method.

    +

    The notification method should take one parameter of type Notification.

    +

    Parameters

    • value: null | ((notification: INotification) => void)

      The method to set for handling notifications. Can be null.

      +

    Returns void

Methods

  • Compare an object to the notification context.

    +

    Parameters

    • object: any

      The object to compare with the observer's context.

      +

    Returns boolean

    true if the context is the same, otherwise false.

    +
  • Notify the interested object.

    +

    Parameters

    • notification: INotification

      The notification to send to the observer.

      +

    Returns void

diff --git a/docs/classes/Proxy.html b/docs/classes/Proxy.html new file mode 100644 index 0000000..51e4066 --- /dev/null +++ b/docs/classes/Proxy.html @@ -0,0 +1,46 @@ +Proxy | @puremvc/puremvc-typescript-multicore-framework

A base Proxy implementation.

+

In PureMVC, Proxy classes are used to manage parts of the +application's data model.

+

A Proxy might simply manage a reference to a local data object, +in which case interacting with it might involve setting and +getting of its data in synchronous fashion.

+

Proxy classes are also used to encapsulate the application's +interaction with remote services to save or retrieve data, in which case, +we adopt an asynchronous idiom; setting data (or calling a method) on the +Proxy and listening for a Notification to be sent +when the Proxy has retrieved the data from the service.

+

Model

+

Proxy

+

Hierarchy (view full)

Implements

Constructors

Properties

Accessors

Methods

Constructors

  • Constructor

    +

    Parameters

    • Optionalname: string

      The name of the proxy. Defaults to Proxy.NAME if not provided.

      +
    • Optionaldata: any

      The data associated with the proxy. Can be null.

      +

    Returns Proxy

Properties

_data?: any

the data object

+
_name: string

the proxy name

+
facade: IFacade = ...

Return the Singleton Facade instance

+

The facade instance.

+
NAME: string = "Proxy"

The default name for the Proxy.

+

Accessors

  • get data(): any
  • Get the data object

    +

    Returns any

    The current data or undefined if no data is set.

    +
  • set data(value): void
  • Set the data object

    +

    Parameters

    • value: any

      The data to set. Can be null.

      +

    Returns void

  • get name(): string
  • Get the proxy name

    +

    Returns string

    The name of the proxy.

    +

Methods

  • Called by the Model when the Proxy is registered

    +

    Returns void

  • Called by the Model when the Proxy is removed

    +

    Returns void

  • Create and send an Notification.

    +

    Keeps us from having to construct new Notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/classes/SimpleCommand.html b/docs/classes/SimpleCommand.html new file mode 100644 index 0000000..6a90fe8 --- /dev/null +++ b/docs/classes/SimpleCommand.html @@ -0,0 +1,28 @@ +SimpleCommand | @puremvc/puremvc-typescript-multicore-framework

A base Command implementation.

+

Your subclass should override the execute +method where your business logic will handle the Notification.

+
+

SimpleCommand

+

Hierarchy (view full)

Implements

Constructors

Properties

Methods

Constructors

Properties

facade: IFacade = ...

Return the Singleton Facade instance

+

The facade instance.

+

Methods

  • Fulfill the use-case initiated by the given Notification.

    +

    In the Command Pattern, an application use-case typically +begins with some user action, which results in a Notification being broadcast, which +is handled by business logic in the execute method of an +Command.

    +

    Parameters

    • notification: INotification

      The notification containing the data or command details to be processed.

      +

    Returns void

  • Create and send an Notification.

    +

    Keeps us from having to construct new Notification +instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to be sent.

      +
    • Optionalbody: any

      Optional data to be included with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/classes/View.html b/docs/classes/View.html new file mode 100644 index 0000000..fe9ad1e --- /dev/null +++ b/docs/classes/View.html @@ -0,0 +1,75 @@ +View | @puremvc/puremvc-typescript-multicore-framework

A Singleton View implementation.

+

In PureMVC, the View class assumes these responsibilities:

+
    +
  • Maintain a cache of Mediator instances.
  • +
  • Provide methods for registering, retrieving, and removing Mediators.
  • +
  • Notifying Mediators when they are registered or removed.
  • +
  • Managing the observer lists for each Notification in the application.
  • +
  • Providing a method for attaching Observers to a Notification's observer list.
  • +
  • Providing a method for broadcasting a Notification.
  • +
  • Notifying the Observers of a given Notification when it broadcast.
  • +
+
+

View

+

Implements

Constructors

  • Constructor.

    +

    This View implementation is a Singleton, +so you should not call the constructor +directly, but instead call the static Singleton +Factory method View.getInstance()

    +

    Returns View

    Error if instance for this Singleton key has already been constructed

    +

Properties

mediatorMap: {
    [key: string]: IMediator;
}

Mapping of Mediator names to Mediator instances

+
observerMap: {
    [key: string]: IObserver[];
}

Mapping of Notification names to Observer lists

+
instance: IView

Singleton instance

+
SINGLETON_MSG: string = "View Singleton already constructed!"

Message Constants

+

Methods

  • Check if a Mediator is registered or not

    +

    Parameters

    • mediatorName: string

      The name of the mediator to check.

      +

    Returns boolean

    true if a mediator with the specified name is registered; otherwise, false.

    +
  • Notify the Observers for a particular Notification.

    +

    All previously attached Observers for this Notification's +list are notified and are passed a reference to the Notification in +the order in which they were registered.

    +

    Parameters

    • notification: INotification

      The notification containing the data or command details to be sent to observers.

      +

    Returns void

  • Register a Mediator instance with the View.

    +

    Registers the Mediator so that it can be retrieved by name, +and further interrogates the Mediator for its +Notification interests.

    +

    If the Mediator returns any Notification +names to be notified about, an Observer is created encapsulating +the Mediator instance's handleNotification method +and registering it as an Observer for all Notifications the +Mediator is interested in.

    +

    Parameters

    • mediator: IMediator

      The mediator instance to be registered.

      +

    Returns void

  • Register an Observer to be notified +of Notifications with a given name.

    +

    Parameters

    • notificationName: string

      The name of the notification to which the observer should be registered.

      +
    • observer: IObserver

      The observer instance to be registered.

      +

    Returns void

  • Remove a Mediator from the View.

    +

    Parameters

    • mediatorName: string

      The name of the mediator to be removed.

      +

    Returns null | IMediator

    The removed mediator instance, or null if no mediator with the given name was found.

    +
  • Remove the observer for a given notifyContext from an observer list for a given Notification name.

    +

    Parameters

    • notificationName: string

      The name of the notification for which the observer should be removed.

      +
    • notifyContext: object

      The context of the observer to be removed.

      +

    Returns void

  • Retrieve a Mediator from the View.

    +

    Parameters

    • mediatorName: string

      The name of the mediator to retrieve.

      +

    Returns null | IMediator

    The mediator instance associated with the given name, or null if no such mediator exists.

    +
  • View Singleton factory method.

    +

    Parameters

    • factory: (() => IView)

      A factory function that creates a new instance of the view if one does not already exist.

      +

    Returns IView

    The view instance.

    +
diff --git a/docs/hierarchy.html b/docs/hierarchy.html new file mode 100644 index 0000000..5dcbd15 --- /dev/null +++ b/docs/hierarchy.html @@ -0,0 +1 @@ +@puremvc/puremvc-typescript-multicore-framework
diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..4810a35 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,43 @@ +@puremvc/puremvc-typescript-multicore-framework

@puremvc/puremvc-typescript-multicore-framework

PureMVC is a lightweight framework for creating applications based upon the classic Model-View-Controller design meta-pattern. It supports modular programming through the use of Multiton Core actors instead of the Singletons.

+ +
npm i @puremvc/puremvc-typescript-multicore-framework
+
+ + + +

Production - Version 2.0.1

+
    +
  • +

    PureMVC MultiCore Framework for TypeScript - Copyright © 2024 Saad Shams

    +
  • +
  • +

    PureMVC - Copyright © 2024 Futurescale, Inc.

    +
  • +
  • +

    All rights reserved.

    +
  • +
  • +

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    +
      +
    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    • +
    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    • +
    • Neither the name of Futurescale, Inc., PureMVC.org, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    • +
    +
  • +
+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+
diff --git a/docs/interfaces/ICommand.html b/docs/interfaces/ICommand.html new file mode 100644 index 0000000..901c286 --- /dev/null +++ b/docs/interfaces/ICommand.html @@ -0,0 +1,14 @@ +ICommand | @puremvc/puremvc-typescript-multicore-framework

The interface definition for a PureMVC Command.

+

INotification

+

ICommand

+
interface ICommand {
    execute(notification: INotification): void;
    sendNotification(notificationName: string, body?: any, type?: string): void;
}

Hierarchy (view full)

Implemented by

Methods

  • Execute the ICommand's logic to handle a given INotification.

    +

    Parameters

    • notification: INotification

      The notification carrying the data and type necessary for executing the command.

      +

    Returns void

  • Send a INotification.

    +

    Convenience method to prevent having to construct new +notification instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to send.

      +
    • Optionalbody: any

      Optional data associated with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/interfaces/IController.html b/docs/interfaces/IController.html new file mode 100644 index 0000000..3f8ab97 --- /dev/null +++ b/docs/interfaces/IController.html @@ -0,0 +1,36 @@ +IController | @puremvc/puremvc-typescript-multicore-framework

IController The interface definition for a PureMVC Controller.

+

In PureMVC, an IController implementor +follows the 'Command and Controller' strategy, and +assumes these responsibilities:

+
    +
  • +

    Remembering which ICommands are intended to handle which INotifications.

    +
  • +
  • +

    Registering itself as an IObserver with the View for each INotification that it has an ICommand mapping for.

    +
  • +
  • +

    Creating a new instance of the proper ICommand to handle a given INotification when notified by the View.

    +
  • +
  • +

    Calling the ICommand's execute method, passing in the INotification.

    +
  • +
+

IController

+
interface IController {
    executeCommand(notification: INotification): void;
    hasCommand(notificationName: string): boolean;
    registerCommand(notificationName: string, factory: (() => ICommand)): void;
    removeCommand(notificationName: string): void;
}

Implemented by

Methods

  • Execute the ICommand previously registered as the +handler for INotifications with the given notification name.

    +

    Parameters

    • notification: INotification

      the INotification to execute the associated ICommand for

      +

    Returns void

  • Check if a Command is registered for a given Notification

    +

    Parameters

    • notificationName: string

      The name of the notification to check.

      +

    Returns boolean

    true if a command is registered for the notification name, false otherwise.

    +
  • Register a particular ICommand class as the handler +for a particular INotification.

    +

    Parameters

    • notificationName: string

      the name of the INotification

      +
    • factory: (() => ICommand)

      A factory that returns ICommand

      +

    Returns void

  • Remove a previously registered ICommand to INotification mapping.

    +

    Parameters

    • notificationName: string

      the name of the INotification to remove the ICommand mapping for

      +

    Returns void

diff --git a/docs/interfaces/IFacade.html b/docs/interfaces/IFacade.html new file mode 100644 index 0000000..ee5a54d --- /dev/null +++ b/docs/interfaces/IFacade.html @@ -0,0 +1,66 @@ +IFacade | @puremvc/puremvc-typescript-multicore-framework

IFacade The interface definition for a PureMVC Facade.

+

The Facade Pattern suggests providing a single +class to act as a central point of communication +for a subsystem.

+

In PureMVC, the Facade acts as an interface between +the core MVC actors (Model, View, Controller) and +the rest of your application.

+

IFacade

+
interface IFacade {
    hasCommand(notificationName: string): boolean;
    hasMediator(mediatorName: string): boolean;
    hasProxy(proxyName: string): boolean;
    notifyObservers(notification: INotification): void;
    registerCommand(notificationName: string, factory: (() => ICommand)): void;
    registerMediator(mediator: IMediator): void;
    registerProxy(proxy: IProxy): void;
    removeCommand(notificationName: string): void;
    removeMediator(mediatorName: string): null | IMediator;
    removeProxy(proxyName: string): null | IProxy;
    retrieveMediator(mediatorName: string): null | IMediator;
    retrieveProxy(proxyName: string): null | IProxy;
    sendNotification(notificationName: string, body?: any, type?: string): void;
}

Hierarchy (view full)

Implemented by

Methods

  • Check if a ICommand is registered for a given Notification

    +

    Parameters

    • notificationName: string

      The name of the notification to check.

      +

    Returns boolean

    true if a command is registered for the notification name, false otherwise.

    +
  • Check if a Mediator is registered or not

    +

    Parameters

    • mediatorName: string

      The name of the mediator to check.

      +

    Returns boolean

    true if a mediator is registered with the name, false otherwise.

    +
  • Check if a Proxy is registered

    +

    Parameters

    • proxyName: string

      The name of the proxy to check.

      +

    Returns boolean

    true if a proxy is registered with the name, false otherwise.

    +
  • Notify Observers.

    +

    This method is left public mostly for backward +compatibility, and to allow you to send custom +notification classes using the facade.

    +

    Usually you should just call sendNotification +and pass the parameters, never having to +construct the notification yourself.

    +

    Parameters

    • notification: INotification

      the INotification to have the View notify Observers of.

      +

    Returns void

  • Register an ICommand with the Controller

    +

    Parameters

    • notificationName: string

      the name of the INotification to associate the ICommand with.

      +
    • factory: (() => ICommand)

      A factory that creates an instance of the ICommand to be registered.

      +

    Returns void

  • Register an IMediator instance with the View.

    +

    Parameters

    • mediator: IMediator

      a reference to the IMediator instance

      +

    Returns void

  • Register an IProxy with the Model by name.

    +

    Parameters

    • proxy: IProxy

      the IProxy to be registered with the Model.

      +

    Returns void

  • Remove a previously registered ICommand to INotification mapping from the Controller.

    +

    Parameters

    • notificationName: string

      the name of the INotification to remove the ICommand mapping for

      +

    Returns void

  • Remove a IMediator instance from the View.

    +

    Parameters

    • mediatorName: string

      The name of the mediator to remove.

      +

    Returns null | IMediator

    The removed mediator instance if found, or null if no mediator was registered with the given name.

    +
  • Remove an IProxy instance from the Model by name.

    +

    Parameters

    • proxyName: string

      the IProxy to remove from the Model.

      +

    Returns null | IProxy

    The removed proxy instance if found, or null if no proxy was registered with the given name.

    +
  • Retrieve an IMediator instance from the View.

    +

    Parameters

    • mediatorName: string

      the name of the IMediator instance to retrieve

      +

    Returns null | IMediator

    The mediator instance if found, or null if no mediator is registered with the given name.

    +
  • Retrieve a IProxy from the Model by name.

    +

    Parameters

    • proxyName: string

      the name of the IProxy instance to be retrieved.

      +

    Returns null | IProxy

    the IProxy previously registered by proxyName with the Model.

    +
  • Send a INotification.

    +

    Convenience method to prevent having to construct new +notification instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to send.

      +
    • Optionalbody: any

      Optional data associated with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/interfaces/IMediator.html b/docs/interfaces/IMediator.html new file mode 100644 index 0000000..e60afa6 --- /dev/null +++ b/docs/interfaces/IMediator.html @@ -0,0 +1,57 @@ +IMediator | @puremvc/puremvc-typescript-multicore-framework

IMediator The interface definition for a PureMVC Mediator.

+

In PureMVC, IMediator implementors assume these responsibilities:

+
    +
  • +

    Implement a common method which returns a list of all INotifications the IMediator has interest in.

    +
  • +
  • +

    Implement a notification callback method.

    +
  • +
  • +

    Implement methods that are called when the IMediator is registered or removed from the View.

    +
  • +
+

Additionally, IMediators typically:

+
    +
  • +

    Act as an intermediary between one or more view components such as text boxes or list controls, maintaining references and coordinating their behavior.

    +
  • +
  • +

    In Flash-based apps, this is often the place where event listeners are added to view components, and their handlers implemented.

    +
  • +
  • +

    Respond to and generate INotifications, interacting with of the rest of the PureMVC app.

    +
  • +
+

When an IMediator is registered with the IView, +the IView will call the IMediator's +listNotificationInterests method. The IMediator will +return an Array of INotification names which +it wishes to be notified about.

+

The IView will then create an Observer object +encapsulating that IMediator's (handleNotification) method +and register it as an Observer for each INotification name returned by +listNotificationInterests.

+

IMediator

+
interface IMediator {
    name: string;
    viewComponent: any;
    handleNotification(notification: INotification): void;
    listNotificationInterests(): string[];
    onRegister(): void;
    onRemove(): void;
    sendNotification(notificationName: string, body?: any, type?: string): void;
}

Hierarchy (view full)

Implemented by

Properties

name: string

The name of the mediator.

+
viewComponent: any

The view component associated with the mediator.

+

Methods

  • Handle an INotification.

    +

    Parameters

    Returns void

  • List INotification interests.

    +

    Returns string[]

    an Array of the INotification names this IMediator has an interest in.

    +
  • Called by the View when the Mediator is registered

    +

    Returns void

  • Called by the View when the Mediator is removed

    +

    Returns void

  • Send a INotification.

    +

    Convenience method to prevent having to construct new +notification instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to send.

      +
    • Optionalbody: any

      Optional data associated with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/interfaces/IModel.html b/docs/interfaces/IModel.html new file mode 100644 index 0000000..8dc12ce --- /dev/null +++ b/docs/interfaces/IModel.html @@ -0,0 +1,29 @@ +IModel | @puremvc/puremvc-typescript-multicore-framework

IModel The interface definition for a PureMVC Model.

+

In PureMVC, IModel implementors provide +access to IProxy objects by named lookup.

+

An IModel assumes these responsibilities:

+
    +
  • +

    Maintain a cache of IProxy instances

    +
  • +
  • +

    Provide methods for registering, retrieving, and removing IProxy instances

    +
  • +
+

IModel

+
interface IModel {
    hasProxy(proxyName: string): boolean;
    registerProxy(proxy: IProxy): void;
    removeProxy(proxyName: string): null | IProxy;
    retrieveProxy(proxyName: string): null | IProxy;
}

Implemented by

Methods

  • Check if a Proxy is registered

    +

    Parameters

    • proxyName: string

      The name of the proxy to check.

      +

    Returns boolean

    True if the IProxy is registered, otherwise false.

    +
  • Register an IProxy instance with the Model.

    +

    Parameters

    • proxy: IProxy

      an object reference to be held by the Model.

      +

    Returns void

  • Remove an IProxy instance from the Model.

    +

    Parameters

    • proxyName: string

      The name of the proxy to remove.

      +

    Returns null | IProxy

    The removed IProxy if found, otherwise null.

    +
  • Retrieve an IProxy instance from the Model.

    +

    Parameters

    • proxyName: string

      The name of the proxy to retrieve.

      +

    Returns null | IProxy

    The IProxy if registered, otherwise null.

    +
diff --git a/docs/interfaces/INotification.html b/docs/interfaces/INotification.html new file mode 100644 index 0000000..5841fe7 --- /dev/null +++ b/docs/interfaces/INotification.html @@ -0,0 +1,33 @@ +INotification | @puremvc/puremvc-typescript-multicore-framework

INotification The interface definition for a PureMVC Notification.

+

PureMVC does not rely upon underlying event models such +as the one provided with Flash, and ActionScript 3 does +not have an inherent event model.

+

The Observer Pattern as implemented within PureMVC exists +to support event-driven communication between the +application and the actors of the MVC triad.

+

Notifications are not meant to be a replacement for Events +in Flex/Flash/AIR. Generally, IMediator implementors +place event listeners on their view components, which they +then handle in the usual way. This may lead to the broadcast of Notifications to +trigger ICommands or to communicate with other IMediators. IProxy and ICommand +instances communicate with each other and IMediators +by broadcasting INotifications.

+

A key difference between Flash Events and PureMVC +Notifications is that Events follow the +'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy +until some parent component handles the Event, while +PureMVC Notifications follow a 'Publish/Subscribe' +pattern. PureMVC classes need not be related to each other in a +parent/child relationship in order to communicate with one another +using Notifications.

+

INotification

+
interface INotification {
    body?: any;
    name: string;
    type?: string;
    toString(): string;
}

Implemented by

Properties

Methods

Properties

body?: any

The body of the notification.

+
name: string

The name of the notification.

+
type?: string

The type of the notification.

+

Methods

  • Get the string representation of the INotification instance

    +

    Returns string

    A string representation of the notification.

    +
diff --git a/docs/interfaces/INotifier.html b/docs/interfaces/INotifier.html new file mode 100644 index 0000000..d4a7edd --- /dev/null +++ b/docs/interfaces/INotifier.html @@ -0,0 +1,21 @@ +INotifier | @puremvc/puremvc-typescript-multicore-framework

INotifier The interface definition for a PureMVC Notifier.

+

MacroCommand, Command, Mediator and Proxy +all have a need to send Notifications.

+

The INotifier interface provides a common method called +sendNotification that relieves implementation code of +the necessity to actually construct Notifications.

+

The Notifier class, which all the above-mentioned classes +extend, also provides an initialized reference to the Facade +Singleton, which is required for the convenience method +for sending Notifications, but also eases implementation as these +classes have frequent Facade interactions and usually require +access to the facade anyway.

+

INotifier

+
interface INotifier {
    sendNotification(notificationName: string, body?: any, type?: string): void;
}

Hierarchy (view full)

Implemented by

Methods

  • Send a INotification.

    +

    Convenience method to prevent having to construct new +notification instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to send.

      +
    • Optionalbody: any

      Optional data associated with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/interfaces/IObserver.html b/docs/interfaces/IObserver.html new file mode 100644 index 0000000..5cd901b --- /dev/null +++ b/docs/interfaces/IObserver.html @@ -0,0 +1,45 @@ +IObserver | @puremvc/puremvc-typescript-multicore-framework

IObserver The interface definition for a PureMVC Observer.

+

In PureMVC, IObserver implementors assume these responsibilities:

+
    +
  • +

    Encapsulate the notification (callback) method of the interested object.

    +
  • +
  • +

    Encapsulate the notification context (self) of the interested object.

    +
  • +
  • +

    Provide methods for setting the interested object notification method and context.

    +
  • +
  • +

    Provide a method for notifying the interested object.

    +
  • +
+

PureMVC does not rely upon underlying event +models such as the one provided with Flash, +and ActionScript 3 does not have an inherent +event model.

+

The Observer Pattern as implemented within +PureMVC exists to support event driven communication +between the application and the actors of the +MVC triad.

+

An Observer is an object that encapsulates information +about an interested object with a notification method that +should be called when an INotification is broadcast. +The Observer then acts as a proxy for notifying the interested object.

+

Observers can receive Notifications by having their +notifyObserver method invoked, passing +in an object implementing the INotification interface, such +as a subclass of Notification.

+

IObserver

+
interface IObserver {
    notifyContext?: any;
    notifyMethod?: null | ((notification: INotification) => void);
    compareNotifyContext(object: any): boolean;
    notifyObserver(notification: INotification): void;
}

Implemented by

Properties

notifyContext?: any

The context in which the notification method should be called.

+
notifyMethod?: null | ((notification: INotification) => void)

The method to be called when a notification is received.

+

Methods

  • Compare the given object to the notification context object.

    +

    Parameters

    • object: any

      The object to compare with the notifyContext.

      +

    Returns boolean

    true if the object is the same as the notifyContext, otherwise false.

    +
  • Notify the interested object.

    +

    Parameters

    • notification: INotification

      the INotification to pass to the interested object's notification method

      +

    Returns void

diff --git a/docs/interfaces/IProxy.html b/docs/interfaces/IProxy.html new file mode 100644 index 0000000..56eaa45 --- /dev/null +++ b/docs/interfaces/IProxy.html @@ -0,0 +1,45 @@ +IProxy | @puremvc/puremvc-typescript-multicore-framework

IProxy The interface definition for a PureMVC Proxy.

+

In PureMVC, IProxy implementors assume these responsibilities:

+
    +
  • +

    Implement a common method which returns the name of the Proxy.

    +
  • +
  • +

    Provide methods for setting and getting the data object.

    +
  • +
+

Additionally, IProxyies typically:

+
    +
  • +

    Maintain references to one or more pieces of model data.

    +
  • +
  • +

    Provide methods for manipulating that data.

    +
  • +
  • +

    Generate INotifications when their model data changes.

    +
  • +
  • +

    Expose their name as a public static const called NAME, if they are not instantiated multiple times.

    +
  • +
  • +

    Encapsulate interaction with local or remote services used to fetch and persist model data.

    +
  • +
+

IProxy

+
interface IProxy {
    data?: any;
    name: string;
    onRegister(): void;
    onRemove(): void;
    sendNotification(notificationName: string, body?: any, type?: string): void;
}

Hierarchy (view full)

Implemented by

Properties

data?: any

The data associated with the proxy.

+
name: string

The name of the proxy.

+

Methods

  • Called by the Model when the Proxy is registered

    +

    Returns void

  • Called by the Model when the Proxy is removed

    +

    Returns void

  • Send a INotification.

    +

    Convenience method to prevent having to construct new +notification instances in our implementation code.

    +

    Parameters

    • notificationName: string

      The name of the notification to send.

      +
    • Optionalbody: any

      Optional data associated with the notification.

      +
    • Optionaltype: string

      Optional type of the notification.

      +

    Returns void

diff --git a/docs/interfaces/IView.html b/docs/interfaces/IView.html new file mode 100644 index 0000000..e3ea380 --- /dev/null +++ b/docs/interfaces/IView.html @@ -0,0 +1,62 @@ +IView | @puremvc/puremvc-typescript-multicore-framework

IView The interface definition for a PureMVC View.

+

In PureMVC, the View class assumes these responsibilities:

+
    +
  • +

    Maintain a cache of IMediator instances.

    +
  • +
  • +

    Provide methods for registering, retrieving, and removing IMediators.

    +
  • +
  • +

    Managing the observer lists for each INotification in the application.

    +
  • +
  • +

    Providing a method for attaching IObservers to an INotification's observer list.

    +
  • +
  • +

    Providing a method for broadcasting an INotification.

    +
  • +
  • +

    Notifying the IObservers of a given INotification when it is broadcast.

    +
  • +
+

IView

+
interface IView {
    hasMediator(mediatorName: string): boolean;
    notifyObservers(notification: INotification): void;
    registerMediator(mediator: IMediator): void;
    registerObserver(notificationName: string, observer: IObserver): void;
    removeMediator(mediatorName: string): null | IMediator;
    removeObserver(notificationName: string, notifyContext: any): void;
    retrieveMediator(mediatorName: string): null | IMediator;
}

Implemented by

Methods

  • Check if a IMediator is registered or not

    +

    Parameters

    • mediatorName: string

      The name of the IMediator to check.

      +

    Returns boolean

    true if the IMediator is registered, otherwise false.

    +
  • Notify the IObservers for a particular INotification.

    +

    All previously attached IObservers for this INotification's +list are notified and are passed a reference to the INotification in +the order in which they were registered.

    +

    Parameters

    • notification: INotification

      the INotification to notify IObservers of.

      +

    Returns void

  • Register an IMediator instance with the View.

    +

    Registers the IMediator so that it can be retrieved by name, +and further interrogates the IMediator for its +INotification interests.

    +

    If the IMediator returns any INotification +names to be notified about, an Observer is created encapsulating +the IMediator instance's handleNotification method +and registering it as an Observer for all INotifications the +IMediator is interested in.

    +

    Parameters

    • mediator: IMediator

      The IMediator to be registered.

      +

    Returns void

  • Register an IObserver to be notified +of INotifications with a given name.

    +

    Parameters

    • notificationName: string

      The name of the notification to register the observer for.

      +
    • observer: IObserver

      The observer to be registered.

      +

    Returns void

  • Remove an IMediator from the View.

    +

    Parameters

    • mediatorName: string

      name of the IMediator instance to be removed.

      +

    Returns null | IMediator

    The removed IMediator, or null if not found.

    +
  • Remove a group of observers from the observer list for a given Notification name.

    +

    Parameters

    • notificationName: string

      which observer list to remove from

      +
    • notifyContext: any

      removed the observers with this object as their notifyContext

      +

    Returns void

  • Retrieve an IMediator from the View.

    +

    Parameters

    • mediatorName: string

      the name of the IMediator instance to retrieve.

      +

    Returns null | IMediator

    The IMediator associated with the given name, or null if not found.

    +
diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 0000000..8e81dd1 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,22 @@ +@puremvc/puremvc-typescript-multicore-framework
diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..8adeae0 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/__tests__/**/*.ts?(x)", "**/?(*.)+(spec|test).ts?(x)"], + maxWorkers: 11, +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ae3ab6f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5326 @@ +{ + "name": "@puremvc/puremvc-typescript-multicore-framework", + "version": "2.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@puremvc/puremvc-typescript-multicore-framework", + "version": "2.0.1", + "license": "BSD-3-Clause", + "bin": { + "puremvc-js-multicore-framework": "bin/esm/index.js" + }, + "devDependencies": { + "@types/jest": "^29.5.10", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@typescript-eslint/parser": "^6.13.2", + "eslint": "^8.55.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "typedoc": "^0.26.11", + "typescript": "^5.6.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@shikijs/core": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.2.tgz", + "integrity": "sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.2.tgz", + "integrity": "sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.2.tgz", + "integrity": "sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.2.tgz", + "integrity": "sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "20.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001565", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.601", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "dev": true, + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regex": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.4.0.tgz", + "integrity": "sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.2.tgz", + "integrity": "sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.22.2", + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.26.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", + "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..77b5ec7 --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "@puremvc/puremvc-typescript-multicore-framework", + "version": "2.0.0", + "description": "PureMVC MultiCore Framework for TypeScript", + "main": "bin/cjs/index.js", + "module": "bin/esm/index.js", + "types": "bin/types/index.d.ts", + "exports": { + ".": { + "require": "./bin/cjs/index.cjs", + "import": "./bin/esm/index.js" + } + }, + "scripts": { + "build": "npm run clean && npm run build:lib", + "build:lib": "npm run build:cjs && npm run build:esm", + "build:esm": "tsc --module esnext --outDir bin/esm", + "build:cjs": "tsc --module commonjs --outDir bin/cjs", + "build:doc": "typedoc", + "clean": "rm -rf bin", + "test": "jest", + "npm:publish:dry-run": "npm publish --dry-run", + "npm:publish": "npm publish --access public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/PureMVC/puremvc-typescript-multicore-framework.git" + }, + "homepage": "https://puremvc.org", + "bugs": { + "url": "https://github.com/PureMVC/puremvc-typescript-multicore-framework/issues" + }, + "keywords": [ + "puremvc", + "typescript", + "mvc" + ], + "files": [ + "bin/**/*.*", + "LICENSE", + "VERSION", + "package.json" + ], + "author": "Saad Shams ", + "license": "BSD-3-Clause", + "directories": { + "doc": "docs", + "test": "test", + "bin": "bin" + }, + "devDependencies": { + "@types/jest": "^29.5.10", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@typescript-eslint/parser": "^6.13.2", + "eslint": "^8.55.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "typedoc": "^0.26.11", + "typescript": "^5.6.3" + } +} diff --git a/src/core/Controller.ts b/src/core/Controller.ts new file mode 100644 index 0000000..93bfd8a --- /dev/null +++ b/src/core/Controller.ts @@ -0,0 +1,187 @@ +// +// Controller.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IController} from "../interfaces/IController"; +import {IView} from "../interfaces/IView"; +import {View} from "./View"; +import {ICommand} from "../interfaces/ICommand"; +import {INotification} from "../interfaces/INotification"; +import {Observer} from "../patterns/observer/Observer"; + +/** + * A Singleton `Controller` implementation. + * + * In PureMVC, the `Controller` class follows the + * 'Command and Controller' strategy, and assumes these + * responsibilities: + * + * + * - Remembering which `Command`s + * are intended to handle which `Notifications`. + * - Registering itself as an `Observer` with + * the `View` for each `Notification` + * that it has a `Command` mapping for. + * - Creating a new instance of the proper `Command` + * to handle a given `Notification` when notified by the `View`. + * - Calling the `Command`'s `execute` + * method, passing in the `Notification`. + * + * + * Your application must register `Commands` with the + * Controller. + * + * The simplest way is to subclass `Facade`, + * and use its `initializeController` method to add your + * registrations. + * + * @see {@link View} + * @see {@link Observer} + * @see {@link Notification} + * @see {@link SimpleCommand} + * @see {@link MacroCommand} + * + * @class Controller + */ +export class Controller implements IController { + + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string = "Controller Singleton already constructed!"; + + /** + * Singleton instance + * + * @type {IController} + * @protected + */ + protected static instance: IController; + + /** Local reference to View + * @type {IView | undefined} */ + protected view?: IView; + + /** Mapping of Notification names to Command factories + * @type {{ [key: string]: () => ICommand }} */ + protected commandMap: { [key: string]: () => ICommand }; + + /** + * Constructor. + * + * This `Controller` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton Factory method, + * `Controller.getInstance()` + * + * @throws {Error} Error if instance for this Singleton has already been constructed + */ + public constructor() { + if (Controller.instance != null) {throw Error(Controller.SINGLETON_MSG);} + Controller.instance = this; + this.commandMap = {}; + this.initializeController(); + } + + /** + * Initialize the Singleton `Controller` instance. + * + * Called automatically by the constructor. + * + * Note that if you are using a subclass of `View` + * in your application, you should also subclass `Controller` + * and override the `initializeController` method in the + * following way: + * + * ```ts + * // ensure that the Controller is talking to my View implementation + * initializeController() { + * this.view = MyView.getInstance(() => new View()); + * } + * ``` + * @returns {void} + */ + protected initializeController(): void { + this.view = View.getInstance(() => new View()); + } + + /** + * `Controller` Singleton Factory method. + * + * @param {() => IController} factory - A factory function that creates a new instance of the controller if one does not already exist. + * @returns {IController} the Singleton instance of `Controller`. + */ + public static getInstance(factory: () => IController): IController { + if (Controller.instance == null) + Controller.instance = factory(); + return Controller.instance; + } + + /** + * Register a particular `Command` class as the handler + * for a particular `Notification`. + * + * If an `Command` has already been registered to + * handle `Notification`s with this name, it is no longer + * used, the new `Command` is used instead. + * + * The Observer for the new Command is only created if this the + * first time a Command has been registered for this Notification name. + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of the command. + * @returns {void} + */ + public registerCommand(notificationName: string, factory: () => ICommand): void { + if (this.commandMap[notificationName] == null) { + this.view?.registerObserver(notificationName, new Observer(this.executeCommand, this)); + } + this.commandMap[notificationName] = factory; + } + + /** + * If a `Command` has previously been registered + * to handle the given `Notification`, then it is executed. + * + * @param {INotification} notification - The notification containing the data or command details needed for execution. + * @returns {void} + */ + public executeCommand(notification: INotification): void { + const factory: () => ICommand = this.commandMap[notification.name]; + if (factory == null) return; + + const command: ICommand = factory(); + command.execute(notification); + } + + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check for a registered command. + * @returns {boolean} `true` if a command is registered for the specified notification name; otherwise, `false`. + */ + public hasCommand(notificationName: string): boolean { + return this.commandMap[notificationName] != null; + } + + /** + * Remove a previously registered `Command` to `Notification` mapping. + * + * @param {string} notificationName - The name of the notification for which the associated command should be removed. + * @returns {void} + */ + public removeCommand(notificationName: string): void { + // if the Command is registered... + if (this.hasCommand(notificationName)) { + // remove the observer + this.view?.removeObserver(notificationName, this); + + // remove the command + delete this.commandMap[notificationName]; + } + } + +} diff --git a/src/core/Model.ts b/src/core/Model.ts new file mode 100644 index 0000000..5cd2692 --- /dev/null +++ b/src/core/Model.ts @@ -0,0 +1,140 @@ +// +// Model.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IModel} from "../interfaces/IModel"; +import {IProxy} from "../interfaces/IProxy"; + +/** + * A Singleton `Model` implementation. + * + * In PureMVC, the `Model` class provides + * access to model objects (Proxies) by named lookup. + * + * The `Model` assumes these responsibilities: + * + * - Maintain a cache of `Proxy` instances. + * - Provide methods for registering, retrieving, and removing + * `Proxy` instances. + * + * Your application must register `Proxy` instances + * with the `Model`. Typically, you use an + * `Command` to create and register `Proxy` + * instances once the `Facade` has initialized the Core + * actors. + * + * @see {@link Proxy} + * + * @class Model + */ +export class Model implements IModel { + + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string = "Model Singleton already constructed!"; + + /** + * Singleton instance + * + * @type {IModel} + * @protected + */ + protected static instance: IModel; + + /** Mapping of proxyNames to IProxy instances + * @type {{ [key: string]: IProxy }} */ + protected proxyMap: { [key: string]: IProxy }; + + /** + * Constructor. + * + * This `Model` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `Model.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + public constructor() { + if (Model.instance != null) throw Error(Model.SINGLETON_MSG); + Model.instance = this; + this.proxyMap = {}; + this.initializeModel(); + } + + /** + * Initialize the `Model` instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + protected initializeModel(): void { + } + + /** + * `Model` Singleton Factory method. + * + * @param {() => IModel} factory - A factory function that creates a new instance of the model if one does not already exist. + * @returns {IModel} The Singleton instance. + */ + public static getInstance(factory: () => IModel): IModel { + if (Model.instance == null) + Model.instance = factory(); + return Model.instance; + } + + /** + * Register a `Proxy` with the `Model`. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + public registerProxy(proxy: IProxy): void { + this.proxyMap[proxy.name] = proxy; + proxy.onRegister(); + } + + /** + * Retrieve a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + public retrieveProxy(proxyName: string): IProxy | null { + return this.proxyMap[proxyName] || null; + } + + /** + * Check if a Proxy is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy with the specified name is registered; otherwise, `false`. + */ + public hasProxy(proxyName: string): boolean { + return this.proxyMap[proxyName] != null; + } + + /** + * Remove a `Proxy` from the `Model`. + * + * @param {string} proxyName - The name of the proxy to be removed. + * @returns {IProxy | null} The removed proxy instance, or `null` if no proxy with the given name was found. + */ + public removeProxy(proxyName: string): IProxy | null { + const proxy: IProxy = this.proxyMap[proxyName]; + if (!proxy) return null; + + delete this.proxyMap[proxyName]; + proxy.onRemove(); + return proxy; + } + +} diff --git a/src/core/View.ts b/src/core/View.ts new file mode 100644 index 0000000..a42036f --- /dev/null +++ b/src/core/View.ts @@ -0,0 +1,257 @@ +// +// View.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IView} from "../interfaces/IView"; +import {IMediator} from "../interfaces/IMediator"; +import {IObserver} from "../interfaces/IObserver"; +import {Observer} from "../patterns/observer/Observer"; +import {INotification} from "../interfaces/INotification"; + +/** + * A Singleton `View` implementation. + * + * In PureMVC, the `View` class assumes these responsibilities: + * + * - Maintain a cache of `Mediator` instances. + * - Provide methods for registering, retrieving, and removing `Mediators`. + * - Notifying `Mediators` when they are registered or removed. + * - Managing the observer lists for each `Notification` in the application. + * - Providing a method for attaching `Observers` to a `Notification`'s observer list. + * - Providing a method for broadcasting a `Notification`. + * - Notifying the `Observers` of a given `Notification` when it broadcast. + * + * @see {@link Mediator} + * @see {@link Observer} + * @see {@link Notification} + * + * @class View + */ +export class View implements IView { + + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string = "View Singleton already constructed!"; + + /** + * Singleton instance + * + * @type {IView} + * @protected + */ + protected static instance: IView; + + /** Mapping of Mediator names to Mediator instances + * @type {{ [key: string]: IMediator }} */ + protected mediatorMap: { [key: string]: IMediator }; + + /** Mapping of Notification names to Observer lists + * @type {{ [key: string]: IObserver[] }} */ + protected observerMap: { [key: string]: IObserver[] }; + + /** + * Constructor. + * + * This `View` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Singleton + * Factory method `View.getInstance()` + * + * @throws {Error} Error if instance for this Singleton has already been constructed + */ + constructor() { + if (View.instance != null) throw Error(View.SINGLETON_MSG); + View.instance = this; + this.mediatorMap = {}; + this.observerMap = {}; + this.initializeView(); + } + + /** + * Initialize the Singleton View instance. + * + * Called automatically by the constructor, this + * is your opportunity to initialize the Singleton + * instance in your subclass without overriding the + * constructor. + * + * @returns {void} + */ + private initializeView(): void { + + } + + /** + * View Singleton factory method. + * + * @param {() => IView} factory - A factory function that creates a new instance of the view if one does not already exist. + * @returns {IView} The view instance. + */ + public static getInstance(factory: () => IView): IView { + if (View.instance == null) + View.instance = factory(); + return View.instance; + } + + /** + * Register an `Observer` to be notified + * of `Notifications` with a given name. + * + * @param {string} notificationName - The name of the notification to which the observer should be registered. + * @param {IObserver} observer - The observer instance to be registered. + * @returns {void} + */ + public registerObserver(notificationName: string, observer: IObserver): void { + if (this.observerMap[notificationName] != null) { + this.observerMap[notificationName].push(observer); + } else { + this.observerMap[notificationName] = [observer]; + } + } + + /** + * Notify the `Observers` for a particular `Notification`. + * + * All previously attached `Observers` for this `Notification`'s + * list are notified and are passed a reference to the `Notification` in + * the order in which they were registered. + * + * @param {INotification} notification - The notification containing the data or command details to be sent to observers. + * @returns {void} + */ + public notifyObservers(notification: INotification): void { + if (this.observerMap[notification.name] == null) return; + + // Get a reference to the observer list for this notification name + // Copy observers from reference array to a working array, + // since the reference array may change during the notification loop + const observers: IObserver[] = this.observerMap[notification.name].slice(); + + // Notify Observers from the working array + for (let i: number = 0; i < observers.length; i++) { + observers[i].notifyObserver(notification); + } + } + + /** + * Remove the observer for a given notifyContext from an observer list for a given Notification name. + * + * @param {string} notificationName - The name of the notification for which the observer should be removed. + * @param {object} notifyContext - The context of the observer to be removed. + * @returns {void} + */ + public removeObserver(notificationName: string, notifyContext: object): void { + // the observer list for the notification under inspection + const observers: IObserver[] = this.observerMap[notificationName]; + + // find the observer for the notifyContext + for (let i: number = 0; i < observers.length; i++) { + if (observers[i].compareNotifyContext(notifyContext)) { + // there can only be one Observer for a given notifyContext + // in any given Observer list, so remove it and break + observers.splice(i, 1); + break; + } + } + + // Also, when a Notification's Observer list length falls to + // zero, delete the notification key from the observer map + if (observers.length == 0) { + delete this.observerMap[notificationName]; + } + } + + /** + * Register a `Mediator` instance with the `View`. + * + * Registers the `Mediator` so that it can be retrieved by name, + * and further interrogates the `Mediator` for its + * `Notification` interests. + * + * If the `Mediator` returns any `Notification` + * names to be notified about, an `Observer` is created encapsulating + * the `Mediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `Notifications` the + * `Mediator` is interested in. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + public registerMediator(mediator: IMediator): void { + // do not allow re-registration (you must to removeMediator fist) + if (this.mediatorMap[mediator.name] != null) return; + + // Register the Mediator for retrieval by name + this.mediatorMap[mediator.name] = mediator; + + // Get Notification interests, if any. + const interests: string[] = mediator.listNotificationInterests(); + + // Register Mediator as an observer for each notification of interests + if (interests.length > 0) { + // Create Observer referencing this mediator's handleNotification method + const observer: IObserver = new Observer(mediator.handleNotification, mediator); + + // Register Mediator as Observer for its list of Notification interests + for (let i: number = 0; i < interests.length; i++) { + this.registerObserver(interests[i], observer); + } + } + + // alert the mediator that it has been registered + mediator.onRegister(); + } + + /** + * Retrieve a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + public retrieveMediator(mediatorName: string): IMediator | null { + return this.mediatorMap[mediatorName] || null; + } + + /** + * Check if a Mediator is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator with the specified name is registered; otherwise, `false`. + */ + public hasMediator(mediatorName: string): boolean { + return this.mediatorMap[mediatorName] != null; + } + + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to be removed. + * @returns {IMediator | null} The removed mediator instance, or `null` if no mediator with the given name was found. + */ + public removeMediator(mediatorName: string): IMediator | null { + // Retrieve the named mediator + const mediator: IMediator = this.mediatorMap[mediatorName]; + if (mediator == null) return null; + + // for every notification this mediator is interested in... + const interests: string[] = mediator.listNotificationInterests(); + for (let i: number = 0; i < interests.length; i++) { + // remove the observer linking the mediator + // to the notification interest + this.removeObserver(interests[i], mediator); + } + + // remove the mediator from the map + delete this.mediatorMap[mediatorName]; + + // alert the mediator that it has been removed + mediator.onRemove(); + + return mediator; + } + +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..ab4cc62 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,30 @@ +// +// index.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +export type {IController} from "./interfaces/IController"; +export type {IModel} from "./interfaces/IModel"; +export type {IView} from "./interfaces/IView"; +export type {ICommand} from "./interfaces/ICommand"; +export type {IFacade} from "./interfaces/IFacade"; +export type {IMediator} from "./interfaces/IMediator"; +export type {INotification} from "./interfaces/INotification"; +export type {INotifier} from "./interfaces/INotifier"; +export type {IObserver} from "./interfaces/IObserver"; +export type {IProxy} from "./interfaces/IProxy"; + +export {Controller} from "./core/Controller"; +export {Model} from "./core/Model"; +export {View} from "./core/View"; +export {MacroCommand} from "./patterns/command/MacroCommand"; +export {SimpleCommand} from "./patterns/command/SimpleCommand"; +export {Facade} from "./patterns/facade/Facade"; +export {Mediator} from "./patterns/mediator/Mediator"; +export {Notification} from "./patterns/observer/Notification"; +export {Notifier} from "./patterns/observer/Notifier"; +export {Observer} from "./patterns/observer/Observer"; +export {Proxy} from "./patterns/proxy/Proxy"; diff --git a/src/interfaces/ICommand.ts b/src/interfaces/ICommand.ts new file mode 100644 index 0000000..d8a3f9f --- /dev/null +++ b/src/interfaces/ICommand.ts @@ -0,0 +1,28 @@ +// +// ICommand.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotifier} from "./INotifier"; +import {INotification} from "./INotification"; + +/** + * The interface definition for a PureMVC Command. + * + * @see {@link INotification} + * + * @interface ICommand + * @extends {INotifier} + */ +export interface ICommand extends INotifier { + /** + * Execute the `ICommand`'s logic to handle a given `INotification`. + * + * @param {INotification} notification - The notification carrying the data and type necessary for executing the command. + * @returns {void} + */ + execute(notification: INotification): void; +} diff --git a/src/interfaces/IController.ts b/src/interfaces/IController.ts new file mode 100644 index 0000000..b45274b --- /dev/null +++ b/src/interfaces/IController.ts @@ -0,0 +1,64 @@ +// +// IController.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {ICommand} from "./ICommand"; +import {INotification} from "./INotification"; + +/** + * `IController` The interface definition for a PureMVC `Controller`. + * + * In PureMVC, an `IController` implementor + * follows the 'Command and Controller' strategy, and + * assumes these responsibilities: + * + * - Remembering which `ICommands` are intended to handle which `INotifications`. + * + * - Registering itself as an `IObserver` with the View for each `INotification` that it has an `ICommand` mapping for. + * + * - Creating a new instance of the proper `ICommand` to handle a given `INotification` when notified by the `View`. + * + * - Calling the `ICommand`'s execute method, passing in the `INotification`. + * + * @interface IController + */ +export interface IController { + /** + * Register a particular `ICommand` class as the handler + * for a particular INotification. + * + * @param {string} notificationName - the name of the `INotification` + * @param {() => ICommand} factory - A factory that returns `ICommand` + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + + /** + * Execute the `ICommand` previously registered as the + * handler for `INotifications` with the given notification name. + * + * @param {INotification} notification - the `INotification` to execute the associated `ICommand` for + * @returns {void} + */ + executeCommand(notification: INotification): void; + + /** + * Check if a `Command` is registered for a given `Notification` + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification name, `false` otherwise. + */ + hasCommand(notificationName: string): boolean; + + /** + * Remove a previously registered `ICommand` to `INotification` mapping. + * + * @param {string} notificationName - the name of the INotification to remove the ICommand mapping for + * @returns {void} + */ + removeCommand(notificationName: string): void; +} diff --git a/src/interfaces/IFacade.ts b/src/interfaces/IFacade.ts new file mode 100644 index 0000000..4be4405 --- /dev/null +++ b/src/interfaces/IFacade.ts @@ -0,0 +1,136 @@ +// +// IFacade.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotifier} from "./INotifier"; +import {ICommand} from "./ICommand"; +import {IMediator} from "./IMediator"; +import {INotification} from "./INotification"; +import {IProxy} from "./IProxy"; + +/** + * `IFacade` The interface definition for a PureMVC `Facade`. + * + * The `Facade` Pattern suggests providing a single + * class to act as a central point of communication + * for a subsystem. + * + * In PureMVC, the `Facade` acts as an interface between + * the core MVC actors (`Model`, `View`, `Controller`) and + * the rest of your application. + * + * @interface IFacade + * @extends {INotifier} + */ +export interface IFacade extends INotifier { + + /** + * Register an `ICommand` with the `Controller` + * + * @param {string} notificationName - the name of the `INotification` to associate the `ICommand` with. + * @param {() => ICommand} factory - A factory that creates an instance of the `ICommand` to be registered. + * @returns {void} + */ + registerCommand(notificationName: string, factory: () => ICommand): void; + + /** + * Check if a `ICommand` is registered for a given `Notification` + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification name, `false` otherwise. + */ + hasCommand(notificationName: string): boolean; + + /** + * Remove a previously registered `ICommand` to `INotification` mapping from the `Controller`. + * + * @param {string} notificationName - the name of the `INotification` to remove the `ICommand` mapping for + * @returns {void} + */ + removeCommand(notificationName: string): void; + + /** + * Register an `IProxy` with the `Model` by name. + * + * @param {IProxy} proxy - the IProxy to be registered with the Model. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + + /** + * Retrieve a `IProxy` from the `Model` by name. + * + * @param {string} proxyName - the name of the `IProxy` instance to be retrieved. + * @returns {IProxy | null} the `IProxy` previously registered by `proxyName` with the `Model`. + */ + retrieveProxy(proxyName: string): IProxy | null; + + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered with the name, `false` otherwise. + */ + hasProxy(proxyName: string): boolean; + + /** + * Remove an `IProxy` instance from the `Model` by name. + * + * @param {string} proxyName - the `IProxy` to remove from the `Model`. + * @returns {IProxy | null} The removed proxy instance if found, or `null` if no proxy was registered with the given name. + */ + removeProxy(proxyName: string): IProxy | null; + + /** + * Register an `IMediator` instance with the `View`. + * + * @param {IMediator} mediator - a reference to the `IMediator` instance + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + + /** + * Retrieve an `IMediator` instance from the `View`. + * + * @param {string} mediatorName - the name of the `IMediator` instance to retrieve + * @returns {IMediator | null} The mediator instance if found, or `null` if no mediator is registered with the given name. + */ + retrieveMediator(mediatorName: string): IMediator | null; + + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered with the name, `false` otherwise. + */ + hasMediator(mediatorName: string): boolean; + + /** + * Remove a `IMediator` instance from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance if found, or `null` if no mediator was registered with the given name. + */ + removeMediator(mediatorName: string): IMediator | null; + + /** + * Notify Observers. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - the `INotification` to have the `View` notify `Observers` of. + * @returns {void} + */ + notifyObservers(notification: INotification): void; + +} diff --git a/src/interfaces/IMediator.ts b/src/interfaces/IMediator.ts new file mode 100644 index 0000000..4d6d435 --- /dev/null +++ b/src/interfaces/IMediator.ts @@ -0,0 +1,90 @@ +// +// IMediator.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotifier} from "./INotifier"; +import {INotification} from "./INotification"; + +/** + * `IMediator` The interface definition for a PureMVC `Mediator`. + * + * In PureMVC, `IMediator` implementors assume these responsibilities: + * + * - Implement a common method which returns a list of all `INotifications` the `IMediator` has interest in. + * + * - Implement a notification callback method. + * + * - Implement methods that are called when the `IMediator` is registered or removed from the View. + * + * Additionally, `IMediators` typically: + * + * - Act as an intermediary between one or more view components such as text boxes or list controls, maintaining references and coordinating their behavior. + * + * - In Flash-based apps, this is often the place where event listeners are added to view components, and their handlers implemented. + * + * - Respond to and generate `INotifications`, interacting with of the rest of the PureMVC app. + * + * When an `IMediator` is registered with the `IView`, + * the `IView` will call the `IMediator`'s + * `listNotificationInterests` method. The `IMediator` will + * return an Array of `INotification` names which + * it wishes to be notified about. + * + * The `IView` will then create an `Observer` object + * encapsulating that `IMediator`'s (`handleNotification`) method + * and register it as an `Observer` for each `INotification` name returned by + * `listNotificationInterests`. + * + * @interface IMediator + * @extends {INotifier} + */ +export interface IMediator extends INotifier { + + /** + * The name of the mediator. + * + * @type {string} + */ + readonly name: string; + + /** + * The view component associated with the mediator. + * + * @type {any} + */ + viewComponent: any; + + /** + * Called by the View when the `Mediator` is registered + * + * @returns {void} + */ + onRegister(): void; + + /** + * Called by the View when the `Mediator` is removed + * + * @returns {void} + */ + onRemove(): void; + + /** + * List `INotification` interests. + * + * @returns {string[]} an Array of the `INotification` names this `IMediator` has an interest in. + */ + listNotificationInterests(): string[]; + + /** + * Handle an `INotification`. + * + * @param {INotification} notification - the `INotification` to be handled + * @returns {void} + */ + handleNotification(notification: INotification): void; + +} diff --git a/src/interfaces/IModel.ts b/src/interfaces/IModel.ts new file mode 100644 index 0000000..8957a46 --- /dev/null +++ b/src/interfaces/IModel.ts @@ -0,0 +1,58 @@ +// +// IModel.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IProxy} from "./IProxy"; + +/** + * `IModel` The interface definition for a PureMVC `Model`. + * + * In PureMVC, `IModel` implementors provide + * access to `IProxy` objects by named lookup. + * + * An `IModel` assumes these responsibilities: + * + * - Maintain a cache of `IProxy` instances + * + * - Provide methods for registering, retrieving, and removing `IProxy` instances + * + * @interface IModel + */ +export interface IModel { + + /** + * Register an `IProxy` instance with the `Model`. + * + * @param {IProxy} proxy - an object reference to be held by the `Model`. + * @returns {void} + */ + registerProxy(proxy: IProxy): void; + + /** + * Retrieve an `IProxy` instance from the `Model`. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The `IProxy` if registered, otherwise null. + */ + retrieveProxy(proxyName: string): IProxy | null; + + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} True if the `IProxy` is registered, otherwise false. + */ + hasProxy(proxyName: string): boolean; + + /** + * Remove an `IProxy` instance from the `Model`. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed `IProxy` if found, otherwise null. + */ + removeProxy(proxyName: string): IProxy | null; +} diff --git a/src/interfaces/INotification.ts b/src/interfaces/INotification.ts new file mode 100644 index 0000000..dd02fe4 --- /dev/null +++ b/src/interfaces/INotification.ts @@ -0,0 +1,68 @@ +// +// INotification.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +/** + * `INotification` The interface definition for a PureMVC `Notification`. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The `Observer` Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * `Notifications` are not meant to be a replacement for Events + * in Flex/Flash/AIR. Generally, `IMediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notifications` to + * trigger `ICommands` or to communicate with other `IMediators`. `IProxy` and `ICommand` + * instances communicate with each other and `IMediators` + * by broadcasting `INotifications`. + * + * A key difference between Flash Events and PureMVC + * `Notifications` is that Events follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the Event, while + * PureMVC `Notifications` follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notifications`. + * + * @interface INotification + */ +export interface INotification { + + /** + * The name of the notification. + * + * @type {string} + */ + readonly name: string; + + /** + * The body of the notification. + * + * @type {any} + */ + body?: any; + + /** + * The type of the notification. + * + * @type {string} + */ + type?: string; + + /** + * Get the string representation of the `INotification` instance + * + * @returns {string} A string representation of the notification. + */ + toString(): string; +} diff --git a/src/interfaces/INotifier.ts b/src/interfaces/INotifier.ts new file mode 100644 index 0000000..91f9729 --- /dev/null +++ b/src/interfaces/INotifier.ts @@ -0,0 +1,42 @@ +// +// INotifier.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +/** + * `INotifier` The interface definition for a PureMVC `Notifier`. + * + * `MacroCommand`, `Command`, `Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `INotifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, also provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @interface INotifier + */ +export interface INotifier { + + /** + * Send a `INotification`. + * + * Convenience method to prevent having to construct new + * notification instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to send. + * @param {any} [body] - Optional data associated with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + sendNotification(notificationName: string, body?: any, type?: string): void; +} diff --git a/src/interfaces/IObserver.ts b/src/interfaces/IObserver.ts new file mode 100644 index 0000000..e97c8c1 --- /dev/null +++ b/src/interfaces/IObserver.ts @@ -0,0 +1,78 @@ +// +// IObserver.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotification} from "./INotification"; + +/** + * `IObserver` The interface definition for a PureMVC `Observer`. + * + * In PureMVC, `IObserver` implementors assume these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * + * - Encapsulate the notification context (self) of the interested object. + * + * - Provide methods for setting the interested object notification method and context. + * + * - Provide a method for notifying the interested object. + * + * PureMVC does not rely upon underlying event + * models such as the one provided with Flash, + * and ActionScript 3 does not have an inherent + * event model. + * + * The `Observer` Pattern as implemented within + * PureMVC exists to support event driven communication + * between the application and the actors of the + * MVC triad. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a notification method that + * should be called when an `INotification` is broadcast. + * The Observer then acts as a proxy for notifying the interested object. + * + * Observers can receive Notifications by having their + * `notifyObserver` method invoked, passing + * in an object implementing the `INotification` interface, such + * as a subclass of `Notification`. + * + * @interface IObserver + */ +export interface IObserver { + + /** + * The method to be called when a notification is received. + * + * @type {((notification: INotification) => void) | null} + */ + notifyMethod?: ((notification: INotification) => void) | null; + + /** + * The context in which the notification method should be called. + * + * @type {any | null} + */ + notifyContext?: any | null; + + /** + * Notify the interested object. + * + * @param {INotification} notification - the `INotification` to pass to the interested object's notification method + * @returns {void} + */ + notifyObserver(notification: INotification): void; + + /** + * Compare the given object to the notification context object. + * + * @param {any} object - The object to compare with the `notifyContext`. + * @returns {boolean} `true` if the object is the same as the `notifyContext`, otherwise `false`. + */ + compareNotifyContext(object: any): boolean; + +} diff --git a/src/interfaces/IProxy.ts b/src/interfaces/IProxy.ts new file mode 100644 index 0000000..187fc89 --- /dev/null +++ b/src/interfaces/IProxy.ts @@ -0,0 +1,65 @@ +// +// IProxy.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotifier} from "./INotifier"; + +/** + * `IProxy` The interface definition for a PureMVC `Proxy`. + * + * In PureMVC, `IProxy` implementors assume these responsibilities: + * + * - Implement a common method which returns the name of the Proxy. + * + * - Provide methods for setting and getting the data object. + * + * Additionally, `IProxy`ies typically: + * + * - Maintain references to one or more pieces of model data. + * + * - Provide methods for manipulating that data. + * + * - Generate `INotifications` when their model data changes. + * + * - Expose their name as a public static const called `NAME`, if they are not instantiated multiple times. + * + * - Encapsulate interaction with local or remote services used to fetch and persist model data. + * + * @interface IProxy + * @extends INotifier + */ +export interface IProxy extends INotifier { + + /** + * The name of the proxy. + * + * @type {string} + */ + readonly name: string; + + /** + * The data associated with the proxy. + * + * @type {any} + */ + data?: any; + + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + onRegister(): void; + + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + onRemove(): void; + +} diff --git a/src/interfaces/IView.ts b/src/interfaces/IView.ts new file mode 100644 index 0000000..3e85a42 --- /dev/null +++ b/src/interfaces/IView.ts @@ -0,0 +1,106 @@ +// +// IView.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IMediator} from "./IMediator"; +import {INotification} from "./INotification"; +import {IObserver} from "./IObserver"; + +/** + * `IView` The interface definition for a PureMVC `View`. + * + * In PureMVC, the View class assumes these responsibilities: + * + * - Maintain a cache of `IMediator` instances. + * + * - Provide methods for registering, retrieving, and removing `IMediators`. + * + * - Managing the observer lists for each `INotification` in the application. + * + * - Providing a method for attaching `IObservers` to an `INotification`'s observer list. + * + * - Providing a method for broadcasting an `INotification`. + * + * - Notifying the `IObservers` of a given `INotification` when it is broadcast. + * + * @interface IView + */ +export interface IView { + + /** + * Register an `IObserver` to be notified + * of `INotifications` with a given name. + * + * @param {string} notificationName - The name of the notification to register the observer for. + * @param {IObserver} observer - The observer to be registered. + * @returns {void} + */ + registerObserver(notificationName: string, observer: IObserver): void; + + /** + * Notify the `IObservers` for a particular `INotification`. + * + * All previously attached `IObservers` for this `INotification`'s + * list are notified and are passed a reference to the `INotification` in + * the order in which they were registered. + * + * @param {INotification} notification - the `INotification` to notify `IObservers` of. + * @returns {void} + */ + notifyObservers(notification: INotification): void; + + /** + * Remove a group of observers from the observer list for a given Notification name. + * + * @param {string} notificationName - which observer list to remove from + * @param {any} notifyContext - removed the observers with this object as their `notifyContext` + * @returns {void} + */ + removeObserver(notificationName: string, notifyContext: any): void; + + /** + * Register an `IMediator` instance with the View. + * + * Registers the `IMediator` so that it can be retrieved by name, + * and further interrogates the `IMediator` for its + * `INotification` interests. + * + * If the `IMediator` returns any `INotification` + * names to be notified about, an `Observer` is created encapsulating + * the `IMediator` instance's `handleNotification` method + * and registering it as an `Observer` for all `INotifications` the + * `IMediator` is interested in. + * + * @param {IMediator} mediator - The `IMediator` to be registered. + * @returns {void} + */ + registerMediator(mediator: IMediator): void; + + /** + * Retrieve an `IMediator` from the View. + * + * @param {string} mediatorName - the name of the `IMediator` instance to retrieve. + * @returns {IMediator | null} The `IMediator` associated with the given name, or `null` if not found. + */ + retrieveMediator(mediatorName: string): IMediator | null; + + /** + * Check if a `IMediator` is registered or not + * + * @param {string} mediatorName - The name of the `IMediator` to check. + * @returns {boolean} `true` if the `IMediator` is registered, otherwise `false`. + */ + hasMediator(mediatorName: string): boolean; + + /** + * Remove an `IMediator` from the View. + * + * @param {string} mediatorName - name of the `IMediator` instance to be removed. + * @returns {IMediator | null} The removed `IMediator`, or `null` if not found. + */ + removeMediator(mediatorName: string): IMediator | null; +} diff --git a/src/org/puremvc/typescript/core/Controller.ts b/src/org/puremvc/typescript/core/Controller.ts deleted file mode 100644 index 1cc1a9a..0000000 --- a/src/org/puremvc/typescript/core/Controller.ts +++ /dev/null @@ -1,210 +0,0 @@ -/// -/// -/// -/// -/// -/// - -module puremvc -{ - "use strict"; - - /** - * The Controller class for PureMVC. - * - * A singleton IController implementation. - * - * In PureMVC, the Controller class follows the 'Command and Controller' strategy, - * and assumes these responsibilities: - * - *
    - *
  • Remembering which ICommands are intended to handle which - * INotifications. - *
  • Registering itself as an IObserver with the View for each - * INotification that it has an ICommand mapping for. - *
  • Creating a new instance of the proper ICommand to handle a given - * INotification when notified by the View. - *
  • Calling the ICommand's execute method, passing in the - * INotification. - * - * Your application must register ICommands with the Controller. - * - * The simplest way is to subclass Facade, and use its - * initializeController method to add your registrations. - */ - export class Controller - implements IController - { - /** - * Local reference to the View singleton. - * - * @protected - */ - view:IView = null; - - /** - * Mapping of Notification names to Command constructors references. - * - * @protected - */ - commandMap:Object = null; - - /** - /** - * Constructs a Controller instance. - * - * This IController implementation is a singleton, so you should not call the - * constructor directly, but instead call the static singleton Factory method - * Controller.getInstance(). - * - * @throws Error - * Throws an error if an instance for this singleton has already been constructed. - */ - constructor() - { - if( Controller.instance ) - throw Error( Controller.SINGLETON_MSG ); - - Controller.instance = this; - this.commandMap = {}; - this.initializeController(); - } - - /** - * Initialize the singleton Controller instance. - * - * Called automatically by the constructor. - * - * Note that if you are using a subclass of View in your application, you - * should also subclass Controller and override the - * initializeController method in the following way: - * - *
    -		 *		// ensure that the Controller is talking to my IView implementation
    -		 *		initializeController():void
    -		 *		{
    -		 *			this.view = MyView.getInstance();
    -		 *		}
    -		 * 
    - * - * @protected - */ - initializeController():void - { - this.view = View.getInstance(); - } - - /** - * If an ICommand has previously been registered to handle the given - * INotification, then it is executed. - * - * @param notification - * The INotification the command will receive as parameter. - */ - executeCommand( notification:INotification ):void - { - /* - * Typed any here instead of Function ( won't compile if set to Function - * because today the compiler consider that Function is not newable and - * doesn't have a Class type) - */ - var commandClassRef:any = this.commandMap[ notification.getName() ]; - if( commandClassRef ) - { - var command:ICommand = /**/ new commandClassRef(); - command.execute( notification ); - } - - } - - /** - * Register a particular ICommand class as the handler for a particular - * INotification. - * - * If an ICommand has already been registered to handle - * INotifications with this name, it is no longer used, the new - * ICommand is used instead. - * - * The Observer for the new ICommand is only created if this the - * first time an ICommand has been registered for this - * Notification name. - * - * @param notificationName - * The name of the INotification. - * - * @param commandClassRef - * The constructor of the ICommand. - */ - registerCommand( notificationName:string, commandClassRef:Function ):void - { - if( !this.commandMap[ notificationName ] ) - this.view.registerObserver( notificationName, new Observer( this.executeCommand, this ) ); - - this.commandMap[ notificationName ] = commandClassRef; - } - - /** - * Check if an ICommand is registered for a given Notification. - * - * @param notificationName - * Name of the Notification to check wheter an ICommand is - * registered for. - * - * @return - * An ICommand is currently registered for the given - * notificationName. - */ - hasCommand( notificationName:string ):bool - { - return this.commandMap[ notificationName ] != null; - } - - /** - * Remove a previously registered ICommand to INotification - * mapping. - * - * @param notificationName - * The name of the INotification to remove the ICommand - * mapping for. - */ - removeCommand( notificationName:string ):void - { - // if the Command is registered... - if( this.hasCommand( notificationName ) ) - { - this.view.removeObserver( notificationName, this ); - delete this.commandMap[notificationName]; - } - } - - /** - * Singleton instance local reference. - * - * @protected - */ - static instance:IController; - - /** - * Error message used to indicate that a controller singleton is already constructed when - * trying to constructs the class twice. - * - * @protected - * @constant - */ - static SINGLETON_MSG:string = "Controller singleton already constructed!"; - - /** - * Controller singleton Factory method. - * - * @return - * The singleton instance of Controller - */ - static getInstance():IController - { - if( !Controller.instance ) - Controller.instance = new Controller(); - - return Controller.instance; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/core/Model.ts b/src/org/puremvc/typescript/core/Model.ts deleted file mode 100644 index 3de708d..0000000 --- a/src/org/puremvc/typescript/core/Model.ts +++ /dev/null @@ -1,160 +0,0 @@ -/// -/// - -module puremvc -{ - "use strict"; - - /** - * The Model class for PureMVC. - * - * A singleton IModel implementation. - * - * In PureMVC, the IModel class provides access to model objects - * Proxies by named lookup. - * - * The Model assumes these responsibilities: - *
      - *
    • Maintain a cache of IProxy instances. - *
    • Provide methods for registering, retrieving, and removing Proxy instances. - * - * Your application must register IProxy instances with the Model. - * Typically, you use an ICommand to create and register Proxy instances - * once the Facade has initialized the Core actors. - */ - export class Model - implements IModel - { - /** - * HashTable of IProxy registered with the Model. - * - * @protected - */ - proxyMap:Object = null; - - /** - * This IModel implementation is a singleton, so you should not call the - * constructor directly, but instead call the static singleton Factory method - * Model.getInstance(). - * - * @throws Error - * Error if singleton instance has already been constructed. - */ - constructor() - { - if( Model.instance ) - throw Error( Model.SINGLETON_MSG ); - - Model.instance = this; - this.proxyMap = {}; - this.initializeModel(); - } - - /** - * Initialize the singleton Model instance. - * - * Called automatically by the constructor, this is the opportunity to initialize the - * singleton instance in a subclass without overriding the constructor. - * - * @protected - */ - initializeModel():void - { - - } - - /** - * Register an IProxy with the Model. - * - * @param proxy - * An IProxy to be held by the Model. - */ - registerProxy( proxy:IProxy ):void - { - this.proxyMap[ proxy.getProxyName() ] = proxy; - proxy.onRegister(); - } - - /** - * Remove an IProxy from the Model. - * - * @param proxyName - * The name of the Proxy instance to be removed. - * - * @return - * The IProxy that was removed from the Model or an - * explicit null if the IProxy didn't exist. - */ - removeProxy( proxyName:string ):IProxy - { - var proxy:IProxy = this.proxyMap[ proxyName ]; - if( proxy ) - { - delete this.proxyMap[ proxyName ]; - proxy.onRemove(); - } - - return proxy; - } - - /** - * Retrieve an IProxy from the Model. - * - * @param proxyName - * The IProxy name to retrieve from the Model. - * - * @return - * The IProxy instance previously registered with the given - * proxyName or an explicit null if it doesn't exists. - */ - retrieveProxy( proxyName:string ):IProxy - { - //Return a strict null when the proxy doesn't exist - return this.proxyMap[proxyName] || null; - } - - /** - * Check if a Proxy is registered - * - * @param proxyName - * The name of the IProxy to verify the existence of its registration. - * - * @return - * A Proxy is currently registered with the given proxyName. - */ - hasProxy( proxyName:string ):bool - { - return this.proxyMap[ proxyName ] != null; - } - - /** - * Error message used to indicate that a controller singleton is already constructed when - * trying to constructs the class twice. - * - * @constant - * @protected - */ - static SINGLETON_MSG:string = "Model singleton already constructed!"; - - /** - * singleton instance local reference. - * - * @protected - */ - static instance:IModel; - - /** - * Model singleton factory method. - * - * @return - * The singleton instance of Model. - */ - static getInstance():IModel - { - if( !Model.instance ) - Model.instance = new Model(); - - return Model.instance; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/core/View.ts b/src/org/puremvc/typescript/core/View.ts deleted file mode 100644 index dcd8820..0000000 --- a/src/org/puremvc/typescript/core/View.ts +++ /dev/null @@ -1,293 +0,0 @@ -/// -/// -/// -/// - -module puremvc -{ - "use strict"; - - /** - * The View class for PureMVC. - * - * A singleton IView implementation. - * - * In PureMVC, the View class assumes these responsibilities: - *
        - *
      • Maintain a cache of IMediator instances. - *
      • Provide methods for registering, retrieving, and removing IMediators. - *
      • Notifiying IMediators when they are registered or removed. - *
      • Managing the Observer lists for each INotification in the - * application. - *
      • Providing a method for attaching IObservers to an - * INotification's Observer list. - *
      • Providing a method for broadcasting an INotification. - *
      • Notifying the IObservers of a given INotification when it - * broadcasts. - */ - export class View - implements IView - { - /** - * Mapping of Mediator names to Mediator instances. - * - * @protected - */ - mediatorMap:Object = null; - - /** - * Mapping of Notification names to Observers lists. - * - * @protected - */ - observerMap:Object = null; - - /** - * This IView implementation is a singleton, so you should not call the - * constructor directly, but instead call the static singleton Factory method - * View.getInstance(). - * - * @throws Error - * Throws an error if an instance for this singleton has already been constructed. - */ - constructor() - { - if( View.instance ) - throw Error( View.SINGLETON_MSG ); - - View.instance = this; - this.mediatorMap = {}; - this.observerMap = {}; - this.initializeView(); - } - - /** - * Initialize the singleton View instance. - * - * Called automatically by the constructor. This is the opportunity to initialize the - * singleton instance in a subclass without overriding the constructor. - */ - initializeView():void - { - - } - - /** - * Register an IObserver to be notified of INotifications with a - * given name. - * - * @param notificationName - * The name of the INotifications to notify this IObserver - * of. - * - * @param observer - * The IObserver to register. - */ - registerObserver( notificationName:string, observer:IObserver ):void - { - var observers:IObserver[] = this.observerMap[ notificationName ]; - if( observers ) - observers.push( observer ); - else - this.observerMap[ notificationName ] = [ observer ]; - } - - /** - * Remove a list of Observers for a given notifyContext from an - * Observer list for a given INotification name. - * - * @param notificationName - * Which IObserver list to remove from. - * - * @param notifyContext - * Remove the IObserver with this object as its - * notifyContext. - */ - removeObserver( notificationName:string, notifyContext:any ):void - { - //The observer list for the notification under inspection - var observers:IObserver[] = this.observerMap[ notificationName ]; - - //Find the observer for the notifyContext. - var i:number = observers.length; - while( i-- ) - { - var observer:IObserver = observers[i]; - if( observer.compareNotifyContext(notifyContext) ) - { - observers.splice( i, 1 ); - break; - } - } - - /* - * Also, when a Notification's Observer list length falls to zero, delete the - * notification key from the observer map. - */ - if( observers.length == 0 ) - delete this.observerMap[ notificationName ]; - } - - /** - * Notify the IObservers for a particular INotification. - * - * All previously attached IObservers for this INotification's - * list are notified and are passed a reference to the INotification in the - * order in which they were registered. - * - * @param notification - * The INotification to notify IObservers of. - */ - notifyObservers( notification:INotification ):void - { - var notificationName:string = notification.getName(); - - var observersRef/*Array*/ = this.observerMap[notificationName]; - if( observersRef ) - { - // Copy the array. - var observers/*Array*/ = observersRef.slice(0); - var len/*Number*/ = observers.length; - for( var i/*Number*/=0; iIMediator instance with the View. - * - * Registers the IMediator so that it can be retrieved by name, and further - * interrogates the IMediator for its INotification interests. - * - * If the IMediator returns any INotification names to be - * notified about, an Observer is created to encapsulate the - * IMediator instance's handleNotification method and register - * it as an Observer for all INotifications the - * IMediator is interested in. - * - * @param mediator - * A reference to an IMediator implementation instance. - */ - registerMediator( mediator:IMediator ):void - { - var name:string = mediator.getMediatorName(); - - //Do not allow re-registration (you must removeMediator first). - if( this.mediatorMap[ name ] ) - return; - - //Register the Mediator for retrieval by name. - this.mediatorMap[ name ] = mediator; - - //Get Notification interests, if any. - var interests:string[] = mediator.listNotificationInterests(); - var len:Number = interests.length; - if( len>0 ) - { - //Create Observer referencing this mediator's handlNotification method. - var observer:IObserver = new Observer( mediator.handleNotification, mediator ); - - //Register Mediator as Observer for its list of Notification interests. - for( var i:number=0; iIMediator from the View. - * - * @param mediatorName - * The name of the IMediator instance to retrieve. - * - * @return - * The IMediator instance previously registered with the given - * mediatorName or an explicit null if it doesn't exists. - */ - retrieveMediator( mediatorName:string ):IMediator - { - //Return a strict null when the mediator doesn't exist - return this.mediatorMap[ mediatorName ] || null; - } - - /** - * Remove an IMediator from the View. - * - * @param mediatorName - * Name of the IMediator instance to be removed. - * - * @return - * The IMediator that was removed from the View or a - * strict null if the Mediator didn't exist. - */ - removeMediator( mediatorName:string ):IMediator - { - // Retrieve the named mediator - var mediator:IMediator = this.mediatorMap[ mediatorName ]; - if( !mediator ) - return null; - - //Get Notification interests, if any. - var interests:string[] = mediator.listNotificationInterests(); - - //For every notification this mediator is interested in... - var i:number = interests.length; - while( i-- ) - this.removeObserver( interests[i], mediator ); - - // remove the mediator from the map - delete this.mediatorMap[ mediatorName ]; - - //Alert the mediator that it has been removed - mediator.onRemove(); - - return mediator; - } - - /** - * Check if a IMediator is registered or not. - * - * @param mediatorName - * The IMediator name to check whether it is registered. - * - * @return - * A Mediator is registered with the given mediatorName. - */ - hasMediator( mediatorName:string ):bool - { - return this.mediatorMap[ mediatorName ] != null; - } - - /** - * @constant - * @protected - */ - static SINGLETON_MSG:string = "View singleton already constructed!"; - - /** - * Singleton instance local reference. - * - * @protected - */ - static instance:IView; - - /** - * View singleton Factory method. - * - * @return - * The singleton instance of View. - */ - static getInstance():IView - { - if( !View.instance ) - View.instance = new View(); - - return View.instance; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/ICommand.ts b/src/org/puremvc/typescript/interfaces/ICommand.ts deleted file mode 100644 index d60e6b1..0000000 --- a/src/org/puremvc/typescript/interfaces/ICommand.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Command. - */ - export interface ICommand - extends INotifier - { - /** - * Fulfill the use-case initiated by the given INotification. - * - * In the Command Pattern, an application use-case typically begins with some user action, - * which results in an INotification being broadcast, which is handled by - * business logic in the execute method of an ICommand. - * - * @param notification - * The INotification to handle. - */ - execute( notification:INotification ):void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IController.ts b/src/org/puremvc/typescript/interfaces/IController.ts deleted file mode 100644 index bc6d6f8..0000000 --- a/src/org/puremvc/typescript/interfaces/IController.ts +++ /dev/null @@ -1,79 +0,0 @@ -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Controller. - * - * In PureMVC, an IController implementor follows the 'Command and Controller' - * strategy, and assumes these responsibilities: - *
          - *
        • Remembering which ICommands are intended to handle which - * INotifications. - *
        • Registering itself as an IObserver with the View for each - * INotification that it has an ICommand mapping for. - *
        • Creating a new instance of the proper ICommand to handle a given - * INotification when notified by the View. - *
        • Calling the ICommand's execute method, passing in the - * INotification. - * - * Your application must register ICommands with the Controller. - * - * The simplest way is to subclass Facade, and use its - * initializeController method to add your registrations. - */ - export interface IController - { - /** - * If an ICommand has previously been registered to handle the given - * INotification, then it is executed. - * - * @param notification - * The INotification the command will receive as parameter. - */ - executeCommand( notification:INotification ):void; - - /** - * Register a particular ICommand class as the handler for a particular - * INotification. - * - * If an ICommand has already been registered to handle - * INotifications with this name, it is no longer used, the new - * ICommand is used instead. - * - * The Observer for the new ICommand is only created if this the - * first time an ICommand has been registered for this - * Notification name. - * - * @param notificationName - * The name of the INotification. - * - * @param commandClassRef - * The constructor of the ICommand implementor. - */ - registerCommand( notificationName:string, commandClassRef:Function ):void; - - /** - * Check if an ICommand is registered for a given Notification. - * - * @param notificationName - * Name of the Notification to check wheter an ICommand is - * registered for. - * - * @return - * An ICommand is currently registered for the given - * notificationName. - */ - hasCommand( notificationName:string ):bool; - - /** - * Remove a previously registered ICommand to INotification - * mapping. - * - * @param notificationName - * The name of the INotification to remove the ICommand - * mapping for. - */ - removeCommand( notificationName:string ):void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IFacade.ts b/src/org/puremvc/typescript/interfaces/IFacade.ts deleted file mode 100644 index e656e6b..0000000 --- a/src/org/puremvc/typescript/interfaces/IFacade.ts +++ /dev/null @@ -1,158 +0,0 @@ -/// -/// -/// -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Facade. - * - * - * The Facade Pattern suggests providing a single class to act as a central point of - * communication for a subsystem. - * - * - * In PureMVC, the Facade acts as an interface between the core MVC actors (Model, View, - * Controller) and the rest of your application. - */ - export interface IFacade - extends INotifier - { - /** - * Register an ICommand with the IController associating it to a - * INotification name. - * - * @param notificationName - * The name of the INotification to associate the ICommand - * with. - * - * @param commandClassRef - * A reference to the constructor of the ICommand. - */ - registerCommand( notificationName:string, commandClassRef:Function ):void; - - /** - * Remove a previously registered ICommand to INotification - * mapping from the Controller. - * - * @param notificationName - * The name of the INotification to remove the ICommand - * mapping for. - */ - removeCommand( notificationName:string ): void; - - /** - * Check if an ICommand is registered for a given Notification. - * - * @param notificationName - * The name of the INotification to verify for the existence of a - * ICommand mapping for. - * - * @return - * A Command is currently registered for the given - * notificationName. - */ - hasCommand( notificationName:string ):bool; - - /** - * Register an IProxy with the Model by name. - * - * @param proxy - * The IProxy to be registered with the Model. - */ - registerProxy( proxy:IProxy ):void; - - /** - * Retrieve an IProxy from the Model by name. - * - * @param proxyName - * The name of the IProxy to be retrieved. - * - * @return - * The IProxy previously registered with the given proxyName. - */ - retrieveProxy( proxyName:string ):IProxy; - - /** - * Remove an IProxy from the Model by name. - * - * @param proxyName - * The IProxy to remove from the Model. - * - * @return - * The IProxy that was removed from the Model - */ - removeProxy( proxyName:string ):IProxy; - - /** - * Check if a Proxy is registered. - * - * @param proxyName - * The IProxy to verify the existence of a registration with the - * IModel. - * - * @return - * A Proxy is currently registered with the given proxyName. - */ - hasProxy( proxyName:string ):bool; - - /** - * Register a IMediator with the IView. - * - * @param mediator - A reference to the IMediator. - */ - registerMediator( mediator:IMediator ):void; - - /** - * Retrieve an IMediator from the IView. - * - * @param mediatorName - * The name of the registered Mediator to retrieve. - * - * @return - * The IMediator previously registered with the given - * mediatorName. - */ - retrieveMediator( mediatorName:string ):IMediator; - - /** - * Remove an IMediator from the IView. - * - * @param mediatorName - * Name of the IMediator to be removed. - * - * @return - * The IMediator that was removed from the IView - */ - removeMediator( mediatorName:string ):IMediator; - - /** - * Check if a Mediator is registered or not - * - * @param mediatorName - * The name of the IMediator to verify the existence of a registration - * for. - * - * @return - * An IMediator is registered with the given mediatorName. - */ - hasMediator( mediatorName:string ):bool; - - /** - * Notify the IObservers for a particular INotification. - * - * This method is left public mostly for backward compatibility, and to allow you to send - * custom notification classes using the facade. - * - * Usually you should just call sendNotification and pass the parameters, never having to - * construct the notification yourself. - * - * @param notification - * The INotification to have the IView notify - * IObservers of. - */ - notifyObservers( notification:INotification ):void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IMediator.ts b/src/org/puremvc/typescript/interfaces/IMediator.ts deleted file mode 100644 index a323390..0000000 --- a/src/org/puremvc/typescript/interfaces/IMediator.ts +++ /dev/null @@ -1,106 +0,0 @@ -/// -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Mediator. - * - * In PureMVC, IMediator implementors assume these responsibilities: - *
            - *
          • Implement a common method which returns a list of all INotifications - * the IMediator has interest in. - *
          • Implement a notification callback method. - *
          • Implement methods that are called when the IMediator is registered or removed from the View. - * - * Additionally, IMediators typically: - *
              - *
            • Act as an intermediary between one or more view components such as text boxes or - * list controls, maintaining references and coordinating their behavior. - *
            • In a PureMVC application, this the place where event listeners are added to view - * components, and their handlers implemented. - *
            • Respond to and generate INotifications, interacting with of the rest of the - * PureMVC application. - * - * When an IMediator is registered with the IView, - * the IView will call the IMediator's - * listNotificationInterests method. The IMediator will - * return a list of INotification names which - * it wishes to be notified about. - * - * The IView will then create an Observer object - * encapsulating that IMediator's (handleNotification) method - * and register it as an Observer for each INotification name returned by - * listNotificationInterests. - */ - export interface IMediator - extends INotifier - { - /** - * Get the IMediator instance name - * - * @return - * The IMediator instance name - */ - getMediatorName():string; - - /** - * Get the Mediator's view component. - * - * Additionally, an implicit getter will usually be defined in the subclass that casts the - * view object to a type, like this: - * - * - * getMenu: function - * { - * return this.viewComponent; - * } - * - * - * @return - * The Mediator's view component. - */ - getViewComponent():any; - - /** - * Set the IMediator's view component. - * - * @param viewComponent - * The default view component to set for this Mediator. - */ - setViewComponent( viewComponent:any ):void; - - /** - * List the INotification names this IMediator is interested in - * being notified of. - * - * @return - * The list of notifications names in which is interested the Mediator. - */ - listNotificationInterests( ):string[]; - - /** - * Handle INotifications. - * - * - * Typically this will be handled in a switch statement, with one 'case' entry per - * INotification the Mediator is interested in. - * - * @param notification - * The notification instance to be handled. - */ - handleNotification( notification:INotification ):void; - - /** - * Called by the View when the Mediator is registered. This method has to be overridden - * by the subclass to know when the instance is registered. - */ - onRegister():void; - - /** - * Called by the View when the Mediator is removed. This method has to be overridden - * by the subclass to know when the instance is removed. - */ - onRemove():void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IModel.ts b/src/org/puremvc/typescript/interfaces/IModel.ts deleted file mode 100644 index 2521fda..0000000 --- a/src/org/puremvc/typescript/interfaces/IModel.ts +++ /dev/null @@ -1,65 +0,0 @@ -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Model. - * - * In PureMVC, the IModel class provides access to model objects - * Proxies by named lookup. - * - * The Model assumes these responsibilities: - *
                - *
              • Maintain a cache of IProxy instances. - *
              • Provide methods for registering, retrieving, and removing Proxy instances. - * - * Your application must register IProxy instances with the Model. - * Typically, you use an ICommand to create and register Proxy instances - * once the Facade has initialized the Core actors. - */ - export interface IModel - { - /** - * Register an IProxy with the Model. - * - * @param proxy - * An IProxy to be held by the Model. - */ - registerProxy( proxy:IProxy ):void; - - /** - * Remove an IProxy from the Model. - * - * @param proxyName - * The name of the Proxy instance to be removed. - * - * @return - * The IProxy that was removed from the Model or an - * explicit null if the IProxy didn't exist. - */ - removeProxy( proxyName:string ):IProxy; - - /** - * Retrieve an IProxy from the Model. - * - * @param proxyName - * The IProxy name to retrieve from the Model. - * - * @return - * The IProxy instance previously registered with the given - * proxyName or an explicit null if it doesn't exists. - */ - retrieveProxy( proxyName:string ):IProxy; - - /** - * Check if a Proxy is registered - * - * @param proxyName - * The name of the IProxy to verify the existence of its registration. - * - * @return - * A Proxy is currently registered with the given proxyName. - */ - hasProxy( proxyName:string ):bool; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/INotification.ts b/src/org/puremvc/typescript/interfaces/INotification.ts deleted file mode 100644 index 7fb70b1..0000000 --- a/src/org/puremvc/typescript/interfaces/INotification.ts +++ /dev/null @@ -1,77 +0,0 @@ -module puremvc -{ - /** - * The interface definition for a PureMVC notification. - * - * PureMVC does not rely upon underlying event models such as the one provided in JavaScript DOM API, - * and TypeScript does not have an inherent event model. - * - * The Observer pattern as implemented within PureMVC exists to support event-driven - * communication between the application and the actors of the MVC triad (Model, View and - * Controller). - * - * Notifications are not meant to be a replacement for Events in Javascript. - * Generally, IMediator implementors place event listeners on their view components, - * which they then handle in the usual way. This may lead to the broadcast of - * INotifications to trigger ICommands or to communicate with other - * IMediators. IProxy and ICommand instances communicate - * with each other and IMediators by broadcasting INotifications. - * - * A key difference between JavaScript Events and PureMVC - * INotifications is that Events follow the 'Chain of Responsibility' - * pattern, 'bubbling' up the display hierarchy until some parent component handles the - * Event, while PureMVC INotifications follow a 'Publish/Subscribe' - * pattern. PureMVC classes need not be related to each other in a parent/child relationship in - * order to communicate with one another using INotifications. - */ - export interface INotification - { - /** - * Get the name of the Notification instance. - * - * @return - * The name of the Notification instance. - */ - getName():string; - - /** - * Set the body of the INotification. - * - * @param body - * The body of the notification instance. - */ - setBody( body:any ):void; - - /** - * Get the body of the INotification. - * - * @return - * The body object of the INotification. - */ - getBody():any; - - /** - * Set the type of the INotification. - * - * @param type - * The type identifier for the notification. - */ - setType( type:string ):void; - - /** - * Get the type of the INotification. - * - * @return - * The type of the INotification. - */ - getType():string; - - /** - * Get a textual representation of the Notification instance. - * - * @return - * The textual representation of the Notification instance. - */ - toString():string; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/INotifier.ts b/src/org/puremvc/typescript/interfaces/INotifier.ts deleted file mode 100644 index b9b09f2..0000000 --- a/src/org/puremvc/typescript/interfaces/INotifier.ts +++ /dev/null @@ -1,38 +0,0 @@ -module puremvc -{ - /** - * The interface definition for a PureMVC Notifier. - * - * MacroCommand, SimpleCommand, Mediator and - * Proxy all have a need to send Notifications. - * - * The INotifier interface provides a common method called - * sendNotification that relieves implementation code of the necessity to actually - * construct Notifications. - * - * The INotifier interface, which all of the above mentioned classes extend, - * provides an initialized reference to the Facade singleton, which is required by - * the convenience method sendNotification for sending Notifications, - * but it also eases implementation as these classes have frequent Facade - * interactions and usually require access to the facade anyway. - */ - export interface INotifier - { - /** - * Create and send a Notification. - * - * Keeps us from having to construct new Notification instances in our - * implementation code. - * - * @param name - * The name of the notification to send. - * - * @param body - * The body of the notification (optional). - * - * @param type - * The type of the notification (optional). - */ - sendNotification( name:string, body?:any, type?:string ):void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IObserver.ts b/src/org/puremvc/typescript/interfaces/IObserver.ts deleted file mode 100644 index 71570b0..0000000 --- a/src/org/puremvc/typescript/interfaces/IObserver.ts +++ /dev/null @@ -1,70 +0,0 @@ -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Observer. - * - * In PureMVC, IObserver implementors assumes these responsibilities: - *
                  - *
                • Encapsulate the notification (callback) method of the interested object. - *
                • Encapsulate the notification context (this) of the interested object. - *
                • Provide methods for setting the interested object notification method and context. - *
                • Provide a method for notifying the interested object. - * - * PureMVC does not rely upon underlying event models such as the one provided in JavaScript DOM API, - * and JavaScript does not have an inherent event model. - * - * The Observer Pattern as implemented within PureMVC exists to support event driven - * communication between the application and the actors of the MVC triad (Model, View, Controller). - * - * An Observer is an object that encapsulates information about an interested object with a - * notification method that should be called when an INotification is broadcast. - * The Observer then acts as a proxy for notifying the interested object. - * - * Observers can receive Notifications by having their notifyObserver - * method invoked, passing in an object implementing the INotification interface, - * such as a subclass of Notification. - */ - export interface IObserver - { - /** - * Set the notification method. - * - * The notification method should take one parameter of type INotification. - * - * @param notifyMethod - * The notification (callback) method of the interested object. - */ - setNotifyMethod( notifyMethod:Function ):void; - - /** - /** - * Set the notification context. - * - * @param notifyContext - * The notification context (this) of the interested object. - */ - setNotifyContext( notifyContext:any ):void; - - /** - * Notify the interested object. - * - * @param notification - * The INotification to pass to the interested object's notification - * method. - */ - notifyObserver( notification:INotification ):void; - - /** - * Compare an object to the notification context. - * - * @param object - * The object to compare. - * - * @return - * The object and the notification context are the same. - */ - compareNotifyContext( object:any ):bool; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IProxy.ts b/src/org/puremvc/typescript/interfaces/IProxy.ts deleted file mode 100644 index a40b1d4..0000000 --- a/src/org/puremvc/typescript/interfaces/IProxy.ts +++ /dev/null @@ -1,62 +0,0 @@ -/// - -module puremvc -{ - /** - * The interface definition for a PureMVC Proxy. - * - * In PureMVC, IProxy implementors assume these responsibilities: - *
                    - *
                  • Implement a common method which returns the name of the Proxy. - *
                  • Provide methods for setting and getting the data object. - * - * Additionally, IProxys typically: - *
                      - *
                    • Maintain references to one or more pieces of model data. - *
                    • Provide methods for manipulating that data. - *
                    • Generate INotifications when their model data changes. - *
                    • Expose their name as a constant called NAME, if they are not - * instantiated multiple times. - *
                    • Encapsulate interaction with local or remote services used to fetch and persist model - * data. - */ - export interface IProxy - extends INotifier - { - /** - * Get the name of the IProxy> instance. - * - * @return - * The name of the IProxy> instance. - */ - getProxyName():string; - - /** - * Set the data of the IProxy> instance. - * - * @param data - * The data to set for the IProxy> instance. - */ - setData( data:any ):void; - - /** - * Get the data of the IProxy> instance. - * - * @return - * The data held in the IProxy instance. - */ - getData():any; - - /** - * Called by the Model when the IProxy is registered. This method has to be - * overridden by the subclass to know when the instance is registered. - */ - onRegister( ):void; - - /** - * Called by the Model when the IProxy is removed. This method has to be - * overridden by the subclass to know when the instance is removed. - */ - onRemove( ):void; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/interfaces/IView.ts b/src/org/puremvc/typescript/interfaces/IView.ts deleted file mode 100644 index 3f88d4d..0000000 --- a/src/org/puremvc/typescript/interfaces/IView.ts +++ /dev/null @@ -1,116 +0,0 @@ -/// -/// -/// -module puremvc -{ - /** - * The interface definition for a PureMVC view. - * - * In PureMVC, IView implementors assume these responsibilities: - * - * In PureMVC, the View class assumes these responsibilities: - *
                        - *
                      • Maintain a cache of IMediator instances. - *
                      • Provide methods for registering, retrieving, and removing IMediators. - *
                      • Notifiying IMediators when they are registered or removed. - *
                      • Managing the Observer lists for each INotification in the - * application. - *
                      • Providing a method for attaching IObservers to an - * INotification's Observer list. - *
                      • Providing a method for broadcasting an INotification. - *
                      • Notifying the IObservers of a given INotification when it - * broadcasts. - */ - export interface IView - { - /** - * Register an IObserver to be notified of INotifications with a - * given name. - * - * @param notificationName - * The name of the INotifications to notify this IObserver - * of. - * - * @param observer - * The IObserver to register. - */ - registerObserver( notificationName:string, observer:IObserver ):void; - - /** - * Remove a list of Observers for a given notifyContext from an - * Observer list for a given INotification name. - * - * @param notificationName - * Which IObserver list to remove from. - * - * @param notifyContext - * Remove the IObserver with this object as its - * notifyContext. - */ - removeObserver( notificationName:string, notifyContext:any ):void; - - /** - * Notify the IObservers for a particular INotification. - * - * All previously attached IObservers for this INotification's - * list are notified and are passed a reference to the INotification in the - * order in which they were registered. - * - * @param notification - * The INotification to notify IObservers of. - */ - notifyObservers( notification:INotification ):void; - - /** - * Register an IMediator instance with the View. - * - * Registers the IMediator so that it can be retrieved by name, and further - * interrogates the IMediator for its INotification interests. - * - * If the IMediator returns any INotification names to be - * notified about, an Observer is created to encapsulate the - * IMediator instance's handleNotification method and register - * it as an Observer for all INotifications the - * IMediator is interested in. - * - * @param mediator - * A reference to an IMediator implementation instance. - */ - registerMediator( mediator:IMediator ):void; - - /** - * Retrieve an IMediator from the View. - * - * @param mediatorName - * The name of the IMediator instance to retrieve. - * - * @return - * The IMediator instance previously registered with the given - * mediatorName or an explicit null if it doesn't exists. - */ - retrieveMediator( mediatorName:string ):IMediator; - - /** - * Remove an IMediator from the View. - * - * @param mediatorName - * Name of the IMediator instance to be removed. - * - * @return - * The IMediator that was removed from the View or a - * strict null if the Mediator didn't exist. - */ - removeMediator( mediatorName:string ):IMediator; - - /** - * Check if a IMediator is registered or not. - * - * @param mediatorName - * The IMediator name to check whether it is registered. - * - * @return - * A Mediator is registered with the given mediatorName. - */ - hasMediator( mediatorName:string ):bool; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/command/MacroCommand.ts b/src/org/puremvc/typescript/patterns/command/MacroCommand.ts deleted file mode 100644 index 775aa9d..0000000 --- a/src/org/puremvc/typescript/patterns/command/MacroCommand.ts +++ /dev/null @@ -1,120 +0,0 @@ -/// -/// -/// -/// - -module puremvc -{ - "use strict"; - - /** - * A base ICommand implementation that executes other ICommands. - * - * A MacroCommand maintains an list of ICommand constructor references - * called SubCommands. - * - * When execute is called, the MacroCommand instantiates and calls - * execute on each of its SubCommands turn. Each SubCommand will be - * passed a reference to the original INotification that was passed to the - * MacroCommand's execute method. - * - * Unlike SimpleCommand, your subclass should not override execute, - * but instead, should override the initializeMacroCommand method, calling - * addSubCommand once for each SubCommand to be executed. - */ - export class MacroCommand - extends Notifier - implements ICommand, INotifier - { - /** - * An array of ICommands. - * - * @protected - */ - subCommands:Function[] = null; - - /** - * Constructs a MacroCommand instance. - * - * You should not need to define a constructor in your subclasses, instead, override the - * initializeMacroCommand method. - * - * If your subclass does define a constructor, be sure to call super(). - */ - constructor() - { - super(); - - this.subCommands = new Function[](); - this.initializeMacroCommand(); - } - - /** - * Initialize the MacroCommand. - * - * In your subclass, override this method to initialize the MacroCommand's - * SubCommand list with ICommand class references like this: - * - *
                        -		 *		// Initialize MyMacroCommand
                        -		 *		initializeMacroCommand():void
                        -		 *		{
                        -		 *			this.addSubCommand( FirstCommand );
                        -		 *			this.addSubCommand( SecondCommand );
                        -		 *			this.addSubCommand( ThirdCommand );
                        -		 *		}
                        -		 * 
                        - * - * Note that subCommands may be any ICommand implementor so - * MacroCommands or SimpleCommands are both acceptable. - */ - initializeMacroCommand():void - { - - } - - /** - * Add an entry to the subCommands list. - * - * The subCommands will be called in First In/First Out (FIFO) order. - * - * @param commandClassRef - * A reference to the constructor of the ICommand. - */ - addSubCommand( commandClassRef:Function ):void - { - this.subCommands.push(commandClassRef); - } - - /** - * Execute this MacroCommand's SubCommands. - * - * The SubCommands will be called in First In/First Out (FIFO) - * order. - * - * @param notification - * The INotification object to be passed to each SubCommand of - * the list. - * - * @final - */ - execute( notification:INotification ):void - { - var subCommands:Function[] = this.subCommands.slice(0); - var len:number = this.subCommands.length; - for( var i:number=0; iFunction
                        ( won't compile if set to Function - * because today the compiler consider that Function is not newable and - * doesn't have a Class type) - */ - var commandClassRef:any = subCommands[i]; - var commandInstance:ICommand = /**/ new commandClassRef(); - commandInstance.execute( notification ); - } - - this.subCommands.splice(0); - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/command/SimpleCommand.ts b/src/org/puremvc/typescript/patterns/command/SimpleCommand.ts deleted file mode 100644 index f16f596..0000000 --- a/src/org/puremvc/typescript/patterns/command/SimpleCommand.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// -/// -/// - -/// - -module puremvc -{ - "use strict"; - - /** - * A base ICommand implementation. - * - * Your subclass should override the execute method where your business logic will - * handle the INotification. - */ - export class SimpleCommand - extends Notifier - implements ICommand, INotifier - { - /** - * Fulfill the use-case initiated by the given INotification. - * - * In the Command Pattern, an application use-case typically begins with some user action, - * which results in an INotification being broadcast, which is handled by - * business logic in the execute method of an ICommand. - * - * @param notification - * The INotification to handle. - */ - execute( notification:INotification ):void - { - - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/facade/Facade.ts b/src/org/puremvc/typescript/patterns/facade/Facade.ts deleted file mode 100644 index f1a3711..0000000 --- a/src/org/puremvc/typescript/patterns/facade/Facade.ts +++ /dev/null @@ -1,404 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -module puremvc -{ - "use strict"; - - /** - * A base singleton IFacade implementation. - * - * In PureMVC, the Facade class assumes these responsibilities: - * - *
                          - *
                        • Initializing the Model, View and Controller - * singletons. - *
                        • Providing all the methods defined by the IModel, IView, & - * IController interfaces. - *
                        • Providing the ability to override the specific Model, View and - * Controller singletons created. - *
                        • Providing a single point of contact to the application for registering - * Commands and notifying Observers. - * - * This Facade implementation is a singleton and cannot be instantiated directly, - * but instead calls the static singleton factory method Facade.getInstance(). - */ - export class Facade - implements IFacade - { - /** - * Local reference to the Model singleton. - * - * @protected - */ - model:IModel = null; - - /** - * Local reference to the View singleton. - * - * @protected - */ - view:IView = null; - - /** - * Local reference to the Controller singleton. - * - * @protected - */ - controller:IController = null; - - /** - * Constructs a Controller instance. - * - * This IFacade implementation is a singleton, so you should not call the - * constructor directly, but instead call the static singleton Factory method - * Facade.getInstance(). - * - * @throws Error - * Throws an error if an instance of this singleton has already been constructed. - */ - constructor() - { - if( Facade.instance ) - throw Error( Facade.SINGLETON_MSG ); - - Facade.instance = this; - this.initializeFacade(); - } - - /** - * Called automatically by the constructor. - * Initialize the singleton Facade instance. - * - * Override in your subclass to do any subclass specific initializations. Be sure to - * extend the Facade with the methods and properties on your implementation - * and call Facade.initializeFacade(). - * - * @protected - */ - initializeFacade():void - { - this.initializeModel(); - this.initializeController(); - this.initializeView(); - } - - /** - * Initialize the Model. - * - * Called by the initializeFacade method. Override this method in your - * subclass of Facade if one or both of the following are true: - * - *
                            - *
                          • You wish to initialize a different IModel. - *
                          • You have Proxys to register with the Model that do not - * retrieve a reference to the Facade at construction time. - * - * If you don't want to initialize a different IModel, call - * super.initializeModel() at the beginning of your method, then register - * Proxys. - * - * Note: This method is rarely overridden; in practice you are more likely to use a - * Command to create and register Proxys with the - * Model, since Proxys with mutable data will likely need to send - * INotifications and thus will likely want to fetch a reference to the - * Facade during their construction. - * - * @protected - */ - initializeModel():void - { - if( !this.model ) - this.model = Model.getInstance(); - } - - /** - * Initialize the Controller. - * - * Called by the initializeFacade method. Override this method in your - * subclass of Facade if one or both of the following are true: - * - *
                              - *
                            • You wish to initialize a different IController. - *
                            • You have ICommands to register with the Controller at - * startup. - * - * If you don't want to initialize a different IController, call - * super.initializeController() at the beginning of your method, then register - * Commands. - * - * @protected - */ - initializeController():void - { - if( !this.controller ) - this.controller = Controller.getInstance(); - } - - /** - * Initialize the View. - * - * Called by the initializeFacade method. Override this method in your - * subclass of Facade if one or both of the following are true: - *
                                - *
                              • You wish to initialize a different IView. - *
                              • You have Observers to register with the View - * - * If you don't want to initialize a different IView, call - * super.initializeView() at the beginning of your method, then register - * IMediator instances. - * - * Note: This method is rarely overridden; in practice you are more likely to use a - * Command to create and register Mediators with the - * View, since IMediator instances will need to send - * INotifications and thus will likely want to fetch a reference to the - * Facade during their construction. - * - * @protected - */ - initializeView():void - { - if( !this.view ) - this.view = View.getInstance(); - } - - /** - * Register an ICommand with the IController associating it to a - * INotification name. - * - * @param notificationName - * The name of the INotification to associate the ICommand - * with. - - * @param commandClassRef - * A reference to the constructor of the ICommand. - */ - registerCommand( notificationName:string, commandClassRef:Function ):void - { - this.controller.registerCommand( notificationName, commandClassRef ); - } - - /** - * Remove a previously registered ICommand to INotification - * mapping from the Controller. - * - * @param notificationName - * The name of the INotification to remove the ICommand - * mapping for. - */ - removeCommand( notificationName:string ):void - { - this.controller.removeCommand( notificationName ); - } - - /** - * Check if an ICommand is registered for a given Notification. - * - * @param notificationName - * The name of the INotification to verify for the existence of an - * ICommand mapping for. - * - * @return - * A Command is currently registered for the given - * notificationName. - */ - hasCommand( notificationName:string ):bool - { - return this.controller.hasCommand(notificationName); - } - - /** - * Register an IProxy with the Model by name. - * - * @param proxy - * The IProxy to be registered with the Model. - */ - registerProxy( proxy:IProxy ):void - { - this.model.registerProxy( proxy ); - } - - /** - * Retrieve an IProxy from the Model by name. - * - * @param proxyName - * The name of the IProxy to be retrieved. - * - * @return - * The IProxy previously registered with the given - * proxyName. - */ - retrieveProxy( proxyName:string ):IProxy - { - return this.model.retrieveProxy( proxyName ); - } - - /** - * Remove an IProxy from the Model by name. - * - * @param proxyName - * The IProxy to remove from the Model. - * - * @return - * The IProxy that was removed from the Model - */ - removeProxy ( proxyName:string ):IProxy - { - var proxy:IProxy; - if( this.model ) - proxy = this.model.removeProxy( proxyName ); - - return proxy - } - - /** - * Check if a Proxy is registered. - * - * @param proxyName - * The IProxy to verify the existence of a registration with the - * IModel. - * - * @return - * A Proxy is currently registered with the given proxyName. - */ - hasProxy( proxyName:string ):bool - { - return this.model.hasProxy( proxyName ); - } - - /** - * Register a IMediator with the IView. - * - * @param mediator - A reference to the IMediator. - */ - registerMediator( mediator:IMediator ):void - { - if( this.view ) - this.view.registerMediator( mediator ); - } - - /** - * Retrieve an IMediator from the IView. - * - * @param mediatorName - * The name of the registered Mediator to retrieve. - * - * @return - * The IMediator previously registered with the given - * mediatorName. - */ - retrieveMediator( mediatorName:string ):IMediator - { - return this.view.retrieveMediator( mediatorName ); - } - - /** - * Remove an IMediator from the IView. - * - * @param mediatorName - * Name of the IMediator to be removed. - * - * @return - * The IMediator that was removed from the IView - */ - removeMediator( mediatorName:string ):IMediator - { - var mediator:IMediator; - if( this.view ) - mediator = this.view.removeMediator( mediatorName ); - - return mediator; - } - - /** - * Check if a Mediator is registered or not - * - * @param mediatorName - * The name of the IMediator to verify the existence of a registration - * for. - * - * @return - * An IMediator is registered with the given mediatorName. - */ - hasMediator( mediatorName:string ):bool - { - return this.view.hasMediator( mediatorName ); - } - - /** - * Notify the IObservers for a particular INotification. - * - * This method is left public mostly for backward compatibility, and to allow you to - * send custom notification classes using the Facade. - * - * - * Usually you should just call sendNotification and pass the parameters, - * never having to construct the INotification yourself. - * - * @param notification - * The INotification to have the IView notify - * IObservers of. - */ - notifyObservers ( notification:INotification ):void - { - if( this.view ) - this.view.notifyObservers( notification ); - } - - /** - * Create and send an INotification. - * - * Keeps us from having to construct new notification instances in our implementation code. - * - * @param name - * The name of the notification to send. - * - * @param body - * The body of the notification to send. - * - * @param type - * The type of the notification to send. - */ - sendNotification( name:string, body:any=null, type:string=null ):void - { - this.notifyObservers( new Notification( name, body, type ) ); - } - - /** - * @constant - * @protected - */ - static SINGLETON_MSG:string = "Facade singleton already constructed!"; - - /** - * The singleton Facade instance. - * - * @protected - */ - static instance:IFacade; - - /** - * Facade singleton factory method. - * - * @return - * The singleton instance of Facade. - */ - static getInstance():IFacade - { - if( !Facade.instance ) - Facade.instance = new Facade(); - - return Facade.instance; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/mediator/Mediator.ts b/src/org/puremvc/typescript/patterns/mediator/Mediator.ts deleted file mode 100644 index 0e196d9..0000000 --- a/src/org/puremvc/typescript/patterns/mediator/Mediator.ts +++ /dev/null @@ -1,146 +0,0 @@ -/// -/// -/// -/// - -module puremvc -{ - "use strict"; - - /** - * A base IMediator implementation. - * - * Typically, a Mediator will be written to serve one specific control or group - * controls and so, will not have a need to be dynamically named. - */ - export class Mediator - extends Notifier - implements IMediator, INotifier - { - /** - * The name of the Mediator. - * - * @protected - */ - mediatorName:string = null; - - /** - * The Mediator's view component. - * - * @protected - */ - viewComponent:any = null; - - /** - * Constructs a Mediator instance. - * - * @param mediatorName - * The name of the Mediator. - * - * @param viewComponent - * The view component handled by this Mediator. - */ - constructor( mediatorName:string=null, viewComponent:any=null ) - { - super(); - - this.mediatorName = (mediatorName != null) ? mediatorName : Mediator.NAME; - this.viewComponent = viewComponent; - } - - /** - * Get the Mediator instance name. - * - * @return - * The Mediator instance name - */ - getMediatorName():string - { - return this.mediatorName; - } - - /** - * Get the Mediator's view component. - * - * Additionally, an implicit getter will usually be defined in the subclass that casts the - * view object to a type, like this: - * - * - * getMenu():Menu - * { - * return this.viewComponent; - * } - * - * - * @return - * The Mediator's default view component. - */ - getViewComponent():any - { - return this.viewComponent; - } - - /** - * Set the IMediator's view component. - * - * @param viewComponent - * The default view component to set for this Mediator. - */ - setViewComponent( viewComponent:any ):void - { - this.viewComponent = viewComponent; - } - - /** - * List the INotification names this IMediator is interested in - * being notified of. - * - * @return - * The list of notifications names in which is interested the Mediator. - */ - listNotificationInterests():string[] - { - return new string[]; - } - - /** - * Handle INotifications. - * - * - * Typically this will be handled in a switch statement, with one 'case' entry per - * INotification the Mediator is interested in. - * - * @param notification - * The notification instance to be handled. - */ - handleNotification( notification:INotification ):void - { - - } - - /** - * Called by the View when the Mediator is registered. This method has to be overridden - * by the subclass to know when the instance is registered. - */ - onRegister():void - { - - } - - /** - * Called by the View when the Mediator is removed. This method has to be overridden - * by the subclass to know when the instance is removed. - */ - onRemove():void - { - - } - - /** - * Default name of the Mediator. - * - * @constant - */ - static NAME:string = 'Mediator'; - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/observer/Notification.ts b/src/org/puremvc/typescript/patterns/observer/Notification.ts deleted file mode 100644 index d1c6055..0000000 --- a/src/org/puremvc/typescript/patterns/observer/Notification.ts +++ /dev/null @@ -1,143 +0,0 @@ -/// - -module puremvc -{ - "use strict"; - - /** - * A base INotification implementation. - * - * PureMVC does not rely upon underlying event models such as the one provided in JavaScript DOM API, - * and TypeScript does not have an inherent event model. - * - * The Observer pattern as implemented within PureMVC exists to support event-driven - * communication between the application and the actors of the MVC triad (Model, View and - * Controller). - * - * Notifications are not meant to be a replacement for Events in Javascript. - * Generally, IMediator implementors place event listeners on their view components, - * which they then handle in the usual way. This may lead to the broadcast of - * INotifications to trigger ICommands or to communicate with other - * IMediators. IProxy and ICommand instances communicate - * with each other and IMediators by broadcasting INotifications. - * - * A key difference between JavaScript Events and PureMVC - * INotifications is that Events follow the 'Chain of Responsibility' - * pattern, 'bubbling' up the display hierarchy until some parent component handles the - * Event, while PureMVC INotifications follow a 'Publish/Subscribe' - * pattern. PureMVC classes need not be related to each other in a parent/child relationship in - * order to communicate with one another using INotifications. - */ - export class Notification - implements INotification - { - /** - * The name of the Notification. - * - * @protected - */ - name:string = null; - - /** - * The body data to send with the Notification. - * - * @protected - */ - body:any = null; - - /** - * The type identifier of the Notification. - * - * @protected - */ - type:string = null; - - /** - * Constructs a Notification instance. - * - * @param name - * The name of the notification. - * - * @param body - * Body data to send with the Notification. - * - * @param type - * Type identifier of the Notification. - */ - constructor( name:string, body:any=null, type:string=null ) - { - this.name = name; - this.body = body; - this.type = type; - } - - /** - * Get the name of the Notification instance. - * - * @return - * The name of the Notification instance. - */ - getName():string - { - return this.name; - } - - /** - * Set the body of the Notification instance. - * - * @param body - * The body of the Notification instance. - */ - setBody( body:any ):void - { - this.body = body; - } - - /** - * Get the body of the Notification instance. - * - * @return - * The body object of the Notification instance. - */ - getBody():any - { - return this.body; - } - - /** - * Set the type of the Notification instance. - * - * @param type - * The type of the Notification instance. - */ - setType( type:string ):void - { - this.type = type; - } - - /** - * Get the type of the Notification instance. - * - * @return - * The type of the Notification instance. - */ - getType():string - { - return this.type; - } - - /** - * Get a textual representation of the Notification instance. - * - * @return - * The textual representation of the Notification instance. - */ - toString():string - { - var msg:string = "Notification Name: " + this.getName(); - msg += "\nBody:" + (( this.getBody() == null ) ? "null" : this.getBody().toString()); - msg += "\nType:" + (( this.getType() == null ) ? "null" : this.getType()); - return msg; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/observer/Notifier.ts b/src/org/puremvc/typescript/patterns/observer/Notifier.ts deleted file mode 100644 index 846965c..0000000 --- a/src/org/puremvc/typescript/patterns/observer/Notifier.ts +++ /dev/null @@ -1,64 +0,0 @@ -/// -/// - -/// - -module puremvc -{ - "use strict"; - - /** - * A base INotifier implementation. - * - * MacroCommand, SimpleCommand, Mediator and - * Proxy all have a need to send Notifications. - * - * The INotifier interface provides a common method called - * sendNotification that relieves implementation code of the necessity to actually - * construct Notifications. - * - * The INotifier interface, which all of the above mentioned classes extend, - * provides an initialized reference to the Facade singleton, which is required by - * the convenience method sendNotification for sending Notifications, - * but it also eases implementation as these classes have frequent Facade - * interactions and usually require access to the facade anyway. - */ - export class Notifier - implements INotifier - { - /** - * Local reference to the singleton Facade. - * - * @protected - */ - facade:IFacade = null; - - /** - * Constructs a Notifier instance. - */ - constructor() - { - this.facade = Facade.getInstance(); - } - - /** - * Create and send a Notification. - * - * Keeps us from having to construct new Notification instances in our - * implementation code. - * - * @param name - * The name of the notification to send. - * - * @param body - * The body of the notification. - * - * @param type - * The type of the notification. - */ - sendNotification( name:string, body:any=null, type:string=null ):void - { - this.facade.sendNotification( name, body, type ); - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/observer/Observer.ts b/src/org/puremvc/typescript/patterns/observer/Observer.ts deleted file mode 100644 index dbf084e..0000000 --- a/src/org/puremvc/typescript/patterns/observer/Observer.ts +++ /dev/null @@ -1,134 +0,0 @@ -/// -/// - -module puremvc -{ - "use strict"; - - /** - * A base IObserver implementation. - * - * In PureMVC, the Observer class assumes these responsibilities: - *
                                  - *
                                • Encapsulate the notification (callback) method of the interested object. - *
                                • Encapsulate the notification context (this) of the interested object. - *
                                • Provide methods for setting the interested object notification method and context. - *
                                • Provide a method for notifying the interested object. - * - * PureMVC does not rely upon underlying event models such as the one provided in JavaScript DOM API, - * and TypeScript does not have an inherent event model. - * - * The Observer Pattern as implemented within PureMVC exists to support event driven - * communication between the application and the actors of the MVC triad (Model, View, Controller). - * - * An Observer is an object that encapsulates information about an interested object with a - * notification method that should be called when an INotification is broadcast. - * The Observer then acts as a proxy for notifying the interested object. - * - * Observers can receive Notifications by having their notifyObserver - * method invoked, passing in an object implementing the INotification interface, - * such as a subclass of Notification. - */ - export class Observer - implements IObserver - { - /** - * The notification method of the interested object. - * @protected - */ - notify:Function = null; - - /** - * The notification context of the interested object. - * @protected - */ - context:any = null; - - /** - * Constructs an Observer instance. - * - * @param notifyMethod - * The notification method of the interested object. - * - * @param notifyContext - * The notification context of the interested object. - */ - constructor( notifyMethod:Function, notifyContext:any ) - { - this.setNotifyMethod( notifyMethod ); - this.setNotifyContext( notifyContext ); - } - - /** - * Get the notification method. - * - * @return - * The notification (callback) method of the interested object. - */ - private getNotifyMethod():Function - { - return this.notify; - } - - /** - * Set the notification method. - * - * The notification method should take one parameter of type INotification. - * - * @param notifyMethod - * The notification (callback) method of the interested object. - */ - setNotifyMethod( notifyMethod:Function ):void - { - this.notify = notifyMethod; - } - - /** - * Get the notification context. - * - * @return - * The notification context (this) of the interested object. - */ - private getNotifyContext():any - { - return this.context; - } - - /** - * Set the notification context. - * - * @param notifyContext - * The notification context (this) of the interested object. - */ - setNotifyContext( notifyContext:any ):void - { - this.context = notifyContext; - } - - /** - * Notify the interested object. - * - * @param notification - * The INotification to pass to the interested object's notification - * method. - */ - notifyObserver( notification:INotification ):void - { - this.getNotifyMethod().call( this.getNotifyContext(), notification ); - } - - /** - * Compare an object to the notification context. - * - * @param object - * The object to compare. - * - * @return - * The object and the notification context are the same. - */ - compareNotifyContext( object:any ):bool - { - return object === this.context; - } - } -} \ No newline at end of file diff --git a/src/org/puremvc/typescript/patterns/proxy/Proxy.ts b/src/org/puremvc/typescript/patterns/proxy/Proxy.ts deleted file mode 100644 index c14e316..0000000 --- a/src/org/puremvc/typescript/patterns/proxy/Proxy.ts +++ /dev/null @@ -1,124 +0,0 @@ -/// -/// - -/// - -module puremvc -{ - "use strict"; - - /** - * A base IProxy implementation. - * - * In PureMVC, IProxy implementors assume these responsibilities: - *
                                    - *
                                  • Implement a common method which returns the name of the Proxy. - *
                                  • Provide methods for setting and getting the data object. - * - * Additionally, IProxys typically: - *
                                      - *
                                    • Maintain references to one or more pieces of model data. - *
                                    • Provide methods for manipulating that data. - *
                                    • Generate INotifications when their model data changes. - *
                                    • Expose their name as a constant called NAME, if they are not - * instantiated multiple times. - *
                                    • Encapsulate interaction with local or remote services used to fetch and persist model - * data. - */ - export class Proxy - extends Notifier - implements IProxy, INotifier - { - /** - * The data object controlled by the Proxy. - * - * @protected - */ - proxyName:string = null; - - /** - * The name of the Proxy. - * - * @protected - */ - data:any = null; - - /** - * Constructs a Proxy instance. - * - * @param proxyName - * The name of the Proxy instance. - * - * @param data - * An initial data object to be held by the Proxy. - */ - constructor( proxyName:string=null, data:any=null ) - { - super(); - - this.proxyName = (proxyName != null) ? proxyName : Proxy.NAME; - - if( data != null ) - this.setData(data); - } - - /** - * Get the name of the Proxy> instance. - * - * @return - * The name of the Proxy> instance. - */ - getProxyName():string - { - return this.proxyName; - } - - /** - * Set the data of the Proxy> instance. - * - * @param data - * The data to set for the Proxy> instance. - */ - setData( data:any ):void - { - this.data = data; - } - - /** - * Get the data of the Proxy> instance. - * - * @return - * The data held in the Proxy instance. - */ - getData():any - { - return this.data; - } - - /** - * Called by the Model when the Proxy is registered. This method has to be - * overridden by the subclass to know when the instance is registered. - */ - onRegister():void - { - - } - - /** - * Called by the Model when the Proxy is removed. This method has to be - * overridden by the subclass to know when the instance is removed. - */ - onRemove():void - { - - } - - /** - * The default name of the Proxy - * - * @type - * @constant - */ - static NAME:string = "Proxy"; - } -} \ No newline at end of file diff --git a/src/patterns/command/MacroCommand.ts b/src/patterns/command/MacroCommand.ts new file mode 100644 index 0000000..d1334c4 --- /dev/null +++ b/src/patterns/command/MacroCommand.ts @@ -0,0 +1,117 @@ +// +// MacroCommand.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {ICommand} from "../../interfaces/ICommand"; +import {INotification} from "../../interfaces/INotification"; +import {SimpleCommand} from "./SimpleCommand"; + +/** + * A base `Command` implementation that executes other `Command`s. + * + * A `MacroCommand` maintains a list of + * `Command` Class references called `SubCommands`. + * + * When `execute` is called, the `MacroCommand` + * instantiates and calls `execute` on each of its `SubCommands` turn. + * Each `SubCommand` will be passed a reference to the original + * `Notification` that was passed to the `MacroCommand`'s + * `execute` method. + * + * Unlike `SimpleCommand`, your subclass + * should not override `execute`, but instead, should + * override the `initializeMacroCommand` method, + * calling `addSubCommand` once for each `SubCommand` + * to be executed. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link SimpleCommand} + * + * @class MacroCommand + * @extends Notifier + */ +export class MacroCommand extends SimpleCommand { + + /** An array of functions, each of which returns an instance of ICommand. + * @type {(() => ICommand)[]} */ + private subCommands: (() => ICommand)[]; + + /** + * Constructor. + * + * You should not need to define a constructor, + * instead, override the `initializeMacroCommand` + * method. + * + * If your subclass does define a constructor, be + * sure to call `super()`. + * + */ + public constructor() { + super(); + this.subCommands = []; + this.initializeMacroCommand(); + } + + /** + * Initialize the `MacroCommand`. + * + * In your subclass, override this method to + * initialize the `MacroCommand`'s `SubCommand` + * list with `Command` class references like + * this: + * + * ```ts + * // Initialize MyMacroCommand + * initializeMacroCommand() { + * this.addSubCommand(() => new app.FirstCommand()); + * this.addSubCommand(() => new app.SecondCommand()); + * this.addSubCommand(() => new app.ThirdCommand()); + * } + * ``` + * + * Note that `SubCommand`s may be any `Command` implementor, + * `MacroCommand`s or `SimpleCommands` are both acceptable. + */ + public initializeMacroCommand(): void { + + } + + /** + * Add a `SubCommand`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {() => ICommand} factory - A factory function that creates an instance of ICommand. This function will be used to generate the sub-command. + * @returns {void} + */ + protected addSubCommand(factory: () => ICommand): void { + this.subCommands.push(factory); + } + + /** + * Execute this `MacroCommand`'s `SubCommands`. + * + * The `SubCommands` will be called in First In/First Out (FIFO) + * order. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + public execute(notification: INotification): void { + while (this.subCommands.length > 0) { + const factory: (() => ICommand) | undefined = this.subCommands.shift(); + const command: ICommand | undefined = factory?.(); + if (command) { + command.execute(notification); + } + } + } + +} diff --git a/src/patterns/command/SimpleCommand.ts b/src/patterns/command/SimpleCommand.ts new file mode 100644 index 0000000..105443c --- /dev/null +++ b/src/patterns/command/SimpleCommand.ts @@ -0,0 +1,43 @@ +// +// SimpleCommand.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {ICommand} from "../../interfaces/ICommand"; +import {INotification} from "../../interfaces/INotification"; +import {Notifier} from "../observer/Notifier"; + +/** + * A base `Command` implementation. + * + * Your subclass should override the `execute` + * method where your business logic will handle the `Notification`. + * + * @see {@link Controller} + * @see {@link Notification} + * @see {@link MacroCommand} + * + * @class SimpleCommand + * @extends Notifier + */ +export class SimpleCommand extends Notifier implements ICommand { + + /** + * Fulfill the use-case initiated by the given `Notification`. + * + * In the Command Pattern, an application use-case typically + * begins with some user action, which results in a `Notification` being broadcast, which + * is handled by business logic in the `execute` method of an + * `Command`. + * + * @param {INotification} notification - The notification containing the data or command details to be processed. + * @returns {void} + */ + public execute(notification: INotification): void { + + } + +} diff --git a/src/patterns/facade/Facade.ts b/src/patterns/facade/Facade.ts new file mode 100644 index 0000000..052ddf9 --- /dev/null +++ b/src/patterns/facade/Facade.ts @@ -0,0 +1,316 @@ +// +// Facade.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IController} from "../../interfaces/IController"; +import {IModel} from "../../interfaces/IModel"; +import {IView} from "../../interfaces/IView"; +import {ICommand} from "../../interfaces/ICommand"; +import {IFacade} from "../../interfaces/IFacade"; +import {IMediator} from "../../interfaces/IMediator"; +import {INotification} from "../../interfaces/INotification"; +import {IProxy} from "../../interfaces/IProxy"; +import {Controller} from "../../core/Controller"; +import {Model} from "../../core/Model"; +import {View} from "../../core/View"; +import {Notification} from "../observer/Notification"; + +/** + * A base Singleton `Facade` implementation. + * + * @see {@link Model} + * @see {@link View} + * @see {@link Controller} + * + * @class Facade + */ +export class Facade implements IFacade { + + /** Message Constants + * @type {string} */ + protected static SINGLETON_MSG: string = "Facade Singleton already constructed!"; + + /** + * Singleton instance + * + * @type {IFacade} + * @protected + */ + protected static instance: IFacade; + + /** Reference to Controller + * @type {IController | undefined} */ + protected controller?: IController; + + /** Reference to Model + * @type {IModel | undefined} */ + protected model?: IModel; + + /** Reference to View + * @type {IView | undefined} */ + protected view?: IView; + + /** + * Constructor. + * + * This `Facade` implementation is a Singleton, + * so you should not call the constructor + * directly, but instead call the static Factory method, + * `Facade.getInstance()` + * + * @throws {Error} Error if instance for this Singleton instance has already been constructed + */ + public constructor() { + if (Facade.instance != null) throw Error(Facade.SINGLETON_MSG); + Facade.instance = this; + this.initializeFacade(); + } + + /** + * Initialize the Singleton `Facade` instance. + * + * Called automatically by the constructor. Override in your + * subclass to do any subclass specific initializations. Be + * sure to call `super.initializeFacade()`, though. + * + * @returns {void} + */ + protected initializeFacade(): void { + this.initializeModel(); + this.initializeController(); + this.initializeView(); + } + + /** + * Facade Singleton Factory method + * + * @returns {IFacade} the Singleton instance of the Facade + */ + public static getInstance(factory: () => IFacade): IFacade { + if (Facade.instance == null) + Facade.instance = factory(); + return Facade.instance; + } + + /** + * Initialize the `Model`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Model`. + * - You have `Proxy`s to register with the Model that do not + * retrieve a reference to the Facade at construction time.` + * + * If you don't want to initialize a different `Model`, + * call `super.initializeModel()` at the beginning of your + * method, then register `Proxy`s. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Proxy`s + * with the `Model`, since `Proxy`s with mutable data will likely + * need to send `Notification`s and thus will likely want to fetch a reference to + * the `Facade` during their construction. + * + * @returns {void} + */ + protected initializeModel(): void { + this.model = Model.getInstance(() => new Model()); + } + + /** + * Initialize the `Controller`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `Controller`. + * - You have `Commands` to register with the `Controller` at startup.`. + * + * If you don't want to initialize a different `Controller`, + * call `super.initializeController()` at the beginning of your + * method, then register `Command`s. + * + * @returns {void} + */ + protected initializeController(): void { + this.controller = Controller.getInstance(() => new Controller()); + } + + /** + * Initialize the `View`. + * + * Called by the `initializeFacade` method. + * Override this method in your subclass of `Facade` + * if one or both of the following are true: + * + * - You wish to initialize a different `View`. + * - You have `Observers` to register with the `View` + * + * If you don't want to initialize a different `View`, + * call `super.initializeView()` at the beginning of your + * method, then register `Mediator` instances. + * + * Note: This method is rarely overridden; in practice you are more + * likely to use a `Command` to create and register `Mediator`s + * with the `View`, since `Mediator` instances will need to send + * `Notification`s and thus will likely want to fetch a reference + * to the `Facade` during their construction. + * + * @returns {void} + */ + protected initializeView(): void { + this.view = View.getInstance(() => new View()); + } + + /** + * Register a `Command` with the `Controller` by Notification name. * + * + * @param {string} notificationName - The name of the notification to associate with the command. + * @param {() => ICommand} factory - A factory function that returns an instance of ICommand. This function is used to create the command. + * @returns {void} + */ + public registerCommand(notificationName: string, factory: () => ICommand): void { + this.controller?.registerCommand(notificationName, factory); + } + + /** + * Check if a Command is registered for a given Notification + * + * @param {string} notificationName - The name of the notification to check. + * @returns {boolean} `true` if a command is registered for the notification; otherwise, `false`. + */ + public hasCommand(notificationName: string): boolean { + return this.controller?.hasCommand(notificationName) ?? false; + } + + /** + * Remove a previously registered `Command` to `Notification` mapping from the Controller. + * + * @param {string} notificationName - The name of the notification for which the command should be removed. + * @returns {void} + */ + public removeCommand(notificationName: string): void { + this.controller?.removeCommand(notificationName); + } + + /** + * Register a `Proxy` with the `Model` by name. + * + * @param {IProxy} proxy - The proxy instance to be registered. + * @returns {void} + */ + public registerProxy(proxy: IProxy): void { + this.model?.registerProxy(proxy); + } + + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to retrieve. + * @returns {IProxy | null} The proxy instance associated with the given name, or `null` if no such proxy exists. + */ + public retrieveProxy(proxyName: string): IProxy | null { + return this.model?.retrieveProxy(proxyName) ?? null; + } + + /** + * Check if a `Proxy` is registered + * + * @param {string} proxyName - The name of the proxy to check. + * @returns {boolean} `true` if a proxy is registered for the name; otherwise, `false`. + */ + public hasProxy(proxyName: string): boolean { + return this.model?.hasProxy(proxyName) ?? false; + } + + /** + * Remove a `Proxy` from the `Model` by name. + * + * @param {string} proxyName - The name of the proxy to remove. + * @returns {IProxy | null} The removed proxy instance, or `null` if no such proxy exists. + */ + public removeProxy(proxyName: string): IProxy | null { + return this.model?.removeProxy(proxyName) ?? null; + } + + /** + * Register a `Mediator` with the `View`. + * + * @param {IMediator} mediator - The mediator instance to be registered. + * @returns {void} + */ + public registerMediator(mediator: IMediator): void { + this.view?.registerMediator(mediator); + } + + /** + * Retrieve a `Proxy` from the `Model` by name. + * + * @param {string} mediatorName - The name of the mediator to retrieve. + * @returns {IMediator | null} The mediator instance associated with the given name, or `null` if no such mediator exists. + */ + public retrieveMediator(mediatorName: string): IMediator | null { + return this.view?.retrieveMediator(mediatorName) ?? null; + } + + /** + * Check if a `Mediator` is registered or not + * + * @param {string} mediatorName - The name of the mediator to check. + * @returns {boolean} `true` if a mediator is registered for the name; otherwise, `false`. + */ + public hasMediator(mediatorName: string): boolean { + return this.view?.hasMediator(mediatorName) ?? false; + } + + /** + * Remove a `Mediator` from the `View`. + * + * @param {string} mediatorName - The name of the mediator to remove. + * @returns {IMediator | null} The removed mediator instance, or `null` if no such mediator exists. + */ + public removeMediator(mediatorName: string): IMediator | null { + return this.view?.removeMediator(mediatorName) ?? null; + } + + /** + * Notify `Observer`s. + * + * This method is left public mostly for backward + * compatibility, and to allow you to send custom + * notification classes using the facade. + * + * Usually you should just call `sendNotification` + * and pass the parameters, never having to + * construct the notification yourself. + * + * @param {INotification} notification - The notification to be sent to observers. + * @returns {void} + */ + public notifyObservers(notification: INotification): void { + this.view?.notifyObservers(notification); + } + + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + public sendNotification(notificationName: string, body?: any, type?: string): void { + this.notifyObservers(new Notification(notificationName, body, type)); + } + +} diff --git a/src/patterns/mediator/Mediator.ts b/src/patterns/mediator/Mediator.ts new file mode 100644 index 0000000..7ed5777 --- /dev/null +++ b/src/patterns/mediator/Mediator.ts @@ -0,0 +1,120 @@ +// +// Mediator.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IMediator} from "../../interfaces/IMediator"; +import {INotification} from "../../interfaces/INotification"; +import {Notifier} from "../observer/Notifier"; + +/** + * A base `Mediator` implementation. + * + * @see {@link View} + * + * @class Mediator + * @extends Notifier + */ +export class Mediator extends Notifier implements IMediator { + + /** The default name for the mediator. + * @type {string} */ + public static NAME: string = "Mediator"; + + /** the mediator name + @type {string} */ + protected readonly _name: string; + + /** The view component + * @type {any} */ + protected _viewComponent?: any; + + /** + * Constructor. + * + * @param {string} [name] - Optional name for the mediator. Defaults to `Mediator.NAME`. + * @param {any} [viewComponent] - Optional view component associated with the mediator. + */ + public constructor(name?: string, viewComponent?: any) { + super(); + this._name = name || Mediator.NAME; + this._viewComponent = viewComponent; + } + + /** + * Called by the View when the Mediator is registered + * + * @returns {void} + */ + public onRegister(): void { + + } + + /** + * Called by the View when the Mediator is removed + * + * @returns {void} + */ + public onRemove(): void { + + } + + /** + * List the `Notification` names this + * `Mediator` is interested in being notified of. + * + * @returns {string[]} An array of notification names. + */ + public listNotificationInterests(): string[] { + return []; + } + + /** + * Handle `Notification`s. + * + * Typically, this will be handled in a switch statement, + * with one 'case' entry per `Notification` + * the `Mediator` is interested in. + * + * @param {INotification} notification - The notification to handle. + * @returns {void} + */ + public handleNotification(notification: INotification): void { + + } + + /** + * the mediator name + * + * @returns {string} The name of the mediator. + */ + public get name(): string { + return this._name; + } + + /** + * Get the `Mediator`'s view component. + * + * Additionally, an implicit getter will usually + * be defined in the subclass that casts the view + * object to a type, like this: + * + * @returns {any} The view component. + */ + public get viewComponent(): any { + return this._viewComponent; + } + + /** + * Set the `Mediator`'s view component. + * + * @param {any} value - The new view component. + */ + public set viewComponent(value: any) { + this._viewComponent = value; + } + +} diff --git a/src/patterns/observer/Notification.ts b/src/patterns/observer/Notification.ts new file mode 100644 index 0000000..edb4216 --- /dev/null +++ b/src/patterns/observer/Notification.ts @@ -0,0 +1,125 @@ +// +// Notification.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotification} from "../../interfaces/INotification"; + +/** + * A base `Notification` implementation. + * + * PureMVC does not rely upon underlying event models such + * as the one provided with Flash, and ActionScript 3 does + * not have an inherent event model. + * + * The Observer Pattern as implemented within PureMVC exists + * to support event-driven communication between the + * application and the actors of the MVC triad. + * + * Notifications are not meant to be a replacement for Events + * in Flex/Flash/Apollo. Generally, `Mediator` implementors + * place event listeners on their view components, which they + * then handle in the usual way. This may lead to the broadcast of `Notification`s to + * trigger `Command`s or to communicate with other `Mediators`. `Proxy` and `Command` + * instances communicate with each other and `Mediator`s + * by broadcasting `Notification`s. + * + * A key difference between Flash `Event`s and PureMVC + * `Notification`s is that `Event`s follow the + * 'Chain of Responsibility' pattern, 'bubbling' up the display hierarchy + * until some parent component handles the `Event`, while + * PureMVC `Notification`s follow a 'Publish/Subscribe' + * pattern. PureMVC classes need not be related to each other in a + * parent/child relationship in order to communicate with one another + * using `Notification`s. + * + * @class Notification + */ +export class Notification implements INotification { + + /** the name of the notification instance + * @type {string} */ + private readonly _name: string; + + /** the body of the notification instance + * @type {any} */ + private _body?: any; + + /** + * @type {string | undefined } */ + private _type?: string | undefined; + + /** + * Constructor. + * + * @param {string} name - The name of the notification. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + */ + public constructor(name: string, body?: any, type?: string) { + this._name = name; + this._body = body; + this._type = type; + } + + /** + * Get the name of the `Notification` instance. + * + * @returns {string} The name of the notification. + */ + public get name(): string { + return this._name; + } + + /** + * Get the body of the `Notification` instance. + * + * @returns {any} The body of the notification. + */ + public get body(): any { + return this._body; + } + + /** + * Set the body of the `Notification` instance. + * + * @param {any} value - The new body to be set for the notification. + */ + public set body(value: any) { + this._body = value; + } + + /** + * Get the type of the `Notification` instance. + * + * @returns {string | undefined} The type of the notification, or `undefined` if not set. + */ + public get type(): string | undefined { + return this._type; + } + + /** + * Set the type of the `Notification` instance. + * + * @param {string | undefined} value - The new type to be set for the notification. + */ + public set type(value: string | undefined) { + this._type = value; + } + + /** + * Get the string representation of the `Notification` instance. + * + * @returns {string} A string representation of the notification. + */ + public toString(): string { + let msg: string = `Notification Name: ${this.name}`; + msg += `\nBody: ${this.body ? this.body : "null"}`; + msg += `\nType: ${this.type ?? "null"}`; + return msg; + } + +} diff --git a/src/patterns/observer/Notifier.ts b/src/patterns/observer/Notifier.ts new file mode 100644 index 0000000..0dd5221 --- /dev/null +++ b/src/patterns/observer/Notifier.ts @@ -0,0 +1,62 @@ +// +// Notifier.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotifier} from "../../interfaces/INotifier"; +import {IFacade} from "../../interfaces/IFacade"; +import {Facade} from "../facade/Facade"; + +/** + * A Base `Notifier` implementation. + * + * `MacroCommand, Command, Mediator` and `Proxy` + * all have a need to send `Notifications`. + * + * The `Notifier` interface provides a common method called + * `sendNotification` that relieves implementation code of + * the necessity to actually construct `Notifications`. + * + * The `Notifier` class, which all the above-mentioned classes + * extend, provides an initialized reference to the `Facade` + * Singleton, which is required for the convenience method + * for sending `Notifications`, but also eases implementation as these + * classes have frequent `Facade` interactions and usually require + * access to the facade anyway. + * + * @see {@link Proxy} + * @see {@link Facade} + * @see {@link Mediator} + * @see {@link MacroCommand} + * @see {@link SimpleCommand} + * + * @class Notifier + */ +export class Notifier implements INotifier { + + /** + * Create and send an `Notification`. + * + * Keeps us from having to construct new Notification + * instances in our implementation code. + * + * @param {string} notificationName - The name of the notification to be sent. + * @param {any} [body] - Optional data to be included with the notification. + * @param {string} [type] - Optional type of the notification. + * @returns {void} + */ + public sendNotification(notificationName: string, body?: any, type?: string): void { + this.facade.sendNotification(notificationName, body, type); + } + + /** + * Return the Singleton Facade instance + * + * @returns {IFacade} The facade instance. + */ + protected facade: IFacade = Facade.getInstance(() => new Facade()); + +} diff --git a/src/patterns/observer/Observer.ts b/src/patterns/observer/Observer.ts new file mode 100644 index 0000000..3404d46 --- /dev/null +++ b/src/patterns/observer/Observer.ts @@ -0,0 +1,106 @@ +// +// Observer.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IObserver} from "../../interfaces/IObserver"; +import {INotification} from "../../interfaces/INotification"; + +/** + * A base `Observer` implementation. + * + * An `Observer` is an object that encapsulates information + * about an interested object with a method that should + * be called when a particular `Notification` is broadcast. + * + * In PureMVC, the `Observer` class assumes these responsibilities: + * + * - Encapsulate the notification (callback) method of the interested object. + * - Encapsulate the notification context (this) of the interested object. + * - Provide methods for setting the notification method and context. + * - Provide a method for notifying the interested object. + * + * @class Observer + */ +export class Observer implements IObserver { + + private _notifyMethod?: ((notification: INotification) => void) | null; + + private _notifyContext?: any | null; + + /** + * Constructor. + * + * The notification method on the interested object should take + * one parameter of type `Notification` + * + * @param {((notification: INotification) => void) | null} notify - The method to be called when a notification is received. Can be `null`. + * @param {any | null} context - The context in which to call the `notifyMethod`. Can be `null`. + */ + constructor(notify?: ((notification: INotification) => void) | null, context?: any | null) { + this._notifyMethod = notify; + this._notifyContext = context; + } + + /** + * Get the notification method. + * + * @returns {((notification: INotification) => void) | null} The current method or `null` if no method is set. + */ + public get notifyMethod(): ((notification: INotification) => void) | null | undefined { + return this._notifyMethod; + } + + /** + * Set the notification method. + * + * The notification method should take one parameter of type `Notification`. + * + * @param {((notification: INotification) => void) | null} value - The method to set for handling notifications. Can be `null`. + */ + public set notifyMethod(value: ((notification: INotification) => void) | null) { + this._notifyMethod = value; + } + + /** + * Get the notifyContext + * + * @returns {any | null} The current context or `null` if no context is set. + */ + public get notifyContext(): any | null { + return this._notifyContext; + } + + /** + * Set the notification context. + * + * @param {any | null} value - The context to set. Can be `null`. + */ + public set notifyContext(value: any | null) { + this._notifyContext = value; + } + + /** + * Notify the interested object. + * + * @param {INotification} notification - The notification to send to the observer. + * @returns {void} + */ + public notifyObserver(notification: INotification): void { + this.notifyMethod?.call(this.notifyContext, notification); + } + + /** + * Compare an object to the notification context. + * + * @param {any} object - The object to compare with the observer's context. + * @returns {boolean} `true` if the context is the same, otherwise `false`. + */ + public compareNotifyContext(object: any): boolean { + return object == this.notifyContext; + } + +} diff --git a/src/patterns/proxy/Proxy.ts b/src/patterns/proxy/Proxy.ts new file mode 100644 index 0000000..4fb5ae7 --- /dev/null +++ b/src/patterns/proxy/Proxy.ts @@ -0,0 +1,107 @@ +// +// Proxy.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IProxy} from "../../interfaces/IProxy"; +import {Notifier} from "../observer/Notifier"; + +/** + * A base `Proxy` implementation. + * + * In PureMVC, `Proxy` classes are used to manage parts of the + * application's data model. + * + * A `Proxy` might simply manage a reference to a local data object, + * in which case interacting with it might involve setting and + * getting of its data in synchronous fashion. + * + * `Proxy` classes are also used to encapsulate the application's + * interaction with remote services to save or retrieve data, in which case, + * we adopt an asynchronous idiom; setting data (or calling a method) on the + * `Proxy` and listening for a `Notification` to be sent + * when the `Proxy` has retrieved the data from the service. + * + * @see {@link Model} + * + * @class Proxy + * @extends Notifier + */ +export class Proxy extends Notifier implements IProxy { + + /** + * The default name for the Proxy. + * + * @type {string} + */ + public static NAME: string = "Proxy"; + + /** the proxy name + * @type {string} _name */ + protected readonly _name: string; + + /** the data object + * @type {any} _data */ + protected _data?: any; + + /** + * Constructor + * + * @param {string} [name] - The name of the proxy. Defaults to `Proxy.NAME` if not provided. + * @param {any} [data] - The data associated with the proxy. Can be `null`. + */ + public constructor(name?: string, data?: any) { + super(); + this._name = name || Proxy.NAME; + this._data = data; + } + + /** + * Called by the Model when the Proxy is registered + * + * @returns {void} + */ + public onRegister(): void { + + } + + /** + * Called by the Model when the Proxy is removed + * + * @returns {void} + */ + public onRemove(): void { + + } + + /** + * Get the proxy name + * + * @returns {string} The name of the proxy. + */ + public get name(): string { + return this._name; + } + + /** + * Get the data object + * + * @returns {any} The current data or `undefined` if no data is set. + */ + public get data(): any { + return this._data; + } + + /** + * Set the data object + * + * @param {any} value - The data to set. Can be `null`. + */ + public set data(value: any) { + this._data = value; + } + +} diff --git a/test.html b/test.html deleted file mode 100644 index 92e1e53..0000000 --- a/test.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - PureMVC TypeScript Standard Framework Unit Tests - - - - - - - - - - - - - - - - - - - -

                                      PureMVC TypeScript Standard Framework Unit Tests

                                      - -
                                      - - - - - - \ No newline at end of file diff --git a/test/bin/puremvc-typescript-standard-1.0-unit-tests.js b/test/bin/puremvc-typescript-standard-1.0-unit-tests.js deleted file mode 100644 index 8e601dc..0000000 --- a/test/bin/puremvc-typescript-standard-1.0-unit-tests.js +++ /dev/null @@ -1,1079 +0,0 @@ -if( typeof define === "function" ) -{ - define( "test", ['YUITest','puremvc'], function(YUITest,puremvc) - { - var test; - (function (test) { - "use strict"; - var ControllerTestVO = (function () { - function ControllerTestVO(input) { - this.input = 0; - this.result = 0; - this.input = input; - } - return ControllerTestVO; - })(); - test.ControllerTestVO = ControllerTestVO; - })(test || (test = {})); - - var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); - } - var test; - (function (test) { - "use strict"; - var ControllerTestCommand2 = (function (_super) { - __extends(ControllerTestCommand2, _super); - function ControllerTestCommand2() { - _super.apply(this, arguments); - - } - ControllerTestCommand2.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result = vo.result + (2 * vo.input); - }; - return ControllerTestCommand2; - })(puremvc.SimpleCommand); - test.ControllerTestCommand2 = ControllerTestCommand2; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ControllerTestCommand = (function (_super) { - __extends(ControllerTestCommand, _super); - function ControllerTestCommand() { - _super.apply(this, arguments); - - } - ControllerTestCommand.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result = 2 * vo.input; - }; - return ControllerTestCommand; - })(puremvc.SimpleCommand); - test.ControllerTestCommand = ControllerTestCommand; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ControllerTest = (function () { - function ControllerTest() { - this.name = "PureMVC Controller class tests"; - } - ControllerTest.prototype.testGetInstance = function () { - var controller = puremvc.Controller.getInstance(); - YUITest.Assert.isNotNull(controller, "Expecting instance !== null"); - YUITest.Assert.isInstanceOf(puremvc.Controller, controller, "Expecting instance extends Controller"); - }; - ControllerTest.prototype.testRegisterAndExecuteCommand = function () { - var controller = puremvc.Controller.getInstance(); - controller.registerCommand('ControllerTest', test.ControllerTestCommand); - var vo = new test.ControllerTestVO(12); - var notification = new puremvc.Notification('ControllerTest', vo); - controller.executeCommand(notification); - YUITest.Assert.areEqual(24, vo.result, "Expecting vo.result == 24"); - }; - ControllerTest.prototype.testRegisterAndRemoveCommand = function () { - var controller = puremvc.Controller.getInstance(); - controller.registerCommand('ControllerRemoveTest', test.ControllerTestCommand); - var vo = new test.ControllerTestVO(12); - var notification = new puremvc.Notification('ControllerRemoveTest', vo); - controller.executeCommand(notification); - YUITest.Assert.areEqual(24, vo.result, "Expecting vo.result == 24"); - vo.result = 0; - controller.removeCommand('ControllerRemoveTest'); - controller.executeCommand(notification); - YUITest.Assert.areEqual(0, vo.result, "Expecting vo.result == 0"); - }; - ControllerTest.prototype.testHasCommand = function () { - var controller = puremvc.Controller.getInstance(); - controller.registerCommand('hasCommandTest', test.ControllerTestCommand); - YUITest.Assert.isTrue(controller.hasCommand('hasCommandTest'), "Expecting controller.hasCommand('hasCommandTest') === true"); - controller.removeCommand('hasCommandTest'); - YUITest.Assert.isFalse(controller.hasCommand('hasCommandTest'), "Expecting controller.hasCommand('hasCommandTest') === false"); - }; - ControllerTest.prototype.testReregisterAndExecuteCommand = function () { - var controller = puremvc.Controller.getInstance(); - controller.registerCommand('ControllerTest2', test.ControllerTestCommand2); - controller.removeCommand('ControllerTest2'); - controller.registerCommand('ControllerTest2', test.ControllerTestCommand2); - var vo = new test.ControllerTestVO(12); - var notification = new puremvc.Notification('ControllerTest2', vo); - var view = puremvc.View.getInstance(); - view.notifyObservers(notification); - YUITest.Assert.areEqual(24, vo.result, "Expecting vo.result == 24"); - view.notifyObservers(notification); - YUITest.Assert.areEqual(48, vo.result, "Expecting vo.result == 48"); - }; - return ControllerTest; - })(); - test.ControllerTest = ControllerTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ModelTestProxy = (function (_super) { - __extends(ModelTestProxy, _super); - function ModelTestProxy() { - _super.call(this, ModelTestProxy.NAME, ''); - } - ModelTestProxy.prototype.onRegister = function () { - this.setData(ModelTestProxy.ON_REGISTER_CALLED); - }; - ModelTestProxy.prototype.onRemove = function () { - this.setData(ModelTestProxy.ON_REMOVE_CALLED); - }; - ModelTestProxy.NAME = 'ModelTestProxy'; - ModelTestProxy.ON_REGISTER_CALLED = 'onRegister Called'; - ModelTestProxy.ON_REMOVE_CALLED = 'onRemove Called'; - return ModelTestProxy; - })(puremvc.Proxy); - test.ModelTestProxy = ModelTestProxy; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ModelTest = (function () { - function ModelTest() { - this.name = "PureMVC Model class tests"; - } - ModelTest.prototype.testGetInstance = function () { - var model = puremvc.Model.getInstance(); - YUITest.Assert.isNotNull(model, "Expecting instance !== null"); - YUITest.Assert.isInstanceOf(puremvc.Model, model, "Expecting instance extends Model"); - }; - ModelTest.prototype.testRegisterAndRetrieveProxy = function () { - var model = puremvc.Model.getInstance(); - model.registerProxy(new puremvc.Proxy('colors', [ - 'red', - 'green', - 'blue' - ])); - var proxy = model.retrieveProxy('colors'); - var data = proxy.getData(); - YUITest.Assert.isNotNull(data, "Expecting data !== null"); - YUITest.Assert.isArray(data, "Expecting data type is Array"); - YUITest.Assert.areEqual(3, data.length, "Expecting data.length == 3"); - YUITest.Assert.areEqual('red', data[0], "Expecting data[0] == 'red'"); - YUITest.Assert.areEqual('green', data[1], "Expecting data[1] == 'green'"); - YUITest.Assert.areEqual('blue', data[2], "Expecting data[2] == 'blue'"); - }; - ModelTest.prototype.testRegisterAndRemoveProxy = function () { - var model = puremvc.Model.getInstance(); - var proxy = new puremvc.Proxy('sizes', [ - '7', - '13', - '21' - ]); - model.registerProxy(proxy); - var removedProxy = model.removeProxy('sizes'); - YUITest.Assert.areEqual('sizes', removedProxy.getProxyName(), "Expecting removedProxy.getProxyName() == 'sizes'"); - proxy = model.retrieveProxy('sizes'); - YUITest.Assert.isNull(proxy, "Expecting proxy === null"); - }; - ModelTest.prototype.testHasProxy = function () { - var model = puremvc.Model.getInstance(); - var proxy = new puremvc.Proxy('aces', [ - 'clubs', - 'spades', - 'hearts', - 'diamonds' - ]); - model.registerProxy(proxy); - YUITest.Assert.isTrue(model.hasProxy('aces'), "Expecting model.hasProxy('aces') === true"); - model.removeProxy('aces'); - YUITest.Assert.isFalse(model.hasProxy('aces'), "Expecting model.hasProxy('aces') === false"); - }; - ModelTest.prototype.testOnRegisterAndOnRemove = function () { - var model = puremvc.Model.getInstance(); - var proxy = new test.ModelTestProxy(); - model.registerProxy(proxy); - YUITest.Assert.areEqual(test.ModelTestProxy.ON_REGISTER_CALLED, proxy.getData(), "Expecting proxy.getData() == ModelTestProxy.ON_REGISTER_CALLED"); - model.removeProxy(test.ModelTestProxy.NAME); - YUITest.Assert.areEqual(test.ModelTestProxy.ON_REMOVE_CALLED, proxy.getData(), "Expecting proxy.getData() == ModelTestProxy.ON_REMOVE_CALLED"); - }; - return ModelTest; - })(); - test.ModelTest = ModelTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator = (function (_super) { - __extends(ViewTestMediator, _super); - function ViewTestMediator(view) { - _super.call(this, ViewTestMediator.NAME, view); - } - ViewTestMediator.prototype.listNotificationInterests = function () { - return [ - 'ABC', - 'DEF', - 'GHI' - ]; - }; - ViewTestMediator.NAME = "ViewTestMediator"; - return ViewTestMediator; - })(puremvc.Mediator); - test.ViewTestMediator = ViewTestMediator; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator2 = (function (_super) { - __extends(ViewTestMediator2, _super); - function ViewTestMediator2(view) { - _super.call(this, ViewTestMediator2.NAME, view); - } - ViewTestMediator2.prototype.getViewTest = function () { - return this.viewComponent; - }; - ViewTestMediator2.prototype.listNotificationInterests = function () { - return [ - test.ViewTest.NOTE1, - test.ViewTest.NOTE2 - ]; - }; - ViewTestMediator2.prototype.handleNotification = function (notification) { - this.getViewTest().lastNotification = notification.getName(); - }; - ViewTestMediator2.NAME = 'ViewTestMediator2'; - return ViewTestMediator2; - })(puremvc.Mediator); - test.ViewTestMediator2 = ViewTestMediator2; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator3 = (function (_super) { - __extends(ViewTestMediator3, _super); - function ViewTestMediator3(view) { - _super.call(this, ViewTestMediator3.NAME, view); - } - ViewTestMediator3.prototype.getViewTest = function () { - return this.viewComponent; - }; - ViewTestMediator3.prototype.listNotificationInterests = function () { - return [ - test.ViewTest.NOTE3 - ]; - }; - ViewTestMediator3.prototype.handleNotification = function (notification) { - this.getViewTest().lastNotification = notification.getName(); - }; - ViewTestMediator3.NAME = 'ViewTestMediator3'; - return ViewTestMediator3; - })(puremvc.Mediator); - test.ViewTestMediator3 = ViewTestMediator3; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator4 = (function (_super) { - __extends(ViewTestMediator4, _super); - function ViewTestMediator4(view) { - _super.call(this, ViewTestMediator4.NAME, view); - } - ViewTestMediator4.prototype.getViewTest = function () { - return this.viewComponent; - }; - ViewTestMediator4.prototype.onRegister = function () { - this.getViewTest().onRegisterCalled = true; - }; - ViewTestMediator4.prototype.onRemove = function () { - this.getViewTest().onRemoveCalled = true; - }; - ViewTestMediator4.NAME = 'ViewTestMediator4'; - return ViewTestMediator4; - })(puremvc.Mediator); - test.ViewTestMediator4 = ViewTestMediator4; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator5 = (function (_super) { - __extends(ViewTestMediator5, _super); - function ViewTestMediator5(view) { - _super.call(this, ViewTestMediator5.NAME, view); - } - ViewTestMediator5.prototype.getViewTest = function () { - return this.viewComponent; - }; - ViewTestMediator5.prototype.listNotificationInterests = function () { - return [ - test.ViewTest.NOTE5 - ]; - }; - ViewTestMediator5.prototype.handleNotification = function (notification) { - this.getViewTest().counter++; - }; - ViewTestMediator5.NAME = 'ViewTestMediator5'; - return ViewTestMediator5; - })(puremvc.Mediator); - test.ViewTestMediator5 = ViewTestMediator5; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestMediator6 = (function (_super) { - __extends(ViewTestMediator6, _super); - function ViewTestMediator6(mediatorName, view) { - _super.call(this, mediatorName, view); - } - ViewTestMediator6.prototype.getViewTest = function () { - return this.viewComponent; - }; - ViewTestMediator6.prototype.listNotificationInterests = function () { - return [ - test.ViewTest.NOTE6 - ]; - }; - ViewTestMediator6.prototype.handleNotification = function (notification) { - this.facade.removeMediator(this.getMediatorName()); - }; - ViewTestMediator6.prototype.onRemove = function () { - this.getViewTest().counter++; - }; - ViewTestMediator6.NAME = 'ViewTestMediator6'; - return ViewTestMediator6; - })(puremvc.Mediator); - test.ViewTestMediator6 = ViewTestMediator6; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTestNote = (function (_super) { - __extends(ViewTestNote, _super); - function ViewTestNote(name, body) { - _super.call(this, ViewTestNote.NAME, body); - } - ViewTestNote.NAME = "ViewTestNote"; - ViewTestNote.create = function create(body) { - return new ViewTestNote(ViewTestNote.NAME, body); - } - return ViewTestNote; - })(puremvc.Notification); - test.ViewTestNote = ViewTestNote; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ViewTest = (function () { - function ViewTest() { - this.name = "PureMVC View class tests"; - this.lastNotification = ""; - this.counter = 0; - this.onRegisterCalled = false; - this.onRemoveCalled = false; - this.viewTestVar = 0; - } - ViewTest.prototype.testGetInstance = function () { - var view = puremvc.View.getInstance(); - YUITest.Assert.isNotNull(view, "Expecting instance !== null"); - YUITest.Assert.isInstanceOf(puremvc.View, view, "Expecting instance implements View"); - }; - ViewTest.prototype.testRegisterAndNotifyObserver = function () { - var view = puremvc.View.getInstance(); - var observer = new puremvc.Observer(this.viewTestMethod, this); - view.registerObserver(test.ViewTestNote.NAME, observer); - var notification = test.ViewTestNote.create(10); - view.notifyObservers(notification); - YUITest.Assert.areEqual(10, this.viewTestVar, "Expecting viewTestVar = 10"); - }; - ViewTest.prototype.viewTestMethod = function (notification) { - this.viewTestVar = notification.getBody(); - }; - ViewTest.prototype.testRegisterAndRetrieveMediator = function () { - var view = puremvc.View.getInstance(); - var viewTestMediator = new test.ViewTestMediator(this); - view.registerMediator(viewTestMediator); - var mediator = view.retrieveMediator(test.ViewTestMediator.NAME); - YUITest.Assert.isInstanceOf(test.ViewTestMediator, mediator, "Expecting comp is ViewTestMediator"); - }; - ViewTest.prototype.testHasMediator = function () { - var view = puremvc.View.getInstance(); - var mediator = new puremvc.Mediator('hasMediatorTest', this); - view.registerMediator(mediator); - YUITest.Assert.isTrue(view.hasMediator('hasMediatorTest'), "Expecting view.hasMediator('hasMediatorTest') === true"); - view.removeMediator('hasMediatorTest'); - YUITest.Assert.isFalse(view.hasMediator('hasMediatorTest'), "Expecting view.hasMediator('hasMediatorTest') === false"); - }; - ViewTest.prototype.testRegisterAndRemoveMediator = function () { - var view = puremvc.View.getInstance(); - var mediator = new puremvc.Mediator('testing', this); - view.registerMediator(mediator); - var removedMediator = view.removeMediator('testing'); - YUITest.Assert.areEqual('testing', removedMediator.getMediatorName(), "Expecting removedMediator.getMediatorName() == 'testing'"); - var retrievedMediator = view.retrieveMediator('testing'); - YUITest.Assert.isNull(retrievedMediator, "Expecting view.retrieveMediator( 'testing' ) === null )"); - }; - ViewTest.prototype.testOnRegisterAndOnRemove = function () { - var view = puremvc.View.getInstance(); - var mediator = new test.ViewTestMediator4(this); - view.registerMediator(mediator); - YUITest.Assert.isTrue(this.onRegisterCalled, "Expecting onRegisterCalled === true"); - view.removeMediator(test.ViewTestMediator4.NAME); - YUITest.Assert.isTrue(this.onRemoveCalled, "Expecting onRemoveCalled === true"); - }; - ViewTest.prototype.testSuccessiveRegisterAndRemoveMediator = function () { - var view = puremvc.View.getInstance(); - view.registerMediator(new test.ViewTestMediator(this)); - YUITest.Assert.isInstanceOf(test.ViewTestMediator, view.retrieveMediator(test.ViewTestMediator.NAME), "Expecting view.retrieveMediator( ViewTestMediator.NAME ) isInstanceOf ViewTestMediator"); - view.removeMediator(test.ViewTestMediator.NAME); - YUITest.Assert.isNull(view.retrieveMediator(test.ViewTestMediator.NAME), "Expecting view.retrieveMediator( ViewTestMediator.NAME ) === null"); - YUITest.Assert.isNull(view.removeMediator(test.ViewTestMediator.NAME), "Expecting view.removeMediator( ViewTestMediator.NAME ) === null"); - view.registerMediator(new test.ViewTestMediator(this)); - YUITest.Assert.isInstanceOf(test.ViewTestMediator, view.retrieveMediator(test.ViewTestMediator.NAME), "Expecting view.retrieveMediator( ViewTestMediator.NAME ) is ViewTestMediator"); - view.removeMediator(test.ViewTestMediator.NAME); - YUITest.Assert.isNull(view.retrieveMediator(test.ViewTestMediator.NAME), "Expecting view.retrieveMediator( ViewTestMediator.NAME ) === null"); - }; - ViewTest.prototype.testRemoveMediatorAndSubsequentNotify = function () { - var view = puremvc.View.getInstance(); - view.registerMediator(new test.ViewTestMediator2(this)); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE1)); - YUITest.Assert.areEqual(ViewTest.NOTE1, this.lastNotification, "Expecting lastNotification == NOTE1"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE2)); - YUITest.Assert.areEqual(ViewTest.NOTE2, this.lastNotification, "Expecting lastNotification == NOTE2"); - view.removeMediator(test.ViewTestMediator2.NAME); - YUITest.Assert.isNull(view.retrieveMediator(test.ViewTestMediator2.NAME), "Expecting view.retrieveMediator( ViewTestMediator2.NAME ) === null"); - this.lastNotification = null; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE1)); - YUITest.Assert.areNotEqual(ViewTest.NOTE1, this.lastNotification, "Expecting lastNotification != NOTE1"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE2)); - YUITest.Assert.areNotEqual(ViewTest.NOTE2, this.lastNotification, "Expecting lastNotification != NOTE2"); - }; - ViewTest.prototype.testRemoveOneOfTwoMediatorsAndSubsequentNotify = function () { - var view = puremvc.View.getInstance(); - view.registerMediator(new test.ViewTestMediator2(this)); - view.registerMediator(new test.ViewTestMediator3(this)); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE1)); - YUITest.Assert.areEqual(ViewTest.NOTE1, this.lastNotification, "Expecting lastNotification == NOTE1"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE2)); - YUITest.Assert.areEqual(ViewTest.NOTE2, this.lastNotification, "Expecting lastNotification == NOTE2"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE3)); - YUITest.Assert.areEqual(ViewTest.NOTE3, this.lastNotification, "Expecting lastNotification == NOTE3"); - view.removeMediator(test.ViewTestMediator2.NAME); - YUITest.Assert.isNull(view.retrieveMediator(test.ViewTestMediator2.NAME), "Expecting view.retrieveMediator( ViewTestMediator2.NAME ) === null"); - this.lastNotification = null; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE1)); - YUITest.Assert.areNotEqual(ViewTest.NOTE1, this.lastNotification, "Expecting lastNotification != NOTE1"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE2)); - YUITest.Assert.areNotEqual(ViewTest.NOTE2, this.lastNotification, "Expecting lastNotification != NOTE2"); - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE3)); - YUITest.Assert.areEqual(ViewTest.NOTE3, this.lastNotification, "Expecting lastNotification == NOTE3"); - }; - ViewTest.prototype.testMediatorReregistration = function () { - var view = puremvc.View.getInstance(); - view.registerMediator(new test.ViewTestMediator5(this)); - view.registerMediator(new test.ViewTestMediator5(this)); - this.counter = 0; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE5)); - YUITest.Assert.areEqual(1, this.counter, "Expecting counter == 1"); - view.removeMediator(test.ViewTestMediator5.NAME); - YUITest.Assert.isNull(view.retrieveMediator(test.ViewTestMediator5.NAME), "Expecting view.retrieveMediator( ViewTestMediator5.NAME ) === null"); - this.counter = 0; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE5)); - YUITest.Assert.areEqual(0, this.counter, "Expecting counter == 0"); - }; - ViewTest.prototype.testModifyObserverListDuringNotification = function () { - var view = puremvc.View.getInstance(); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/1", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/2", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/3", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/4", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/5", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/6", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/7", this)); - view.registerMediator(new test.ViewTestMediator6(test.ViewTestMediator6.NAME + "/8", this)); - this.counter = 0; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE6)); - YUITest.Assert.areEqual(8, this.counter, "Expecting counter == 8"); - this.counter = 0; - view.notifyObservers(new puremvc.Notification(ViewTest.NOTE6)); - YUITest.Assert.areEqual(0, this.counter, "Expecting counter == 0"); - }; - ViewTest.NOTE1 = "Notification1"; - ViewTest.NOTE2 = "Notification2"; - ViewTest.NOTE3 = "Notification3"; - ViewTest.NOTE4 = "Notification4"; - ViewTest.NOTE5 = "Notification5"; - ViewTest.NOTE6 = "Notification6"; - return ViewTest; - })(); - test.ViewTest = ViewTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTestSub = (function (_super) { - __extends(MacroCommandTestSub, _super); - function MacroCommandTestSub() { - _super.apply(this, arguments); - - } - MacroCommandTestSub.prototype.hasFacade = function () { - return this.facade instanceof puremvc.Facade; - }; - return MacroCommandTestSub; - })(puremvc.MacroCommand); - test.MacroCommandTestSub = MacroCommandTestSub; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTestVO = (function () { - function MacroCommandTestVO(input) { - this.input = null; - this.result1 = null; - this.result2 = null; - this.input = input; - } - return MacroCommandTestVO; - })(); - test.MacroCommandTestVO = MacroCommandTestVO; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTestSub1Command = (function (_super) { - __extends(MacroCommandTestSub1Command, _super); - function MacroCommandTestSub1Command() { - _super.apply(this, arguments); - - } - MacroCommandTestSub1Command.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result1 = 2 * vo.input; - }; - return MacroCommandTestSub1Command; - })(puremvc.SimpleCommand); - test.MacroCommandTestSub1Command = MacroCommandTestSub1Command; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTestSub2Command = (function (_super) { - __extends(MacroCommandTestSub2Command, _super); - function MacroCommandTestSub2Command() { - _super.apply(this, arguments); - - } - MacroCommandTestSub2Command.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result2 = vo.input * vo.input; - }; - return MacroCommandTestSub2Command; - })(puremvc.SimpleCommand); - test.MacroCommandTestSub2Command = MacroCommandTestSub2Command; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTestCommand = (function (_super) { - __extends(MacroCommandTestCommand, _super); - function MacroCommandTestCommand() { - _super.apply(this, arguments); - - } - MacroCommandTestCommand.prototype.initializeMacroCommand = function () { - this.addSubCommand(test.MacroCommandTestSub1Command); - this.addSubCommand(test.MacroCommandTestSub2Command); - }; - return MacroCommandTestCommand; - })(puremvc.MacroCommand); - test.MacroCommandTestCommand = MacroCommandTestCommand; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MacroCommandTest = (function () { - function MacroCommandTest() { - this.name = "PureMVC MacroCommmand class tests"; - } - MacroCommandTest.prototype.testConstructor = function () { - var macroCommandTestSub = new test.MacroCommandTestSub(); - YUITest.Assert.isTrue(macroCommandTestSub.hasFacade(), "Expecting macroCommandTestSub.hasFacade() === true"); - }; - MacroCommandTest.prototype.testMacroCommandExecute = function () { - var vo = new test.MacroCommandTestVO(5); - var notification = new puremvc.Notification('MacroCommandTest', vo); - var command = new test.MacroCommandTestCommand(); - command.execute(notification); - YUITest.Assert.areEqual(10, vo.result1, "Expecting vo.result1 == 10"); - YUITest.Assert.areEqual(25, vo.result2, "Expecting vo.result2 == 25"); - }; - return MacroCommandTest; - })(); - test.MacroCommandTest = MacroCommandTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var SimpleCommandTestVO = (function () { - function SimpleCommandTestVO(input) { - this.input = null; - this.result = null; - this.input = input; - } - return SimpleCommandTestVO; - })(); - test.SimpleCommandTestVO = SimpleCommandTestVO; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var SimpleCommandTestCommand = (function (_super) { - __extends(SimpleCommandTestCommand, _super); - function SimpleCommandTestCommand() { - _super.apply(this, arguments); - - } - SimpleCommandTestCommand.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result = 2 * vo.input; - }; - return SimpleCommandTestCommand; - })(puremvc.SimpleCommand); - test.SimpleCommandTestCommand = SimpleCommandTestCommand; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var SimpleCommandTestSub = (function (_super) { - __extends(SimpleCommandTestSub, _super); - function SimpleCommandTestSub() { - _super.apply(this, arguments); - - } - SimpleCommandTestSub.prototype.hasFacade = function () { - return this.facade instanceof puremvc.Facade; - }; - return SimpleCommandTestSub; - })(puremvc.SimpleCommand); - test.SimpleCommandTestSub = SimpleCommandTestSub; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var SimpleCommandTest = (function () { - function SimpleCommandTest() { - this.name = "PureMVC SimpleCommand class Tests"; - } - SimpleCommandTest.prototype.testConstructor = function () { - var simpleCommandTestSub = new test.SimpleCommandTestSub(); - YUITest.Assert.isTrue(simpleCommandTestSub.hasFacade(), "Expecting simpleCommandTestSub.hasFacade() === true"); - }; - SimpleCommandTest.prototype.testSimpleCommandExecute = function () { - var vo = new test.SimpleCommandTestVO(5); - var notification = new puremvc.Notification('SimpleCommandTestNote', vo); - var command = new test.SimpleCommandTestCommand(); - command.execute(notification); - YUITest.Assert.areEqual(10, vo.result, "Expecting vo.result == 10"); - }; - return SimpleCommandTest; - })(); - test.SimpleCommandTest = SimpleCommandTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var FacadeTestVO = (function () { - function FacadeTestVO(input) { - this.input = null; - this.result = null; - this.input = input; - } - return FacadeTestVO; - })(); - test.FacadeTestVO = FacadeTestVO; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var FacadeTestCommand = (function (_super) { - __extends(FacadeTestCommand, _super); - function FacadeTestCommand() { - _super.apply(this, arguments); - - } - FacadeTestCommand.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result = 2 * vo.input; - }; - return FacadeTestCommand; - })(puremvc.SimpleCommand); - test.FacadeTestCommand = FacadeTestCommand; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var FacadeTest = (function () { - function FacadeTest() { - this.name = "PureMVC Facade class tests"; - } - FacadeTest.prototype.testGetInstance = function () { - var facade = puremvc.Facade.getInstance(); - YUITest.Assert.isNotUndefined(facade, "Expecting facade not to be undefined"); - YUITest.Assert.isInstanceOf(puremvc.Facade, facade, "Expecting instance is instance of Facade"); - }; - FacadeTest.prototype.testRegisterCommandAndSendNotification = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerCommand('FacadeTestNote', test.FacadeTestCommand); - var vo = new test.FacadeTestVO(32); - facade.sendNotification('FacadeTestNote', vo); - YUITest.Assert.areEqual(64, vo.result, "Expecting vo.result == 64"); - }; - FacadeTest.prototype.testRegisterAndRemoveCommandAndSendNotification = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerCommand('FacadeTestNote', test.FacadeTestCommand); - facade.removeCommand('FacadeTestNote'); - var vo = new test.FacadeTestVO(32); - facade.sendNotification('FacadeTestNote', vo); - YUITest.Assert.areNotEqual(64, vo.result, "Expecting vo.result != 64"); - }; - FacadeTest.prototype.testRegisterAndRetrieveProxy = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerProxy(new puremvc.Proxy('colors', [ - 'red', - 'green', - 'blue' - ])); - var proxy = facade.retrieveProxy('colors'); - YUITest.Assert.isInstanceOf(puremvc.Proxy, proxy, "Expecting proxy is Proxy"); - var data = proxy.getData(); - YUITest.Assert.isNotUndefined(data, "Expecting data not null"); - YUITest.Assert.isArray(data, "Expecting data is Array"); - YUITest.Assert.areEqual(3, data.length, "Expecting data.length == 3"); - YUITest.Assert.areEqual('red', data[0], "Expecting data[0] == 'red'"); - YUITest.Assert.areEqual('green', data[1], "Expecting data[1] == 'green'"); - YUITest.Assert.areEqual('blue', data[2], "Expecting data[2] == 'blue'"); - }; - FacadeTest.prototype.testRegisterAndRemoveProxy = function () { - var facade = puremvc.Facade.getInstance(); - var proxy = new puremvc.Proxy('sizes', [ - '7', - '13', - '21' - ]); - facade.registerProxy(proxy); - var removedProxy = facade.removeProxy('sizes'); - YUITest.Assert.areEqual('sizes', removedProxy ? removedProxy.getProxyName() : null, "Expecting removedProxy.getProxyName() == 'sizes'"); - proxy = facade.retrieveProxy('sizes'); - YUITest.Assert.isNull(proxy, "Expecting proxy === null"); - }; - FacadeTest.prototype.testRegisterRetrieveAndRemoveMediator = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerMediator(new puremvc.Mediator(puremvc.Mediator.NAME, new Object())); - YUITest.Assert.isNotNull(facade.retrieveMediator(puremvc.Mediator.NAME), "Expecting facade.retrieveMediator( puremvc.Mediator.NAME ) !== null"); - var removedMediator = facade.removeMediator(puremvc.Mediator.NAME); - YUITest.Assert.areEqual(puremvc.Mediator.NAME, removedMediator ? removedMediator.getMediatorName() : null, "Expecting removedMediator.getMediatorName() == Mediator.NAME"); - YUITest.Assert.isNull(facade.retrieveMediator(puremvc.Mediator.NAME), "Expecting facade.retrieveMediator( Mediator.NAME ) === null )"); - }; - FacadeTest.prototype.testHasProxy = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerProxy(new puremvc.Proxy('hasProxyTest', [ - 1, - 2, - 3 - ])); - YUITest.Assert.isTrue(facade.hasProxy('hasProxyTest'), "Expecting facade.hasProxy('hasProxyTest') === true"); - }; - FacadeTest.prototype.testHasMediator = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerMediator(new puremvc.Mediator('facadeHasMediatorTest', new Object())); - YUITest.Assert.isTrue(facade.hasMediator('facadeHasMediatorTest'), "Expecting facade.hasMediator('facadeHasMediatorTest') === true"); - facade.removeMediator('facadeHasMediatorTest'); - YUITest.Assert.isFalse(facade.hasMediator('facadeHasMediatorTest'), "Expecting facade.hasMediator('facadeHasMediatorTest') === false"); - }; - FacadeTest.prototype.testHasCommand = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerCommand('facadeHasCommandTest', test.FacadeTestCommand); - YUITest.Assert.isTrue(facade.hasCommand('facadeHasCommandTest'), "Expecting facade.hasCommand('facadeHasCommandTest') === true"); - facade.removeCommand('facadeHasCommandTest'); - YUITest.Assert.isFalse(facade.hasCommand('facadeHasCommandTest'), "Expecting facade.hasCommand('facadeHasCommandTest') === false"); - }; - return FacadeTest; - })(); - test.FacadeTest = FacadeTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MediatorTestSub = (function (_super) { - __extends(MediatorTestSub, _super); - function MediatorTestSub() { - _super.apply(this, arguments); - - } - MediatorTestSub.prototype.hasFacade = function () { - return this.facade instanceof puremvc.Facade; - }; - return MediatorTestSub; - })(puremvc.Mediator); - test.MediatorTestSub = MediatorTestSub; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var MediatorTest = (function () { - function MediatorTest() { - this.name = "PureMVC Mediator class tests"; - } - MediatorTest.prototype.testConstructor = function () { - var mediatorTestSub = new test.MediatorTestSub(); - YUITest.Assert.isTrue(mediatorTestSub.hasFacade(), "Expecting mediatorTestSub.hasFacade() === true"); - }; - MediatorTest.prototype.testNameAccessor = function () { - var mediator = new puremvc.Mediator(); - YUITest.Assert.areEqual(puremvc.Mediator.NAME, mediator.getMediatorName(), "Expecting mediator.getMediatorName() == Mediator.NAME"); - }; - MediatorTest.prototype.testViewAccessor = function () { - var view = new Object(); - var mediator = new puremvc.Mediator(puremvc.Mediator.NAME, view); - YUITest.Assert.isNotNull(mediator.getViewComponent(), "Expecting mediator.getViewComponent() !== null"); - }; - return MediatorTest; - })(); - test.MediatorTest = MediatorTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var NotificationTest = (function () { - function NotificationTest() { - this.name = "PureMVC Notification class tests"; - } - NotificationTest.prototype.testNameAccessors = function () { - var notification = new puremvc.Notification('TestNote'); - YUITest.Assert.areEqual('TestNote', notification.getName(), "Expecting notification.getName() == 'TestNote'"); - }; - NotificationTest.prototype.testBodyAccessors = function () { - var notification = new puremvc.Notification(null); - notification.setBody(5); - YUITest.Assert.areSame(5, notification.getBody(), "Expecting notification.getBody() === 5"); - }; - NotificationTest.prototype.testConstructor = function () { - var notification = new puremvc.Notification('TestNote', 5, 'TestNoteType'); - YUITest.Assert.areEqual("TestNote", notification.getName(), "Expecting notification.getName() == 'TestNote'"); - YUITest.Assert.areSame(5, notification.getBody(), "Expecting notification.getBody() === 5"); - YUITest.Assert.areEqual("TestNoteType", notification.getType(), "Expecting notification.getType() == 'TestNoteType'"); - }; - NotificationTest.prototype.testToString = function () { - var notification = new puremvc.Notification('TestNote', [ - 1, - 3, - 5 - ], 'TestType'); - var ts = "Notification Name: TestNote\nBody:1,3,5\nType:TestType"; - YUITest.Assert.areEqual(ts, notification.toString(), "Expecting notification.testToString() == '" + ts + "'"); - }; - return NotificationTest; - })(); - test.NotificationTest = NotificationTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var NotifierTestVO = (function () { - function NotifierTestVO(input) { - this.input = null; - this.result = null; - this.input = input; - } - return NotifierTestVO; - })(); - test.NotifierTestVO = NotifierTestVO; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var NotifierTestCommand = (function (_super) { - __extends(NotifierTestCommand, _super); - function NotifierTestCommand() { - _super.apply(this, arguments); - - } - NotifierTestCommand.prototype.execute = function (notification) { - var vo = notification.getBody(); - vo.result = 2 * vo.input; - }; - return NotifierTestCommand; - })(puremvc.SimpleCommand); - test.NotifierTestCommand = NotifierTestCommand; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var NotifierTestSub = (function (_super) { - __extends(NotifierTestSub, _super); - function NotifierTestSub() { - _super.apply(this, arguments); - - } - NotifierTestSub.prototype.hasFacade = function () { - return this.facade instanceof puremvc.Facade; - }; - return NotifierTestSub; - })(puremvc.Notifier); - test.NotifierTestSub = NotifierTestSub; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var NotifierTest = (function () { - function NotifierTest() { - this.name = "PureMVC Notifier class tests"; - } - NotifierTest.prototype.testConstructor = function () { - var notifierTestSub = new test.NotifierTestSub(); - YUITest.Assert.isTrue(notifierTestSub.hasFacade(), "Expecting notifierTestSub.hasFacade() === true"); - }; - NotifierTest.prototype.testSendNotification = function () { - var facade = puremvc.Facade.getInstance(); - facade.registerCommand('NotifierTestNote', test.NotifierTestCommand); - var vo = new test.NotifierTestVO(32); - facade.sendNotification('NotifierTestNote', vo); - YUITest.Assert.areEqual(64, vo.result, "Expecting vo.result == 64"); - }; - return NotifierTest; - })(); - test.NotifierTest = NotifierTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ObserverTest = (function () { - function ObserverTest() { - this.name = "PureMVC Observer class tests"; - this.observerTestVar = -1; - } - ObserverTest.prototype.testObserverAccessors = function () { - var observer = new puremvc.Observer(null, null); - observer.setNotifyContext(this); - observer.setNotifyMethod(this.observerTestMethod); - var notification = new puremvc.Notification('ObserverTestNote', 10); - observer.notifyObserver(notification); - YUITest.Assert.areSame(10, this.observerTestVar, "Expecting observerTestVar === 10"); - }; - ObserverTest.prototype.testObserverConstructor = function () { - var observer = new puremvc.Observer(this.observerTestMethod, this); - var notification = new puremvc.Notification('ObserverTestNote', 5); - observer.notifyObserver(notification); - YUITest.Assert.areSame(5, this.observerTestVar, "Expecting observerTestVar === 5"); - }; - ObserverTest.prototype.testCompareNotifyContext = function () { - var observer = new puremvc.Observer(this.observerTestMethod, this); - var negTestObj = new Object(); - YUITest.Assert.isFalse(observer.compareNotifyContext(negTestObj), "Expecting observer.compareNotifyContext(negTestObj) === false"); - YUITest.Assert.isTrue(observer.compareNotifyContext(this), "Expecting observer.compareNotifyContext(this) === true"); - }; - ObserverTest.prototype.observerTestMethod = function (notification) { - this.observerTestVar = notification.getBody(); - }; - return ObserverTest; - })(); - test.ObserverTest = ObserverTest; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ProxyTestSub = (function (_super) { - __extends(ProxyTestSub, _super); - function ProxyTestSub() { - _super.apply(this, arguments); - - } - ProxyTestSub.prototype.hasFacade = function () { - return this.facade instanceof puremvc.Facade; - }; - return ProxyTestSub; - })(puremvc.Proxy); - test.ProxyTestSub = ProxyTestSub; - })(test || (test = {})); - - var test; - (function (test) { - "use strict"; - var ProxyTest = (function () { - function ProxyTest() { - this.name = "PureMVC Proxy class tests"; - } - ProxyTest.prototype.testConstructorInitialization = function () { - var proxyTestSub = new test.ProxyTestSub(); - YUITest.Assert.isTrue(proxyTestSub.hasFacade(), "Expecting proxyTestSub.hasFacade() === true"); - }; - ProxyTest.prototype.testConstructor = function () { - var proxy = new puremvc.Proxy('colors', [ - 'red', - 'green', - 'blue' - ]); - var data = proxy.getData(); - YUITest.Assert.isNotNull(proxy, "Expecting proxy !== null"); - YUITest.Assert.areEqual('colors', proxy.getProxyName(), "Expecting proxy.getProxyName() == 'colors'"); - YUITest.Assert.areEqual(3, data.length, "Expecting data.length == 3"); - YUITest.Assert.areEqual('red', data[0], "Expecting data[0] == 'red'"); - YUITest.Assert.areEqual('green', data[1], "Expecting data[1] == 'green'"); - YUITest.Assert.areEqual('blue', data[2], "Expecting data[2] == 'blue'"); - }; - ProxyTest.prototype.testNameAccessor = function () { - var proxy = new puremvc.Proxy('TestProxy'); - YUITest.Assert.areEqual('TestProxy', proxy.getProxyName(), "Expecting proxy.getProxyName() == 'TestProxy'"); - }; - ProxyTest.prototype.testDataAccessors = function () { - var proxy = new puremvc.Proxy('colors'); - proxy.setData([ - 'red', - 'green', - 'blue' - ]); - var data = proxy.getData(); - YUITest.Assert.areEqual(3, data.length, "Expecting data.length == 3"); - YUITest.Assert.areEqual('red', data[0], "Expecting data[0] == 'red'"); - YUITest.Assert.areEqual('green', data[1], "Expecting data[1] == 'green'"); - YUITest.Assert.areEqual('blue', data[2], "Expecting data[2] == 'blue'"); - }; - return ProxyTest; - })(); - test.ProxyTest = ProxyTest; - })(test || (test = {})); - - - return test; - }); -} \ No newline at end of file diff --git a/test/core/Controller.spec.ts b/test/core/Controller.spec.ts new file mode 100644 index 0000000..cba3193 --- /dev/null +++ b/test/core/Controller.spec.ts @@ -0,0 +1,160 @@ +// +// Controller.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import { Controller, IController, View, INotification, Notification } from "../../src"; +import {ControllerTestCommand} from "./ControllerTestCommand"; +import {ControllerTestVO} from "./ControllerTestVO"; +import {ControllerTestCommand2} from "./ControllerTestCommand2"; + +/** + * Test the PureMVC Controller class. + * + * @see ControllerTestVO + * @see ControllerTestCommand + */ +describe("ControllerTest", () => { + + /** + * Tests the Controller Singleton Factory Method + */ + test("testGetInstance", () => { + // Test Factory Method + const controller: IController = Controller.getInstance(() => new Controller()); + + // test assertions + expect(controller).toBeDefined(); + }); + + /** + * Tests Command registration and execution. + * + * This test gets a Singleton Controller instance + * and registers the ControllerTestCommand class + * to handle 'ControllerTest' Notifications. + * + * It then constructs such a Notification and tells the + * Controller to execute the associated Command. + * Success is determined by evaluating a property + * on an object passed to the Command, which will + * be modified when the Command executes. + */ + test("testRegisterAndExecuteCommand", () => { + // Create the controller, register the ControllerTestCommand to handle 'ControllerTest' notes + const controller: IController = Controller.getInstance(() => new Controller()); + controller.registerCommand("ControllerTest", () => new ControllerTestCommand()); + + // Create a 'ControllerTest' note + const vo = new ControllerTestVO(12); + const notification: INotification = new Notification("ControllerTest", vo); + + // Tell the controller to execute the Command associated with the note + // the ControllerTestCommand invoked will multiply the vo.input value + // by 2 and set the result on vo.result + controller.executeCommand(notification); + + // test assertions + expect(vo.result).toBe(24); + }); + + /** + * Tests Command registration and removal. + * + * Tests that once a Command is registered and verified + * working, it can be removed from the Controller. + */ + test("testRegisterAndRemoveCommand", () => { + // Create the controller, register the ControllerTestCommand to handle 'ControllerTest' notes + const controller: IController = Controller.getInstance(() => new Controller()); + controller.registerCommand("ControllerRemoveTest", () => new ControllerTestCommand()); + + // Create a 'ControllerTest' note + const vo = new ControllerTestVO(12); + const notification = new Notification("ControllerRemoveTest", vo); + + // Tell the controller to execute the Command associated with the note + // the ControllerTestCommand invoked will multiply the vo.input value + // by 2 and set the result on vo.result + controller.executeCommand(notification); + + // test assertions + expect(vo.result).toBe(24); + + // Reset result + vo.result = 0; + + // Remove the Command from the Controller + controller.removeCommand("ControllerRemoveTest"); + + // Tell the controller to execute the Command associated with the + // note. This time, it should not be registered, and our vo result + // will not change + controller.executeCommand(notification); + + // test assertions + expect(vo.result).toBe(0); + }); + + test("testHasCommand", () => { + // register the ControllerTestCommand to handle 'hasCommandTest' notes + const controller: IController = Controller.getInstance(() => new Controller()); + controller.registerCommand("hasCommandTest", () => new ControllerTestCommand()); + + // test that hasCommand returns true for hasCommandTest notifications + expect(controller.hasCommand("hasCommandTest")).toBeTruthy(); + + // Remove the Command from the Controller + controller.removeCommand("hasCommandTest"); + + // test that hasCommand returns false for hasCommandTest notifications + expect(controller.hasCommand("hasCommandTest")).toBeFalsy(); + }); + + /** + * Tests Removing and Reregistering a Command + * + * Tests that when a Command is re-registered that it isn't fired twice. + * This involves, minimally, registration with the controller but + * notification via the View, rather than direct execution of + * the Controller's executeCommand method as is done above in + * testRegisterAndRemove. The bug under test was fixed in AS3 Standard + * Version 2.0.2. If you run the unit tests with 2.0.1 this + * test will fail. + */ + test("testReregisterAndExecuteCommand", () => { + // Fetch the controller, register the ControllerTestCommand2 to handle 'ControllerTest2' notes + const controller: IController = Controller.getInstance(() => new Controller()); + controller.registerCommand("ControllerTest2", () => new ControllerTestCommand2()); + + // Remove the Command from the Controller + controller.removeCommand("ControllerTest2"); + + // Re-register the Command with the Controller + controller.registerCommand("ControllerTest2", () => new ControllerTestCommand2()); + + // Create a 'ControllerTest2' note + const vo = new ControllerTestVO(12); + const note = new Notification("ControllerTest2", vo); + + // retrieve a reference to the View from the same core. + const view = View.getInstance(() => new View()); + + // send the Notification + view.notifyObservers(note); + + // test assertions + // if the command is executed once the value will be 24 + expect(vo.result).toBe(24); + + // Prove that accumulation works in the VO by sending the notification again + view.notifyObservers(note); + + // if the command is executed twice the value will be 48 + expect(vo.result).toBe(48); + }); + +}); diff --git a/test/core/ControllerTestCommand.ts b/test/core/ControllerTestCommand.ts new file mode 100644 index 0000000..e36c139 --- /dev/null +++ b/test/core/ControllerTestCommand.ts @@ -0,0 +1,35 @@ +// +// ControllerTestCommand.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {SimpleCommand, INotification} from "../../src"; +import {ControllerTestVO} from "./ControllerTestVO"; + +/** + * A SimpleCommand subclass used by ControllerTest. + * + * @see ControllerTest + * @see ControllerTestVO + * + * @class ControllerTestCommand + * @extends SimpleCommand + */ +export class ControllerTestCommand extends SimpleCommand { + + /** + * Fabricate a result by multiplying the input by 2 + * + * @param notification the note carrying the ControllerTestVO + */ + public override execute(notification: INotification) { + const vo = notification.body as ControllerTestVO; + + // Fabricate a result + vo.result = 2 * vo.input; + } + +} diff --git a/test/core/ControllerTestCommand2.ts b/test/core/ControllerTestCommand2.ts new file mode 100644 index 0000000..6f08858 --- /dev/null +++ b/test/core/ControllerTestCommand2.ts @@ -0,0 +1,35 @@ +// +// ControllerTestCommand.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {SimpleCommand, INotification} from "../../src"; +import {ControllerTestVO} from "./ControllerTestVO"; + +/** + * A SimpleCommand subclass used by ControllerTest. + * + * @see ControllerTest + * @see ControllerTestVO + * + * @class ControllerTestCommand2 + * @extends SimpleCommand + */ +export class ControllerTestCommand2 extends SimpleCommand { + + /** + * Fabricate a result by multiplying the input by 2 and adding to the existing result + * + * @param {Notification} notification + */ + public override execute(notification: INotification): void { + const vo = notification.body as ControllerTestVO; + + // Fabricate a result + vo.result = vo.result + (2 * vo.input); + } + +} diff --git a/test/core/ControllerTestVO.ts b/test/core/ControllerTestVO.ts new file mode 100644 index 0000000..790daf0 --- /dev/null +++ b/test/core/ControllerTestVO.ts @@ -0,0 +1,31 @@ +// +// ControllerTestVO.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +/** + * A utility class used by ControllerTest. + * + * @see ControllerTest + * @see ControllerTestCommand + * + * @class ControllerTestVO + */ +export class ControllerTestVO { + + public input: number = 0; + public result: number = 0; + + /** + * Constructor + * + * @param {number} input + */ + public constructor(input: number) { + this.input = input; + } + +} diff --git a/test/core/Model.spec.ts b/test/core/Model.spec.ts new file mode 100644 index 0000000..ed9ebec --- /dev/null +++ b/test/core/Model.spec.ts @@ -0,0 +1,119 @@ +// +// Model.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IModel, Model, IProxy, Proxy} from "../../src"; +import {ModelTestProxy} from "./ModelTestProxy"; + +/** + * Test the PureMVC Model class. + */ +describe("ModelTest", () => { + + /** + * Tests the Model Singleton Factory Method + */ + test("testGetInstance", () => { + // Test Factory Method + const model: IModel = Model.getInstance(() => new Model()); + + // test assertions + expect(model).toBeDefined(); + }); + + /** + * Tests the proxy registration and retrieval methods. + * + * + * Tests `registerProxy` and `retrieveProxy` in the same test. + * These methods cannot currently be tested separately + * in any meaningful way other than to show that the + * methods do not throw exception when called. + */ + test("testRegisterAndRetrieveProxy", () => { + // register a proxy and retrieve it. + const model: IModel = Model.getInstance(() => new Model()); + model.registerProxy(new Proxy("colors", ["red", "green", "blue"])); + const proxy: IProxy | null = model.retrieveProxy("colors"); + expect(proxy).toBeDefined(); + const data = proxy?.data as string[]; + + // test assertions + expect(data).not.toBeNull(); + expect(data).toBeInstanceOf(Array); + expect(data.length).toBe(3); + expect(data[0]).toBe("red"); + expect(data[1]).toBe("green"); + expect(data[2]).toBe("blue"); + }); + + /** + * Tests the proxy removal method. + */ + test("testRegisterAndRemoveProxy", () => { + // register a proxy, remove it, then try to retrieve it + const model: IModel = Model.getInstance(() => new Model()); + const proxy: IProxy = new Proxy("sizes", ["7", "13", "21"]); + model.registerProxy(proxy); + + // remove the proxy + const removedProxy: IProxy | null = model.removeProxy("sizes"); + + // assert that we removed the appropriate proxy + expect(removedProxy).not.toBeNull(); + expect(removedProxy?.name).toBe("sizes"); + + // ensure that the proxy is no longer retrievable from the model + const proxy1 = model.retrieveProxy("sizes"); + + // test assertions + expect(proxy1).toBeNull(); + }); + + /** + * Tests the hasProxy Method + */ + test("testHasProxy", () => { + // register a proxy + const model: IModel = Model.getInstance(() => new Model()); + const proxy: IProxy = new Proxy("aces", ["clubs", "spades", "hearts", "diamonds"]); + model.registerProxy(proxy); + + // assert that the model.hasProxy method returns true + // for that proxy name + expect(model.hasProxy("aces")).toBeTruthy(); + + // remove the proxy + model.removeProxy("aces"); + + // assert that the model.hasProxy method returns false + // for that proxy name + expect(model.hasProxy("aces")).toBeFalsy(); + }); + + /** + * Tests that the Model calls the onRegister and onRemove methods + */ + test("testOnRegisterAndOnRemove", () => { + // Get a Singleton Model instance + const model: IModel = Model.getInstance(() => new Model()); + + // Create and register the test proxy + const proxy: IProxy = new ModelTestProxy(); + model.registerProxy(proxy); + + // assert that onRegister was called, and the proxy responded by setting its data accordingly + expect(proxy.data).toBe(ModelTestProxy.ON_REGISTER_CALLED); + + // Remove the component + model.removeProxy(ModelTestProxy.NAME); + + // assert that onRemove was called, and the proxy responded by setting its data accordingly + expect(proxy.data).toBe(ModelTestProxy.ON_REMOVE_CALLED); + }); + +}); diff --git a/test/core/ModelTestProxy.ts b/test/core/ModelTestProxy.ts new file mode 100644 index 0000000..b065f61 --- /dev/null +++ b/test/core/ModelTestProxy.ts @@ -0,0 +1,33 @@ +// +// ModelTestProxy.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Proxy} from "../../src"; + +/** + * @class ModelTestProxy + * @extends Proxy + */ +export class ModelTestProxy extends Proxy { + + public static NAME: string = "ModelTestProxy"; + public static ON_REGISTER_CALLED: string = "OnRegisterCalled"; + public static ON_REMOVE_CALLED: string = "OnRemoveCalled"; + + public constructor() { + super(ModelTestProxy.NAME, ""); + } + + public override onRegister(): void { + this.data = ModelTestProxy.ON_REGISTER_CALLED; + } + + public override onRemove(): void { + this.data = ModelTestProxy.ON_REMOVE_CALLED; + } + +} diff --git a/test/core/View.spec.ts b/test/core/View.spec.ts new file mode 100644 index 0000000..cb5a07c --- /dev/null +++ b/test/core/View.spec.ts @@ -0,0 +1,356 @@ +// +// View.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {IView, View, IMediator, Mediator, INotification, Notification, IObserver, Observer} from "../../src"; +import {ViewTestNote} from "./ViewTestNote"; +import {ViewTestMediator} from "./ViewTestMediator"; +import {ViewTestMediator2} from "./ViewTestMediator2"; +import {ViewTestMediator3} from "./ViewTestMediator3"; +import {ViewTestMediator4} from "./ViewTestMediator4"; +import {ViewTestMediator5} from "./ViewTestMediator5"; +import {ViewTestMediator6} from "./ViewTestMediator6"; + +/** + * Test the PureMVC View class. + */ +describe("ViewTest", () => { + + /** + * Tests the View Singleton Factory Method + */ + test("testGetInstance", () => { + // Test Factory Method + const view: IView = View.getInstance(() => new View()); + + // test assertions + expect(view).not.toBeNull(); + }); + + /** + * Tests registration and notification of Observers. + * + * An Observer is created to callback the viewTestMethod of + * this ViewTest instance. This Observer is registered with + * the View to be notified of 'ViewTestEvent' events. Such + * an event is created, and a value set on its payload. Then + * the View is told to notify interested observers of this + * Event. + * + * The View calls the Observer's notifyObserver method + * which calls the viewTestMethod on this instance + * of the ViewTest class. The viewTestMethod method will set + * an instance variable to the value passed in on the Event + * payload. We evaluate the instance variable to be sure + * it is the same as that passed out as the payload of the + * original 'ViewTestEvent'. + */ + test("testRegisterAndNotifyObserver", () => { + // Get the Singleton View instance + const view: IView = View.getInstance(() => new View()); + + let viewTestVar: number = 0; + const handleNotification = (notification: INotification) => { + viewTestVar = notification.body; + }; + + // Create observer, passing in notification method and context + const observer: IObserver = new Observer(handleNotification, this); + + // Register Observer's interest in a particular Notification with the View + view.registerObserver(ViewTestNote.NAME, observer); + + // Create a ViewTestNote, setting + // a body value, and tell the View to notify + // Observers. Since the Observer is this class + // and the notification method is viewTestMethod, + // successful notification will result in our local + // viewTestVar being set to the value we pass in + // on the note body. + const note: Notification = ViewTestNote.create(10); + view.notifyObservers(note); + + // test assertions + expect(viewTestVar).toBe(10); + }); + + /** + * Tests registering and retrieving a mediator with + * the View. + */ + test("testRegisterAndRetrieveMediator", () => { + // Get the Singleton View instance + const view: IView = View.getInstance(() => new View()); + + // Create and register the test mediator + const viewTestMediator = new ViewTestMediator(this); + view.registerMediator(viewTestMediator); + + // Retrieve the component + const mediator : IMediator | null = view.retrieveMediator(ViewTestMediator.NAME); + + // test assertions + expect(mediator).toBe(viewTestMediator); + }); + + /** + * Tests the hasMediator Method + */ + test("testHasMediator", () => { + // Get the Singleton View instance + const view: IView = View.getInstance(() => new View()); + + // Create and register the test mediator + const mediator = new Mediator("hasMediatorTest", this); + view.registerMediator(mediator); + + // assert that the view.hasMediator method returns true + // for that mediator name + expect(view.hasMediator("hasMediatorTest")).toBeTruthy(); + + view.removeMediator("hasMediatorTest"); + + // assert that the view.hasMediator method returns false + // for that mediator name + expect(view.hasMediator("hasMediatorTest")).toBeFalsy(); + }); + + /** + * Tests registering and removing a mediator + */ + test("testRegisterAndRemoveMediator", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + + // Create and register the test mediator + const mediator: IMediator = new Mediator("testing", this); + view.registerMediator(mediator); + + // Remove the component + const removedMediator = view.removeMediator("testing"); + + // assert that we have removed the appropriate mediator + expect(removedMediator?.name).toBe("testing"); + + // assert that the mediator is no longer retrievable + expect(view.retrieveMediator("testing")).toBeFalsy(); + }); + + /** + * Tests that the View called the onRegister and onRemove methods + */ + test("testOnRegisterAndOnRemove", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + + // Create and register the test mediator + const obj = {onRegisterCalled: false, onRemoveCalled: false}; + const mediator = new ViewTestMediator4(obj); + view.registerMediator(mediator); + + // assert that onRegister was called, and the mediator responded by setting our boolean + expect(obj.onRegisterCalled).toBeTruthy(); + + // Remove the component + view.removeMediator(ViewTestMediator4.NAME); + + // assert that the mediator is no longer retrievable + expect(obj.onRemoveCalled).toBeTruthy(); + }); + + /** + * Tests successive register and remove of same mediator. + */ + test("testSuccessiveRegisterAndRemoveMediator", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + + // Create and register the test mediator, + // but not so we have a reference to it + view.registerMediator(new ViewTestMediator(this)); + + // test that we can retrieve it + expect(view.retrieveMediator(ViewTestMediator.NAME)).toBeInstanceOf(ViewTestMediator); + + // Remove the Mediator + view.removeMediator(ViewTestMediator.NAME); + + // test that retrieving it now returns null + expect(view.retrieveMediator(ViewTestMediator.NAME)).toBeNull(); + + // test that removing the mediator again once its gone doesn't cause crash + expect(view.retrieveMediator(ViewTestMediator.NAME)).toBeNull(); + + // Create and register another instance of the test mediator, + view.registerMediator(new ViewTestMediator(this)); + + expect(view.retrieveMediator(ViewTestMediator.NAME)).toBeInstanceOf(ViewTestMediator); + + // Remove the Mediator + view.removeMediator(ViewTestMediator.NAME); + + // test that retrieving it now returns null + expect(view.retrieveMediator(ViewTestMediator.NAME)).toBeNull(); + }); + + /** + * Tests registering a Mediator for 2 different notifications, removing the + * Mediator from the View, and seeing that neither notification causes the + * Mediator to be notified. Added for the fix deployed in version 1.7 + */ + test("testRemoveMediatorAndSubsequentNotify", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + + const obj = {lastNotification: ""}; + + // Create and register the test mediator to be removed. + view.registerMediator(new ViewTestMediator2(obj)); + + // test that notifications work + view.notifyObservers(new Notification(ViewTestNote.NOTE1)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE1); + + view.notifyObservers(new Notification(ViewTestNote.NOTE2)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE2); + + // Remove the Mediator + view.removeMediator(ViewTestMediator2.NAME); + + // test that retrieving it now returns null + expect(view.retrieveMediator(ViewTestMediator2.NAME)).toBeNull(); + + // test that notifications no longer work + // (ViewTestMediator2 is the one that sets lastNotification + // on this component, and ViewTestMediator) + obj.lastNotification = ""; + + view.notifyObservers(new Notification(ViewTestNote.NOTE1)); + expect(obj.lastNotification).not.toBe(ViewTestNote.NOTE1); + + view.notifyObservers(new Notification(ViewTestNote.NOTE2)); + expect(obj.lastNotification).not.toBe(ViewTestNote.NOTE2); + }); + + test("testRemoveOneOfTwoMediatorsAndSubsequentNotify", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + + const obj = {lastNotification: ""}; + + // Create and register that responds to notifications 1 and 2 + view.registerMediator(new ViewTestMediator2(obj)); + + // Create and register that responds to notification 3 + view.registerMediator(new ViewTestMediator3(obj)); + + // test that all notifications work + view.notifyObservers(new Notification(ViewTestNote.NOTE1)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE1); + + view.notifyObservers(new Notification(ViewTestNote.NOTE2)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE2); + + view.notifyObservers(new Notification(ViewTestNote.NOTE3)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE3); + + // Remove the Mediator that responds to 1 and 2 + view.removeMediator(ViewTestMediator2.NAME); + + // test that retrieving it now returns null + expect(view.retrieveMediator(ViewTestMediator2.NAME)).toBeNull(); + + // test that notifications no longer work + // for notifications 1 and 2, but still work for 3 + obj.lastNotification = ""; + + view.notifyObservers(new Notification(ViewTestNote.NOTE1)); + expect(obj.lastNotification).not.toBe(ViewTestNote.NOTE1); + + view.notifyObservers(new Notification(ViewTestNote.NOTE2)); + expect(obj.lastNotification).not.toBe(ViewTestNote.NOTE2); + + view.notifyObservers(new Notification(ViewTestNote.NOTE3)); + expect(obj.lastNotification).toBe(ViewTestNote.NOTE3); + }); + + /** + * Tests registering the same mediator twice. + * A subsequent notification should only illicit + * one response. Also, since reregistration + * was causing 2 observers to be created, ensure + * that after removal of the mediator there will + * be no further response. + */ + test("testMediatorReregistration", () => { + // Get the Singleton View instance + const view = View.getInstance(() => new View()); + const obj = {counter: 0}; + + // Create and register that responds to notification 5 + view.registerMediator(new ViewTestMediator5(obj)); + + // try to register another instance of that mediator (uses the same NAME constant). + view.registerMediator(new ViewTestMediator5(obj)); + + // test that the counter is only incremented once (mediator 5's response) + view.notifyObservers(new Notification(ViewTestNote.NOTE5)); + expect(obj.counter).toBe(1); + + // Remove the Mediator + view.removeMediator(ViewTestMediator5.NAME); + + // test that retrieving it now returns null + expect(view.retrieveMediator(ViewTestMediator5.NAME)).toBeNull(); + + // test that the counter is no longer incremented + obj.counter = 0; + view.notifyObservers(new Notification(ViewTestNote.NOTE5)); + expect(obj.counter).toBe(0); + }); + + /** + * Tests the ability for the observer list to + * be modified during the process of notification, + * and all observers be properly notified. This + * happens most often when multiple Mediators + * respond to the same notification by removing + * themselves. + */ + test("testModifyObserverListDuringNotification", () => { + const view = View.getInstance(() => new View()); + const obj = {counter: 0}; + + // Create and register several mediator instances that respond to notification 6 + // by removing themselves, which will cause the observer list for that notification + // to change. + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/1", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/2", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/3", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/4", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/5", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/6", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/7", obj)); + view.registerMediator(new ViewTestMediator6(ViewTestMediator6.NAME + "/8", obj)); + + // send the notification. each of the above mediators will respond by removing + // themselves and incrementing the counter by 1. This should leave us with a + // count of 8, since 8 mediators will respond. + view.notifyObservers(new Notification(ViewTestNote.NOTE6)); + + // verify the count is correct + expect(obj.counter).toBe(8); + + // clear the counter + obj.counter = 0; + view.notifyObservers(new Notification(ViewTestNote.NOTE6)); + + // verify the count is 0 + expect(obj.counter).toBe(0); + }); + +}); diff --git a/test/core/ViewTestMediator.ts b/test/core/ViewTestMediator.ts new file mode 100644 index 0000000..50967f7 --- /dev/null +++ b/test/core/ViewTestMediator.ts @@ -0,0 +1,34 @@ +// +// ViewTestMediator.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Mediator} from "../../src"; + +/** + * A Mediator class used by ViewTest. + * + * @class ViewTestMediator + * @extends Mediator + */ +export class ViewTestMediator extends Mediator { + + public static NAME = "ViewTestMediator"; + + /** + * @param {any} view + */ + public constructor(view: any) { + super(ViewTestMediator.NAME, view); + } + + public override listNotificationInterests(): string[] { + // be sure that the mediator has some Observers created + // in order to test removeMediator + return ["ABC", "DEF", "GHI"]; + } + +} diff --git a/test/core/ViewTestMediator2.ts b/test/core/ViewTestMediator2.ts new file mode 100644 index 0000000..b63481c --- /dev/null +++ b/test/core/ViewTestMediator2.ts @@ -0,0 +1,46 @@ +// +// ViewTestMediator2.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {INotification, Mediator} from "../../src"; +import {ViewTestNote} from "./ViewTestNote"; + +/** + * @class ViewTestMediator2 + * @extends Mediator + */ +export class ViewTestMediator2 extends Mediator { + + public static NAME: string = "ViewTestMediator2"; + + /** + * Constructor + * + * @constructor + * @param view + */ + public constructor(view: any) { + super(ViewTestMediator2.NAME, view); + } + + /** + * @override + * @returns {[string]} + */ + public override listNotificationInterests(): string[] { + return [ViewTestNote.NOTE1, ViewTestNote.NOTE2]; + } + + /** + * @override + * @param notification + */ + public override handleNotification(notification: INotification) { + this.viewComponent.lastNotification = notification.name; + } + +} diff --git a/test/core/ViewTestMediator3.ts b/test/core/ViewTestMediator3.ts new file mode 100644 index 0000000..a79776a --- /dev/null +++ b/test/core/ViewTestMediator3.ts @@ -0,0 +1,43 @@ +// +// ViewTestMediator3.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Mediator, INotification} from "../../src"; +import {ViewTestNote} from "./ViewTestNote"; + +/** + * @class ViewTestMediator3 + * @extends Mediator + */ +export class ViewTestMediator3 extends Mediator { + + public static NAME: string = "ViewTestMediator3"; + + /** + * @constructor + * @param {object} view + */ + public constructor(view: any) { + super(ViewTestMediator3.NAME, view); + } + + public listNotificationInterests(): string[] { + // be sure that the mediator has some Observers created + // in order to test removeMediator + return [ViewTestNote.NOTE3]; + } + + /** + * @override + * @param notification + */ + handleNotification(notification: INotification) { + this.viewComponent.lastNotification = notification.name; + } + + +} diff --git a/test/core/ViewTestMediator4.ts b/test/core/ViewTestMediator4.ts new file mode 100644 index 0000000..ccdd9f7 --- /dev/null +++ b/test/core/ViewTestMediator4.ts @@ -0,0 +1,41 @@ +// +// ViewTestMediator4.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Mediator} from "../../src"; + +/** + * @class ViewTestMediator4 + * @extends Mediator + */ +export class ViewTestMediator4 extends Mediator { + + public static NAME: string = "ViewTestMediator4"; + + /** + * Constructor + * @param {Object} view + */ + public constructor(view: any) { + super(ViewTestMediator4.NAME, view); + } + + /** + * @override + */ + public onRegister() { + this.viewComponent.onRegisterCalled = true; + } + + /** + * @override + */ + public onRemove() { + this.viewComponent.onRemoveCalled = true; + } + +} diff --git a/test/core/ViewTestMediator5.ts b/test/core/ViewTestMediator5.ts new file mode 100644 index 0000000..c4ae521 --- /dev/null +++ b/test/core/ViewTestMediator5.ts @@ -0,0 +1,44 @@ +// +// ViewTestMediator5.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Mediator, INotification} from "../../src"; +import {ViewTestNote} from "./ViewTestNote"; + +/** + * @class ViewTestMediator5 + * @extends Mediator + */ +export class ViewTestMediator5 extends Mediator { + + public static NAME: string = "ViewTestMediator5"; + + /** + * + * @param {Object} view + */ + public constructor(view: any) { + super(ViewTestMediator5.NAME, view); + } + + /** + * @override + * @returns {[string]} + */ + public override listNotificationInterests(): string[] { + return [ViewTestNote.NOTE5]; + } + + /** + * @override + * @param {Notification} notification + */ + public override handleNotification(notification: INotification): void { + this.viewComponent.counter++; + } + +} diff --git a/test/core/ViewTestMediator6.ts b/test/core/ViewTestMediator6.ts new file mode 100644 index 0000000..5078043 --- /dev/null +++ b/test/core/ViewTestMediator6.ts @@ -0,0 +1,36 @@ +// +// ViewTestMediator6.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Mediator, INotification} from "../../src"; +import {ViewTestNote} from "./ViewTestNote"; + +/** + * @class ViewTestMediator6 + * @extends Mediator + */ +export class ViewTestMediator6 extends Mediator { + + public static NAME: string = "ViewTestMediator6"; + + public constructor(name: string, view: any) { + super(name, view); + } + + public override listNotificationInterests(): string[] { + return [ViewTestNote.NOTE6]; + } + + public handleNotification(notification: INotification) { + this.facade.removeMediator(this.name); + } + + public override onRemove() { + this.viewComponent.counter++; + } + +} diff --git a/test/core/ViewTestNote.ts b/test/core/ViewTestNote.ts new file mode 100644 index 0000000..148112a --- /dev/null +++ b/test/core/ViewTestNote.ts @@ -0,0 +1,40 @@ +// +// ViewTestNote.spec.ts +// PureMVC TypeScript Standard +// +// Copyright(c) 2024 Saad Shams +// Your reuse is governed by the BSD-3-Clause License +// + +import {Notification} from "../../src"; + +export class ViewTestNote extends Notification { + + public static NAME: string = "ViewTestNote"; + + public static NOTE1: string = "Notification1"; + public static NOTE2: string = "Notification2"; + public static NOTE3: string = "Notification3"; + public static NOTE4: string = "Notification4"; + public static NOTE5: string = "Notification5"; + public static NOTE6: string = "Notification6"; + + /** + * + * @param {string} name + * @param {Object} body + */ + public constructor(name: string, body: any) { + super(name, body); + } + + /** + * + * @param {Object} body + * @returns {ViewTestNote} + */ + public static create(body: any): Notification { + return new ViewTestNote(ViewTestNote.NAME, body); + } + +} diff --git a/test/lib/YUITest.d.ts b/test/lib/YUITest.d.ts deleted file mode 100644 index 701b771..0000000 --- a/test/lib/YUITest.d.ts +++ /dev/null @@ -1,209 +0,0 @@ -/** - * Minimalist TypeScript description file for YUITest including only Asserts to give the compiler - * near the exact necessary to be able to compile the PureMVC framework Unit Tests. - */ -declare module YUITest -{ - export class Assert - { - /** - * Forces an assertion error to occur. - * @param message The message to display with the failure. - */ - static fail( message?:string ):void; - - //------------------------------------------------------------------------- - // Equality Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is equal to another. This uses the double equals sign - * so type cohersion may occur. - * @param expected The expected value. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static areEqual( expected:any, actual:any, message?:string ):void; - - /** - * Asserts that a value is not equal to another. This uses the double equals sign - * so type cohersion may occur. - * @param unexpected The unexpected value. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static areNotEqual( unexpected:any, actual:any, message?:string ):void; - - /** - * Asserts that a value is not the same as another. This uses the triple equals sign - * so no type cohersion may occur. - * @param unexpected The unexpected value. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static areNotSame(unexpected:any, actual:any, message?:string ):void; - - /** - * Asserts that a value is the same as another. This uses the triple equals sign - * so no type cohersion may occur. - * @param expected The expected value. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static areSame(expected:any, actual:any, message?:string ):void; - - //------------------------------------------------------------------------- - // Boolean Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is false. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isFalse( actual:any, message?:string ):void; - - /** - * Asserts that a value is true. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isTrue( actual:any, message?:string ):void; - - //------------------------------------------------------------------------- - // Special Value Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is not a number. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isNaN( actual:any, message?:string ):void; - - /** - * Asserts that a value is not the special NaN value. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isNotNaN( actual:any, message?:string ):void; - - /** - * Asserts that a value is not null. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isNotNull( actual:any, message?:string ):void; - - /** - * Asserts that a value is not undefined. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isNotUndefined( actual:any, message?:string ):void; - - /** - * Asserts that a value is null. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isNull( actual:any, message?:string ):void; - - /** - * Asserts that a value is undefined. This uses the triple equals sign - * so no type cohersion may occur. - * @param actual The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isUndefined( actual:any, message?:string ):void; - - //-------------------------------------------------------------------------- - // Instance Assertion Methods - //-------------------------------------------------------------------------- - - /** - * Asserts that a value is an array. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isArray( actual:any, message?:string ):void; - - /** - * Asserts that a value is a Boolean. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isBoolean( actual:any, message?:string ):void; - - /** - * Asserts that a value is a function. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isFunction( actual:any, message?:string ):void; - - /** - * Asserts that a value is an instance of a particular object. This may return - * incorrect results when comparing objects from one frame to constructors in - * another frame. For best results, don't use in a cross-frame manner. - * @param {Function} expected The function that the object should be an instance of. - * @param actual The object to test. - * @param message The message to display if the assertion fails. - */ - static isInstanceOf( expected:any, actual:any, message?:string ):void; - - /** - * Asserts that a value is a number. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isNumber( actual:any, message?:string ):void; - - /** - * Asserts that a value is an object. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isObject( actual:any, message?:string ):void; - - /** - * Asserts that a value is a string. - * @param actual The value to test. - * @param message The message to display if the assertion fails. - */ - static isString( actual:any, message?:string ):void; - - /** - * Asserts that a value is of a particular type. - * @param expectedType The expected type of the variable. - * @param actualValue The actual value to test. - * @param message The message to display if the assertion fails. - */ - static isTypeOf( expectedType:string, actualValue:any, message?:string ):void; - - - //-------------------------------------------------------------------------- - // Error Detection Methods - //-------------------------------------------------------------------------- - - /** - * Asserts that executing a particular method should throw an error of - * a specific type. This is a replacement for _should.error. - * - * @param {String|Function|Object} expectedError - * If a string, this is the error message that the error must have; if a function, - * this is the constructor that should have been used to create the thrown error; if an - * object, this is an instance of a particular error type with a specific error message - * (both must match). - * @param method The method to execute that should throw the error. - * @param message The message to display if the assertion - * fails. - */ - static throwsError( expectedError:any, method:Function, message?:string ):void; - } -} \ No newline at end of file diff --git a/test/lib/fonts-min.css b/test/lib/fonts-min.css deleted file mode 100644 index b561aa9..0000000 --- a/test/lib/fonts-min.css +++ /dev/null @@ -1,8 +0,0 @@ -/* -Copyright (c) 2010, Yahoo! Inc. All rights reserved. -Code licensed under the BSD License: -http://developer.yahoo.com/yui/license.html -version: 3.2.0 -build: 2676 -*/ -body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;} \ No newline at end of file diff --git a/test/lib/require.js b/test/lib/require.js deleted file mode 100644 index b7b8860..0000000 --- a/test/lib/require.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - RequireJS 2.1.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. - Available via the MIT or new BSD license. - see: http://github.com/jrburke/requirejs for details -*/ -var requirejs,require,define; -(function(W){function D(b){return M.call(b)==="[object Function]"}function E(b){return M.call(b)==="[object Array]"}function t(b,c){if(b){var d;for(d=0;d-1;d-=1)if(b[d]&&c(b[d],d,b))break}}function A(b,c){for(var d in b)if(b.hasOwnProperty(d)&&c(b[d],d))break}function O(b,c,d,g){c&&A(c,function(c,j){if(d||!F.call(b,j))g&&typeof c!=="string"?(b[j]||(b[j]={}),O(b[j],c,d,g)):b[j]=c});return b}function r(b,c){return function(){return c.apply(b, -arguments)}}function X(b){if(!b)return b;var c=W;t(b.split("."),function(b){c=c[b]});return c}function G(b,c,d,g){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=g;if(d)c.originalError=d;return c}function ba(){if(H&&H.readyState==="interactive")return H;N(document.getElementsByTagName("script"),function(b){if(b.readyState==="interactive")return H=b});return H}var g,s,u,y,q,B,H,I,Y,Z,ca=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,da=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, -$=/\.js$/,ea=/^\.\//;s=Object.prototype;var M=s.toString,F=s.hasOwnProperty,fa=Array.prototype.splice,v=!!(typeof window!=="undefined"&&navigator&&document),aa=!v&&typeof importScripts!=="undefined",ga=v&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,R=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",w={},n={},P=[],J=!1;if(typeof define==="undefined"){if(typeof requirejs!=="undefined"){if(D(requirejs))return;n=requirejs;requirejs=void 0}typeof require!=="undefined"&& -!D(require)&&(n=require,require=void 0);g=requirejs=function(b,c,d,p){var i,j="_";!E(b)&&typeof b!=="string"&&(i=b,E(c)?(b=c,c=d,d=p):b=[]);if(i&&i.context)j=i.context;(p=w[j])||(p=w[j]=g.s.newContext(j));i&&p.configure(i);return p.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick=typeof setTimeout!=="undefined"?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.1";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=v;s=g.s={contexts:w,newContext:function(b){function c(a, -f,x){var e,m,b,c,d,h,i,g=f&&f.split("/");e=g;var j=k.map,l=j&&j["*"];if(a&&a.charAt(0)===".")if(f){e=k.pkgs[f]?g=[f]:g.slice(0,g.length-1);f=a=e.concat(a.split("/"));for(e=0;f[e];e+=1)if(m=f[e],m===".")f.splice(e,1),e-=1;else if(m==="..")if(e===1&&(f[2]===".."||f[0]===".."))break;else e>0&&(f.splice(e-1,2),e-=2);e=k.pkgs[f=a[0]];a=a.join("/");e&&a===f+"/"+e.main&&(a=f)}else a.indexOf("./")===0&&(a=a.substring(2));if(x&&(g||l)&&j){f=a.split("/");for(e=f.length;e>0;e-=1){b=f.slice(0,e).join("/");if(g)for(m= -g.length;m>0;m-=1)if(x=j[g.slice(0,m).join("/")])if(x=x[b]){c=x;d=e;break}if(c)break;!h&&l&&l[b]&&(h=l[b],i=e)}!c&&h&&(c=h,d=i);c&&(f.splice(0,d,c),a=f.join("/"))}return a}function d(a){v&&t(document.getElementsByTagName("script"),function(f){if(f.getAttribute("data-requiremodule")===a&&f.getAttribute("data-requirecontext")===h.contextName)return f.parentNode.removeChild(f),!0})}function p(a){var f=k.paths[a];if(f&&E(f)&&f.length>1)return d(a),f.shift(),h.require.undef(a),h.require([a]),!0}function i(a){var f, -b=a?a.indexOf("!"):-1;b>-1&&(f=a.substring(0,b),a=a.substring(b+1,a.length));return[f,a]}function j(a,f,b,e){var m,K,d=null,g=f?f.name:null,j=a,l=!0,k="";a||(l=!1,a="_@r"+(M+=1));a=i(a);d=a[0];a=a[1];d&&(d=c(d,g,e),K=o[d]);a&&(d?k=K&&K.normalize?K.normalize(a,function(a){return c(a,g,e)}):c(a,g,e):(k=c(a,g,e),a=i(k),d=a[0],k=a[1],b=!0,m=h.nameToUrl(k)));b=d&&!K&&!b?"_unnormalized"+(N+=1):"";return{prefix:d,name:k,parentMap:f,unnormalized:!!b,url:m,originalName:j,isDefine:l,id:(d?d+"!"+k:k)+b}}function n(a){var f= -a.id,b=l[f];b||(b=l[f]=new h.Module(a));return b}function q(a,f,b){var e=a.id,m=l[e];if(F.call(o,e)&&(!m||m.defineEmitComplete))f==="defined"&&b(o[e]);else n(a).on(f,b)}function z(a,f){var b=a.requireModules,e=!1;if(f)f(a);else if(t(b,function(f){if(f=l[f])f.error=a,f.events.error&&(e=!0,f.emit("error",a))}),!e)g.onError(a)}function s(){P.length&&(fa.apply(C,[C.length-1,0].concat(P)),P=[])}function u(a,f,b){var e=a.map.id;a.error?a.emit("error",a.error):(f[e]=!0,t(a.depMaps,function(e,c){var d=e.id, -g=l[d];g&&!a.depMatched[c]&&!b[d]&&(f[d]?(a.defineDep(c,o[d]),a.check()):u(g,f,b))}),b[e]=!0)}function w(){var a,f,b,e,m=(b=k.waitSeconds*1E3)&&h.startTime+b<(new Date).getTime(),c=[],g=[],i=!1,j=!0;if(!S){S=!0;A(l,function(b){a=b.map;f=a.id;if(b.enabled&&(a.isDefine||g.push(b),!b.error))if(!b.inited&&m)p(f)?i=e=!0:(c.push(f),d(f));else if(!b.inited&&b.fetched&&a.isDefine&&(i=!0,!a.prefix))return j=!1});if(m&&c.length)return b=G("timeout","Load timeout for modules: "+c,null,c),b.contextName=h.contextName, -z(b);j&&t(g,function(a){u(a,{},{})});if((!m||e)&&i)if((v||aa)&&!T)T=setTimeout(function(){T=0;w()},50);S=!1}}function y(a){n(j(a[0],null,!0)).init(a[1],a[2])}function B(a){var a=a.currentTarget||a.srcElement,b=h.onScriptLoad;a.detachEvent&&!R?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=h.onScriptError;a.detachEvent&&!R||a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function I(){var a;for(s();C.length;)if(a=C.shift(),a[0]=== -null)return z(G("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));else y(a)}var S,U,h,L,T,k={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},shim:{},map:{},config:{}},l={},V={},C=[],o={},Q={},M=1,N=1;L={require:function(a){return a.require?a.require:a.require=h.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=o[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return k.config&& -k.config[a.map.id]||{}},exports:o[a.map.id]}}};U=function(a){this.events=V[a.id]||{};this.map=a;this.shim=k.shim[a.id];this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};U.prototype={init:function(a,b,c,e){e=e||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=r(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;this.ignore=e.ignore;e.enabled||this.enabled?this.enable():this.check()}}, -defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;h.startTime=(new Date).getTime();var a=this.map;if(this.shim)h.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],r(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=this.map.url;Q[a]||(Q[a]=!0,h.load(this.map.id,a))},check:function(){if(this.enabled&& -!this.enabling){var a,b,c=this.map.id;b=this.depExports;var e=this.exports,m=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(this.depCount<1&&!this.defined){if(D(m)){if(this.events.error)try{e=h.execCb(c,m,b,e)}catch(d){a=d}else e=h.execCb(c,m,b,e);if(this.map.isDefine)if((b=this.module)&&b.exports!==void 0&&b.exports!==this.exports)e=b.exports;else if(e===void 0&&this.usingExports)e=this.exports;if(a)return a.requireMap=this.map, -a.requireModules=[this.map.id],a.requireType="define",z(this.error=a)}else e=m;this.exports=e;if(this.map.isDefine&&!this.ignore&&(o[c]=e,g.onResourceLoad))g.onResourceLoad(h,this.map,this.depMaps);delete l[c];this.defined=!0}this.defining=!1;if(this.defined&&!this.defineEmitted)this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=j(a.prefix);this.depMaps.push(d);q(d,"defined",r(this,function(e){var m, -d;d=this.map.name;var x=this.map.parentMap?this.map.parentMap.name:null,i=h.makeRequire(a.parentMap,{enableBuildCallback:!0,skipMap:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,x,!0)})||""),e=j(a.prefix+"!"+d,this.map.parentMap),q(e,"defined",r(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=l[e.id]){this.depMaps.push(e);if(this.events.error)d.on("error",r(this,function(a){this.emit("error",a)}));d.enable()}}else m=r(this, -function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=r(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];A(l,function(a){a.map.id.indexOf(b+"_unnormalized")===0&&delete l[a.map.id]});z(a)}),m.fromText=r(this,function(b,e){var f=a.name,c=j(f),d=J;e&&(b=e);d&&(J=!1);n(c);try{g.exec(b)}catch(x){throw Error("fromText eval for "+f+" failed: "+x);}d&&(J=!0);this.depMaps.push(c);h.completeLoad(f);i([f],m)}),e.load(a.name,i,m,k)}));h.enable(d,this);this.pluginMaps[d.id]= -d},enable:function(){this.enabling=this.enabled=!0;t(this.depMaps,r(this,function(a,b){var c,e;if(typeof a==="string"){a=j(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=L[a.id]){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",r(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&q(a,"error",this.errback)}c=a.id;e=l[c];!L[c]&&e&&!e.enabled&&h.enable(a,this)}));A(this.pluginMaps,r(this,function(a){var b=l[a.id];b&&!b.enabled&& -h.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){t(this.events[a],function(a){a(b)});a==="error"&&delete this.events[a]}};h={config:k,contextName:b,registry:l,defined:o,urlFetched:Q,defQueue:C,Module:U,makeModuleMap:j,nextTick:g.nextTick,configure:function(a){a.baseUrl&&a.baseUrl.charAt(a.baseUrl.length-1)!=="/"&&(a.baseUrl+="/");var b=k.pkgs,c=k.shim,e={paths:!0,config:!0,map:!0};A(a,function(a,b){e[b]? -b==="map"?O(k[b],a,!0,!0):O(k[b],a,!0):k[b]=a});if(a.shim)A(a.shim,function(a,b){E(a)&&(a={deps:a});if(a.exports&&!a.exportsFn)a.exportsFn=h.makeShimExports(a);c[b]=a}),k.shim=c;if(a.packages)t(a.packages,function(a){a=typeof a==="string"?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ea,"").replace($,"")}}),k.pkgs=b;A(l,function(a,b){if(!a.inited&&!a.map.unnormalized)a.map=j(b)});if(a.deps||a.callback)h.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b; -a.init&&(b=a.init.apply(W,arguments));return b||X(a.exports)}},makeRequire:function(a,f){function d(e,c,i){var k,p;if(f.enableBuildCallback&&c&&D(c))c.__requireJsBuild=!0;if(typeof e==="string"){if(D(c))return z(G("requireargs","Invalid require call"),i);if(a&&L[e])return L[e](l[a.id]);if(g.get)return g.get(h,e,a);k=j(e,a,!1,!0);k=k.id;return!F.call(o,k)?z(G("notloaded",'Module name "'+k+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):o[k]}I();h.nextTick(function(){I();p= -n(j(null,a));p.skipMap=f.skipMap;p.init(e,c,i,{enabled:!0});w()});return d}f=f||{};O(d,{isBrowser:v,toUrl:function(b){var d=b.lastIndexOf("."),f=null;d!==-1&&(f=b.substring(d,b.length),b=b.substring(0,d));return h.nameToUrl(c(b,a&&a.id,!0),f)},defined:function(b){b=j(b,a,!1,!0).id;return F.call(o,b)},specified:function(b){b=j(b,a,!1,!0).id;return F.call(o,b)||F.call(l,b)}});if(!a)d.undef=function(b){s();var c=j(b,a,!0),d=l[b];delete o[b];delete Q[c.url];delete V[b];if(d){if(d.events.defined)V[b]= -d.events;delete l[b]}};return d},enable:function(a){l[a.id]&&n(a).enable()},completeLoad:function(a){var b,c,d=k.shim[a]||{},g=d.exports;for(s();C.length;){c=C.shift();if(c[0]===null){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);y(c)}c=l[a];if(!b&&!o[a]&&c&&!c.inited)if(k.enforceDefine&&(!g||!X(g)))if(p(a))return;else return z(G("nodefine","No define call for "+a,null,[a]));else y([a,d.deps||[],d.exportsFn]);w()},nameToUrl:function(a,b){var c,d,i,h,j,l;if(g.jsExtRegExp.test(a))h=a+(b||"");else{c= -k.paths;d=k.pkgs;h=a.split("/");for(j=h.length;j>0;j-=1)if(l=h.slice(0,j).join("/"),i=d[l],l=c[l]){E(l)&&(l=l[0]);h.splice(0,j,l);break}else if(i){c=a===i.name?i.location+"/"+i.main:i.location;h.splice(0,j,c);break}h=h.join("/");h+=b||(/\?/.test(h)?"":".js");h=(h.charAt(0)==="/"||h.match(/^[\w\+\.\-]+:/)?"":k.baseUrl)+h}return k.urlArgs?h+((h.indexOf("?")===-1?"?":"&")+k.urlArgs):h},load:function(a,b){g.load(h,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if(a.type=== -"load"||ga.test((a.currentTarget||a.srcElement).readyState))H=null,a=B(a),h.completeLoad(a.id)},onScriptError:function(a){var b=B(a);if(!p(b.id))return z(G("scripterror","Script error",a,[b.id]))}};h.require=h.makeRequire();return h}};g({});t(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=w._;return c.require[b].apply(c,arguments)}});if(v&&(u=s.head=document.getElementsByTagName("head")[0],y=document.getElementsByTagName("base")[0]))u=s.head=y.parentNode;g.onError=function(b){throw b; -};g.load=function(b,c,d){var g=b&&b.config||{},i;if(v)return i=g.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),i.type=g.scriptType||"text/javascript",i.charset="utf-8",i.async=!0,i.setAttribute("data-requirecontext",b.contextName),i.setAttribute("data-requiremodule",c),i.attachEvent&&!(i.attachEvent.toString&&i.attachEvent.toString().indexOf("[native code")<0)&&!R?(J=!0,i.attachEvent("onreadystatechange",b.onScriptLoad)):(i.addEventListener("load", -b.onScriptLoad,!1),i.addEventListener("error",b.onScriptError,!1)),i.src=d,I=i,y?u.insertBefore(i,y):u.appendChild(i),I=null,i;else aa&&(importScripts(d),b.completeLoad(c))};v&&N(document.getElementsByTagName("script"),function(b){if(!u)u=b.parentNode;if(q=b.getAttribute("data-main")){if(!n.baseUrl)B=q.split("/"),Y=B.pop(),Z=B.length?B.join("/")+"/":"./",n.baseUrl=Z,q=Y;q=q.replace($,"");n.deps=n.deps?n.deps.concat(q):[q];return!0}});define=function(b,c,d){var g,i;typeof b!=="string"&&(d=c,c=b,b= -null);E(c)||(d=c,c=[]);!c.length&&D(d)&&d.length&&(d.toString().replace(ca,"").replace(da,function(b,d){c.push(d)}),c=(d.length===1?["require"]:["require","exports","module"]).concat(c));if(J&&(g=I||ba()))b||(b=g.getAttribute("data-requiremodule")),i=w[g.getAttribute("data-requirecontext")];(i?i.defQueue:P).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(n)}})(this); diff --git a/test/lib/testrunner.css b/test/lib/testrunner.css deleted file mode 100644 index f09f07c..0000000 --- a/test/lib/testrunner.css +++ /dev/null @@ -1,28 +0,0 @@ -.yui3-console -{ - width:100% !important; - height:600px !important; -} - -.yui3-skin-sam - .yui3-console-entry-pass - .yui3-console-entry-cat -{ - background-color: green; - color: #fff; -} - -.yui3-skin-sam -.yui3-console-entry-fail -.yui3-console-entry-cat -{ - background-color: red; - color: #fff; -} - -.yui3-skin-sam -.yui3-console-entry-ignore -.yui3-console-entry-cat -{ - background-color: #666; -} \ No newline at end of file diff --git a/test/lib/testrunner.js b/test/lib/testrunner.js deleted file mode 100644 index 0d76ca3..0000000 --- a/test/lib/testrunner.js +++ /dev/null @@ -1,125 +0,0 @@ -function runTests( name, tests ) -{ - YUI().use - ( - "console", - function(Y) - { - //create the console - var r = new Y.Console - ( - { - useBrowserConsole: true, // tests will be reported both in the YUI and browser native console - newestOnTop : false, - style: 'block' // to anchor in the example content - } - ); - - r.render('#testLogger'); - - var TestRunner = YUITest.TestRunner; - TestRunner.setName(name); - - for( var i/*Number*/=0; i-1){o="3.2.0pr1";}n={applyConfig:function(B){B=B||j;var w,y,x=this.config,z=x.modules,v=x.groups,A=x.rls,u=this.Env._loader;for(y in B){if(B.hasOwnProperty(y)){w=B[y];if(z&&y=="modules"){m(z,w);}else{if(v&&y=="groups"){m(v,w);}else{if(A&&y=="rls"){m(A,w);}else{if(y=="win"){x[y]=w.contentWindow||w;x.doc=x[y].document;}else{if(y=="_yuid"){}else{x[y]=w;}}}}}}}if(u){u._config(B);}},_config:function(u){this.applyConfig(u);},_init:function(){var x,y=this,u=YUI.Env,v=y.Env,z,w;y.version=o;if(!v){y.Env={mods:{},versions:{},base:l,cdn:l+o+"/build/",_idx:0,_used:{},_attached:{},_yidx:0,_uidx:0,_guidp:"y",_loaded:{},getBase:u&&u.getBase||function(F,E){var A,B,D,G,C;B=(t&&t.getElementsByTagName("script"))||[];for(D=0;D-1){x=x.substr(0,C);}}C=G.match(E);if(C&&C[3]){A=C[1]+C[3];}break;}}}return A||v.cdn;}};v=y.Env;v._loaded[o]={};if(u&&y!==YUI){v._yidx=++u._yidx;v._guidp=("yui_"+o+"_"+v._yidx+"_"+h).replace(/\./g,"_");}else{if(typeof _YUI!="undefined"){u=_YUI.Env;v._yidx+=u._yidx;v._uidx+=u._uidx;for(z in u){if(!(z in v)){v[z]=u[z];}}}}y.id=y.stamp(y);c[y.id]=y;}y.constructor=YUI;y.config=y.config||{win:e,doc:t,debug:true,useBrowserConsole:true,throwFail:true,bootstrap:true,fetchCSS:true};w=y.config;w.base=YUI.config.base||y.Env.getBase(/^(.*)yui\/yui([\.\-].*)js(\?.*)?$/,/^(.*\?)(.*\&)(.*)yui\/yui[\.\-].*js(\?.*)?$/);w.loaderPath=YUI.config.loaderPath||"loader/loader"+(x||"-min.")+"js";},_setup:function(z){var v,y=this,u=[],x=YUI.Env.mods,w=y.config.core||["get","rls","intl-base","loader","yui-log","yui-later","yui-throttle"];for(v=0;vA)?y[A]:true;}return C;};w.indexOf=(u.indexOf)?function(x,y){return u.indexOf.call(x,y);}:function(x,z){for(var y=0;y1)?Array.prototype.join.call(arguments,t):A;if(!(z in w)||(x&&w[z]==x)){w[z]=y.apply(y,arguments);}return w[z];};};})();(function(){b.Object=function(y){var x=function(){};x.prototype=y;return new x();};var v=b.Object,w=function(y,x){return y&&y.hasOwnProperty&&y.hasOwnProperty(x);},u,t=function(B,A){var z=(A===2),x=(z)?0:[],y;for(y in B){if(w(B,y)){if(z){x++;}else{x.push((A)?B[y]:y);}}}return x;};v.keys=function(x){return t(x);};v.values=function(x){return t(x,1);};v.size=function(x){return t(x,2);};v.hasKey=w;v.hasValue=function(y,x){return(b.Array.indexOf(v.values(y),x)>-1);};v.owns=w;v.each=function(B,A,C,z){var y=C||b,x;for(x in B){if(z||w(B,x)){A.call(y,B[x],x,B);}}return b;};v.some=function(B,A,C,z){var y=C||b,x;for(x in B){if(z||w(B,x)){if(A.call(y,B[x],x,B)){return true;}}}return false;};v.getValue=function(B,A){if(!b.Lang.isObject(B)){return u;}var y,z=b.Array(A),x=z.length;for(y=0;B!==u&&y=0){for(x=0;y!==u&&x0){c=d(j);if(c){return c;}else{e=j.lastIndexOf("-");if(e>=0){j=j.substring(0,e);if(e>=2&&j.charAt(e-2)==="-"){j=j.substring(0,e-2);}}else{break;}}}}return"";}});},"3.2.0",{requires:["yui-base"]});YUI.add("yui-log",function(a){(function(){var d=a,e="yui:log",b="undefined",c={debug:1,info:1,warn:1,error:1};d.log=function(j,s,g,q){var l,p,n,k,o,i=d,r=i.config,h=(i.fire)?i:YUI.Env.globalEvents;if(r.debug){if(g){p=r.logExclude;n=r.logInclude;if(n&&!(g in n)){l=1;}else{if(p&&(g in p)){l=1;}}}if(!l){if(r.useBrowserConsole){k=(g)?g+": "+j:j;if(i.Lang.isFunction(r.logFn)){r.logFn.call(i,j,s,g);}else{if(typeof console!=b&&console.log){o=(s&&console[s]&&(s in c))?s:"log";console[o](k);}else{if(typeof opera!=b){opera.postError(k);}}}}if(h&&!q){if(h==i&&(!h.getEvent(e))){h.publish(e,{broadcast:2});}h.fire(e,{msg:j,cat:s,src:g});}}}return i;};d.message=function(){return d.log.apply(d,arguments);};})();},"3.2.0",{requires:["yui-base"]});YUI.add("yui-later",function(a){(function(){var b=a.Lang,c=function(e,k,g,j,i){e=e||0;var d=g,h,l;if(k&&b.isString(g)){d=k[g];}h=!b.isUndefined(j)?function(){d.apply(k,a.Array(j));}:function(){d.call(k);};l=(i)?setInterval(h,e):setTimeout(h,e);return{id:l,interval:i,cancel:function(){if(this.interval){clearInterval(l);}else{clearTimeout(l);}}};};a.later=c;b.later=c;})();},"3.2.0",{requires:["yui-base"]});YUI.add("yui-throttle",function(b){ -/*! Based on work by Simon Willison: http://gist.github.com/292562 */ -var a=function(d,c){c=(c)?c:(b.config.throttleTime||150);if(c===-1){return(function(){d.apply(null,arguments);});}var e=(new Date()).getTime();return(function(){var f=(new Date()).getTime();if(f-e>c){e=f;d.apply(null,arguments);}});};b.throttle=a;},"3.2.0",{requires:["yui-base"]});YUI.add("yui",function(a){},"3.2.0",{use:["yui-base","get","features","rls","intl-base","yui-log","yui-later","yui-throttle"]}); \ No newline at end of file diff --git a/test/lib/yuitest_1.0.0b1.js b/test/lib/yuitest_1.0.0b1.js deleted file mode 100644 index 1161b06..0000000 --- a/test/lib/yuitest_1.0.0b1.js +++ /dev/null @@ -1,4322 +0,0 @@ -/** - * YUI Test Framework - * @module yuitest - */ - -/** - * The root namespace for YUI Test. - * @class YUITest - * @static - */ - -var YUITest = { - version: "@VERSION@" -}; - - -/** - * Simple custom event implementation. - * @namespace YUITest - * @class EventTarget - * @constructor - */ -YUITest.EventTarget = function(){ - - /** - * Event handlers for the various events. - * @type Object - * @private - * @property _handlers - * @static - */ - this._handlers = {}; - -}; - -YUITest.EventTarget.prototype = { - - //restore prototype - constructor: YUITest.EventTarget, - - //------------------------------------------------------------------------- - // Event Handling - //------------------------------------------------------------------------- - - /** - * Adds a listener for a given event type. - * @param {String} type The type of event to add a listener for. - * @param {Function} listener The function to call when the event occurs. - * @return {void} - * @method attach - */ - attach: function(type, listener){ - if (typeof this._handlers[type] == "undefined"){ - this._handlers[type] = []; - } - - this._handlers[type].push(listener); - }, - - /** - * Adds a listener for a given event type. - * @param {String} type The type of event to add a listener for. - * @param {Function} listener The function to call when the event occurs. - * @return {void} - * @method subscribe - * @deprecated - */ - subscribe: function(type, listener){ - this.attach.apply(this, arguments); - }, - - /** - * Fires an event based on the passed-in object. - * @param {Object|String} event An object with at least a 'type' attribute - * or a string indicating the event name. - * @return {void} - * @method fire - */ - fire: function(event){ - if (typeof event == "string"){ - event = { type: event }; - } - if (!event.target){ - event.target = this; - } - - if (!event.type){ - throw new Error("Event object missing 'type' property."); - } - - if (this._handlers[event.type] instanceof Array){ - var handlers = this._handlers[event.type]; - for (var i=0, len=handlers.length; i < len; i++){ - handlers[i].call(this, event); - } - } - }, - - /** - * Removes a listener for a given event type. - * @param {String} type The type of event to remove a listener from. - * @param {Function} listener The function to remove from the event. - * @return {void} - * @method detach - */ - detach: function(type, listener){ - if (this._handlers[type] instanceof Array){ - var handlers = this._handlers[type]; - for (var i=0, len=handlers.length; i < len; i++){ - if (handlers[i] === listener){ - handlers.splice(i, 1); - break; - } - } - } - }, - - /** - * Removes a listener for a given event type. - * @param {String} type The type of event to remove a listener from. - * @param {Function} listener The function to remove from the event. - * @return {void} - * @method unsubscribe - * @deprecated - */ - unsubscribe: function(type, listener){ - this.detach.apply(this, arguments); - } - -}; - - -/** - * Object containing helper methods. - * @namespace YUITest - * @class Util - * @static - */ -YUITest.Util = { - - /** - * Mixes the own properties from the supplier onto the - * receiver. - * @param {Object} receiver The object to receive the properties. - * @param {Object} supplier The object to supply the properties. - * @return {Object} The receiver that was passed in. - * @method mix - * @static - */ - mix: function(receiver, supplier){ - - for (var prop in supplier){ - if (supplier.hasOwnProperty(prop)){ - receiver[prop] = supplier[prop]; - } - } - - return receiver; - }, - - /** - * Stub for JSON functionality. When the native JSON utility - * is available, it will be used. Otherwise, a stub object - * is created. Developers should override YUITest.Util.JSON - * when attempting to use it in environments where a native - * JSON utility is unavailable. - * @property JSON - * @type JSON - * @static - */ - JSON: typeof JSON != "undefined" ? JSON : { - stringify: function(){ - //TODO: Should include code to do this? - throw new Error("No JSON utility specified."); - } - } - -}; - - -/** - * Error is thrown whenever an assertion fails. It provides methods - * to more easily get at error information and also provides a base class - * from which more specific assertion errors can be derived. - * - * @param {String} message The message to display when the error occurs. - * @namespace YUITest - * @class AssertionError - * @constructor - */ -YUITest.AssertionError = function (message){ - - /** - * Error message. Must be duplicated to ensure browser receives it. - * @type String - * @property message - */ - this.message = message; - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "Assert Error"; -}; - -YUITest.AssertionError.prototype = { - - //restore constructor - constructor: YUITest.AssertionError, - - /** - * Returns a fully formatted error for an assertion failure. This should - * be overridden by all subclasses to provide specific information. - * @method getMessage - * @return {String} A string describing the error. - */ - getMessage : function () { - return this.message; - }, - - /** - * Returns a string representation of the error. - * @method toString - * @return {String} A string representation of the error. - */ - toString : function () { - return this.name + ": " + this.getMessage(); - } - -}; - -/** - * ComparisonFailure is subclass of Error that is thrown whenever - * a comparison between two values fails. It provides mechanisms to retrieve - * both the expected and actual value. - * - * @param {String} message The message to display when the error occurs. - * @param {Object} expected The expected value. - * @param {Object} actual The actual value that caused the assertion to fail. - * @namespace YUITest - * @extends AssertionError - * @class ComparisonFailure - * @constructor - */ -YUITest.ComparisonFailure = function (message, expected, actual){ - - //call superclass - YUITest.AssertionError.call(this, message); - - /** - * The expected value. - * @type Object - * @property expected - */ - this.expected = expected; - - /** - * The actual value. - * @type Object - * @property actual - */ - this.actual = actual; - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "ComparisonFailure"; - -}; - -//inherit from YUITest.AssertionError -YUITest.ComparisonFailure.prototype = new YUITest.AssertionError; - -//restore constructor -YUITest.ComparisonFailure.prototype.constructor = YUITest.ComparisonFailure; - -/** - * Returns a fully formatted error for an assertion failure. This message - * provides information about the expected and actual values. - * @method getMessage - * @return {String} A string describing the error. - */ -YUITest.ComparisonFailure.prototype.getMessage = function(){ - return this.message + "\nExpected: " + this.expected + " (" + (typeof this.expected) + ")" + - "\nActual: " + this.actual + " (" + (typeof this.actual) + ")"; -}; - -/** - * ShouldError is subclass of Error that is thrown whenever - * a test is expected to throw an error but doesn't. - * - * @param {String} message The message to display when the error occurs. - * @namespace YUITest - * @extends AssertionError - * @class ShouldError - * @constructor - */ -YUITest.ShouldError = function (message){ - - //call superclass - YUITest.AssertionError.call(this, message || "This test should have thrown an error but didn't."); - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "ShouldError"; - -}; - -//inherit from YUITest.AssertionError -YUITest.ShouldError.prototype = new YUITest.AssertionError(); - -//restore constructor -YUITest.ShouldError.prototype.constructor = YUITest.ShouldError; - -/** - * ShouldFail is subclass of AssertionError that is thrown whenever - * a test was expected to fail but did not. - * - * @param {String} message The message to display when the error occurs. - * @namespace YUITest - * @extends YUITest.AssertionError - * @class ShouldFail - * @constructor - */ -YUITest.ShouldFail = function (message){ - - //call superclass - YUITest.AssertionError.call(this, message || "This test should fail but didn't."); - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "ShouldFail"; - -}; - -//inherit from YUITest.AssertionError -YUITest.ShouldFail.prototype = new YUITest.AssertionError(); - -//restore constructor -YUITest.ShouldFail.prototype.constructor = YUITest.ShouldFail; - -/** - * UnexpectedError is subclass of AssertionError that is thrown whenever - * an error occurs within the course of a test and the test was not expected - * to throw an error. - * - * @param {Error} cause The unexpected error that caused this error to be - * thrown. - * @namespace YUITest - * @extends YUITest.AssertionError - * @class UnexpectedError - * @constructor - */ -YUITest.UnexpectedError = function (cause){ - - //call superclass - YUITest.AssertionError.call(this, "Unexpected error: " + cause.message); - - /** - * The unexpected error that occurred. - * @type Error - * @property cause - */ - this.cause = cause; - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "UnexpectedError"; - - /** - * Stack information for the error (if provided). - * @type String - * @property stack - */ - this.stack = cause.stack; - -}; - -//inherit from YUITest.AssertionError -YUITest.UnexpectedError.prototype = new YUITest.AssertionError(); - -//restore constructor -YUITest.UnexpectedError.prototype.constructor = YUITest.UnexpectedError; - -/** - * UnexpectedValue is subclass of Error that is thrown whenever - * a value was unexpected in its scope. This typically means that a test - * was performed to determine that a value was *not* equal to a certain - * value. - * - * @param {String} message The message to display when the error occurs. - * @param {Object} unexpected The unexpected value. - * @namespace YUITest - * @extends AssertionError - * @class UnexpectedValue - * @constructor - */ -YUITest.UnexpectedValue = function (message, unexpected){ - - //call superclass - YUITest.AssertionError.call(this, message); - - /** - * The unexpected value. - * @type Object - * @property unexpected - */ - this.unexpected = unexpected; - - /** - * The name of the error that occurred. - * @type String - * @property name - */ - this.name = "UnexpectedValue"; - -}; - -//inherit from YUITest.AssertionError -YUITest.UnexpectedValue.prototype = new YUITest.AssertionError(); - -//restore constructor -YUITest.UnexpectedValue.prototype.constructor = YUITest.UnexpectedValue; - -/** - * Returns a fully formatted error for an assertion failure. This message - * provides information about the expected and actual values. - * @method getMessage - * @return {String} A string describing the error. - */ -YUITest.UnexpectedValue.prototype.getMessage = function(){ - return this.message + "\nUnexpected: " + this.unexpected + " (" + (typeof this.unexpected) + ") "; -}; - - -/** - * Represents a stoppage in test execution to wait for an amount of time before - * continuing. - * @param {Function} segment A function to run when the wait is over. - * @param {int} delay The number of milliseconds to wait before running the code. - * @class Wait - * @namespace Test - * @constructor - * - */ -YUITest.Wait = function (segment, delay) { - - /** - * The segment of code to run when the wait is over. - * @type Function - * @property segment - */ - this.segment = (typeof segment == "function" ? segment : null); - - /** - * The delay before running the segment of code. - * @type int - * @property delay - */ - this.delay = (typeof delay == "number" ? delay : 0); -}; - - -/** - * The Assert object provides functions to test JavaScript values against - * known and expected results. Whenever a comparison (assertion) fails, - * an error is thrown. - * @namespace YUITest - * @class Assert - * @static - */ -YUITest.Assert = { - - /** - * The number of assertions performed. - * @property _asserts - * @type int - * @private - */ - _asserts: 0, - - //------------------------------------------------------------------------- - // Helper Methods - //------------------------------------------------------------------------- - - /** - * Formats a message so that it can contain the original assertion message - * in addition to the custom message. - * @param {String} customMessage The message passed in by the developer. - * @param {String} defaultMessage The message created by the error by default. - * @return {String} The final error message, containing either or both. - * @protected - * @static - * @method _formatMessage - */ - _formatMessage : function (customMessage, defaultMessage) { - if (typeof customMessage == "string" && customMessage.length > 0){ - return customMessage.replace("{message}", defaultMessage); - } else { - return defaultMessage; - } - }, - - /** - * Returns the number of assertions that have been performed. - * @method _getCount - * @protected - * @static - */ - _getCount: function(){ - return this._asserts; - }, - - /** - * Increments the number of assertions that have been performed. - * @method _increment - * @protected - * @static - */ - _increment: function(){ - this._asserts++; - }, - - /** - * Resets the number of assertions that have been performed to 0. - * @method _reset - * @protected - * @static - */ - _reset: function(){ - this._asserts = 0; - }, - - //------------------------------------------------------------------------- - // Generic Assertion Methods - //------------------------------------------------------------------------- - - /** - * Forces an assertion error to occur. - * @param {String} message (Optional) The message to display with the failure. - * @method fail - * @static - */ - fail : function (message) { - throw new YUITest.AssertionError(YUITest.Assert._formatMessage(message, "Test force-failed.")); - }, - - //------------------------------------------------------------------------- - // Equality Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is equal to another. This uses the double equals sign - * so type cohersion may occur. - * @param {Object} expected The expected value. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method areEqual - * @static - */ - areEqual : function (expected, actual, message) { - YUITest.Assert._increment(); - if (expected != actual) { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values should be equal."), expected, actual); - } - }, - - /** - * Asserts that a value is not equal to another. This uses the double equals sign - * so type cohersion may occur. - * @param {Object} unexpected The unexpected value. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method areNotEqual - * @static - */ - areNotEqual : function (unexpected, actual, - message) { - YUITest.Assert._increment(); - if (unexpected == actual) { - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Values should not be equal."), unexpected); - } - }, - - /** - * Asserts that a value is not the same as another. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} unexpected The unexpected value. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method areNotSame - * @static - */ - areNotSame : function (unexpected, actual, message) { - YUITest.Assert._increment(); - if (unexpected === actual) { - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Values should not be the same."), unexpected); - } - }, - - /** - * Asserts that a value is the same as another. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} expected The expected value. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method areSame - * @static - */ - areSame : function (expected, actual, message) { - YUITest.Assert._increment(); - if (expected !== actual) { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values should be the same."), expected, actual); - } - }, - - //------------------------------------------------------------------------- - // Boolean Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is false. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isFalse - * @static - */ - isFalse : function (actual, message) { - YUITest.Assert._increment(); - if (false !== actual) { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be false."), false, actual); - } - }, - - /** - * Asserts that a value is true. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isTrue - * @static - */ - isTrue : function (actual, message) { - YUITest.Assert._increment(); - if (true !== actual) { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be true."), true, actual); - } - - }, - - //------------------------------------------------------------------------- - // Special Value Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a value is not a number. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNaN - * @static - */ - isNaN : function (actual, message){ - YUITest.Assert._increment(); - if (!isNaN(actual)){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be NaN."), NaN, actual); - } - }, - - /** - * Asserts that a value is not the special NaN value. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNotNaN - * @static - */ - isNotNaN : function (actual, message){ - YUITest.Assert._increment(); - if (isNaN(actual)){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Values should not be NaN."), NaN); - } - }, - - /** - * Asserts that a value is not null. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNotNull - * @static - */ - isNotNull : function (actual, message) { - YUITest.Assert._increment(); - if (actual === null) { - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Values should not be null."), null); - } - }, - - /** - * Asserts that a value is not undefined. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNotUndefined - * @static - */ - isNotUndefined : function (actual, message) { - YUITest.Assert._increment(); - if (typeof actual == "undefined") { - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should not be undefined."), undefined); - } - }, - - /** - * Asserts that a value is null. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNull - * @static - */ - isNull : function (actual, message) { - YUITest.Assert._increment(); - if (actual !== null) { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be null."), null, actual); - } - }, - - /** - * Asserts that a value is undefined. This uses the triple equals sign - * so no type cohersion may occur. - * @param {Object} actual The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isUndefined - * @static - */ - isUndefined : function (actual, message) { - YUITest.Assert._increment(); - if (typeof actual != "undefined") { - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be undefined."), undefined, actual); - } - }, - - //-------------------------------------------------------------------------- - // Instance Assertion Methods - //-------------------------------------------------------------------------- - - /** - * Asserts that a value is an array. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isArray - * @static - */ - isArray : function (actual, message) { - YUITest.Assert._increment(); - var shouldFail = false; - if (Array.isArray){ - shouldFail = !Array.isArray(actual); - } else { - shouldFail = Object.prototype.toString.call(actual) != "[object Array]"; - } - if (shouldFail){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be an array."), actual); - } - }, - - /** - * Asserts that a value is a Boolean. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isBoolean - * @static - */ - isBoolean : function (actual, message) { - YUITest.Assert._increment(); - if (typeof actual != "boolean"){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be a Boolean."), actual); - } - }, - - /** - * Asserts that a value is a function. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isFunction - * @static - */ - isFunction : function (actual, message) { - YUITest.Assert._increment(); - if (!(actual instanceof Function)){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be a function."), actual); - } - }, - - /** - * Asserts that a value is an instance of a particular object. This may return - * incorrect results when comparing objects from one frame to constructors in - * another frame. For best results, don't use in a cross-frame manner. - * @param {Function} expected The function that the object should be an instance of. - * @param {Object} actual The object to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isInstanceOf - * @static - */ - isInstanceOf : function (expected, actual, message) { - YUITest.Assert._increment(); - if (!(actual instanceof expected)){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value isn't an instance of expected type."), expected, actual); - } - }, - - /** - * Asserts that a value is a number. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNumber - * @static - */ - isNumber : function (actual, message) { - YUITest.Assert._increment(); - if (typeof actual != "number"){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be a number."), actual); - } - }, - - /** - * Asserts that a value is an object. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isObject - * @static - */ - isObject : function (actual, message) { - YUITest.Assert._increment(); - if (!actual || (typeof actual != "object" && typeof actual != "function")){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be an object."), actual); - } - }, - - /** - * Asserts that a value is a string. - * @param {Object} actual The value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isString - * @static - */ - isString : function (actual, message) { - YUITest.Assert._increment(); - if (typeof actual != "string"){ - throw new YUITest.UnexpectedValue(YUITest.Assert._formatMessage(message, "Value should be a string."), actual); - } - }, - - /** - * Asserts that a value is of a particular type. - * @param {String} expectedType The expected type of the variable. - * @param {Object} actualValue The actual value to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isTypeOf - * @static - */ - isTypeOf : function (expectedType, actualValue, message){ - YUITest.Assert._increment(); - if (typeof actualValue != expectedType){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Value should be of type " + expectedType + "."), expectedType, typeof actualValue); - } - }, - - //-------------------------------------------------------------------------- - // Error Detection Methods - //-------------------------------------------------------------------------- - - /** - * Asserts that executing a particular method should throw an error of - * a specific type. This is a replacement for _should.error. - * @param {String|Function|Object} expectedError If a string, this - * is the error message that the error must have; if a function, this - * is the constructor that should have been used to create the thrown - * error; if an object, this is an instance of a particular error type - * with a specific error message (both must match). - * @param {Function} method The method to execute that should throw the error. - * @param {String} message (Optional) The message to display if the assertion - * fails. - * @method throwsError - * @return {void} - * @static - */ - throwsError: function(expectedError, method, message){ - YUITest.Assert._increment(); - var error = false; - - try { - method(); - } catch (thrown) { - - //check to see what type of data we have - if (typeof expectedError == "string"){ - - //if it's a string, check the error message - if (thrown.message != expectedError){ - error = true; - } - } else if (typeof expectedError == "function"){ - - //if it's a function, see if the error is an instance of it - if (!(thrown instanceof expectedError)){ - error = true; - } - - } else if (typeof expectedError == "object" && expectedError !== null){ - - //if it's an object, check the instance and message - if (!(thrown instanceof expectedError.constructor) || - thrown.message != expectedError.message){ - error = true; - } - - } else { //if it gets here, the argument could be wrong - error = true; - } - - if (error){ - throw new YUITest.UnexpectedError(thrown); - } else { - return; - } - } - - //if it reaches here, the error wasn't thrown, which is a bad thing - throw new YUITest.AssertionError(YUITest.Assert._formatMessage(message, "Error should have been thrown.")); - } - -}; - - -/** - * The ArrayAssert object provides functions to test JavaScript array objects - * for a variety of cases. - * @namespace YUITest - * @class ArrayAssert - * @static - */ - -YUITest.ArrayAssert = { - - //========================================================================= - // Private methods - //========================================================================= - - /** - * Simple indexOf() implementation for an array. Defers to native - * if available. - * @param {Array} haystack The array to search. - * @param {Variant} needle The value to locate. - * @return {int} The index of the needle if found or -1 if not. - * @method _indexOf - * @private - */ - _indexOf: function(haystack, needle){ - if (haystack.indexOf){ - return haystack.indexOf(needle); - } else { - for (var i=0; i < haystack.length; i++){ - if (haystack[i] === needle){ - return i; - } - } - return -1; - } - }, - - /** - * Simple some() implementation for an array. Defers to native - * if available. - * @param {Array} haystack The array to search. - * @param {Function} matcher The function to run on each value. - * @return {Boolean} True if any value, when run through the matcher, - * returns true. - * @method _some - * @private - */ - _some: function(haystack, matcher){ - if (haystack.some){ - return haystack.some(matcher); - } else { - for (var i=0; i < haystack.length; i++){ - if (matcher(haystack[i])){ - return true; - } - } - return false; - } - }, - - /** - * Asserts that a value is present in an array. This uses the triple equals - * sign so no type cohersion may occur. - * @param {Object} needle The value that is expected in the array. - * @param {Array} haystack An array of values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method contains - * @static - */ - contains : function (needle, haystack, - message) { - - YUITest.Assert._increment(); - - if (this._indexOf(haystack, needle) == -1){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value " + needle + " (" + (typeof needle) + ") not found in array [" + haystack + "].")); - } - }, - - /** - * Asserts that a set of values are present in an array. This uses the triple equals - * sign so no type cohersion may occur. For this assertion to pass, all values must - * be found. - * @param {Object[]} needles An array of values that are expected in the array. - * @param {Array} haystack An array of values to check. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method containsItems - * @static - */ - containsItems : function (needles, haystack, - message) { - YUITest.Assert._increment(); - - //begin checking values - for (var i=0; i < needles.length; i++){ - if (this._indexOf(haystack, needles[i]) == -1){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value " + needles[i] + " (" + (typeof needles[i]) + ") not found in array [" + haystack + "].")); - } - } - }, - - /** - * Asserts that a value matching some condition is present in an array. This uses - * a function to determine a match. - * @param {Function} matcher A function that returns true if the items matches or false if not. - * @param {Array} haystack An array of values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method containsMatch - * @static - */ - containsMatch : function (matcher, haystack, - message) { - - YUITest.Assert._increment(); - //check for valid matcher - if (typeof matcher != "function"){ - throw new TypeError("ArrayAssert.containsMatch(): First argument must be a function."); - } - - if (!this._some(haystack, matcher)){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "No match found in array [" + haystack + "].")); - } - }, - - /** - * Asserts that a value is not present in an array. This uses the triple equals - * Asserts that a value is not present in an array. This uses the triple equals - * sign so no type cohersion may occur. - * @param {Object} needle The value that is expected in the array. - * @param {Array} haystack An array of values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method doesNotContain - * @static - */ - doesNotContain : function (needle, haystack, - message) { - - YUITest.Assert._increment(); - - if (this._indexOf(haystack, needle) > -1){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value found in array [" + haystack + "].")); - } - }, - - /** - * Asserts that a set of values are not present in an array. This uses the triple equals - * sign so no type cohersion may occur. For this assertion to pass, all values must - * not be found. - * @param {Object[]} needles An array of values that are not expected in the array. - * @param {Array} haystack An array of values to check. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method doesNotContainItems - * @static - */ - doesNotContainItems : function (needles, haystack, - message) { - - YUITest.Assert._increment(); - - for (var i=0; i < needles.length; i++){ - if (this._indexOf(haystack, needles[i]) > -1){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value found in array [" + haystack + "].")); - } - } - - }, - - /** - * Asserts that no values matching a condition are present in an array. This uses - * a function to determine a match. - * @param {Function} matcher A function that returns true if the item matches or false if not. - * @param {Array} haystack An array of values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method doesNotContainMatch - * @static - */ - doesNotContainMatch : function (matcher, haystack, - message) { - - YUITest.Assert._increment(); - - //check for valid matcher - if (typeof matcher != "function"){ - throw new TypeError("ArrayAssert.doesNotContainMatch(): First argument must be a function."); - } - - if (this._some(haystack, matcher)){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value found in array [" + haystack + "].")); - } - }, - - /** - * Asserts that the given value is contained in an array at the specified index. - * This uses the triple equals sign so no type cohersion will occur. - * @param {Object} needle The value to look for. - * @param {Array} haystack The array to search in. - * @param {int} index The index at which the value should exist. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method indexOf - * @static - */ - indexOf : function (needle, haystack, index, message) { - - YUITest.Assert._increment(); - - //try to find the value in the array - for (var i=0; i < haystack.length; i++){ - if (haystack[i] === needle){ - if (index != i){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value exists at index " + i + " but should be at index " + index + ".")); - } - return; - } - } - - //if it makes it here, it wasn't found at all - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value doesn't exist in array [" + haystack + "].")); - }, - - /** - * Asserts that the values in an array are equal, and in the same position, - * as values in another array. This uses the double equals sign - * so type cohersion may occur. Note that the array objects themselves - * need not be the same for this test to pass. - * @param {Array} expected An array of the expected values. - * @param {Array} actual Any array of the actual values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method itemsAreEqual - * @static - */ - itemsAreEqual : function (expected, actual, - message) { - - YUITest.Assert._increment(); - - //first check array length - if (expected.length != actual.length){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Array should have a length of " + expected.length + " but has a length of " + actual.length)); - } - - //begin checking values - for (var i=0; i < expected.length; i++){ - if (expected[i] != actual[i]){ - throw new YUITest.Assert.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values in position " + i + " are not equal."), expected[i], actual[i]); - } - } - }, - - /** - * Asserts that the values in an array are equivalent, and in the same position, - * as values in another array. This uses a function to determine if the values - * are equivalent. Note that the array objects themselves - * need not be the same for this test to pass. - * @param {Array} expected An array of the expected values. - * @param {Array} actual Any array of the actual values. - * @param {Function} comparator A function that returns true if the values are equivalent - * or false if not. - * @param {String} message (Optional) The message to display if the assertion fails. - * @return {Void} - * @method itemsAreEquivalent - * @static - */ - itemsAreEquivalent : function (expected, actual, - comparator, message) { - - YUITest.Assert._increment(); - - //make sure the comparator is valid - if (typeof comparator != "function"){ - throw new TypeError("ArrayAssert.itemsAreEquivalent(): Third argument must be a function."); - } - - //first check array length - if (expected.length != actual.length){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Array should have a length of " + expected.length + " but has a length of " + actual.length)); - } - - //begin checking values - for (var i=0; i < expected.length; i++){ - if (!comparator(expected[i], actual[i])){ - throw new YUITest.Assert.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values in position " + i + " are not equivalent."), expected[i], actual[i]); - } - } - }, - - /** - * Asserts that an array is empty. - * @param {Array} actual The array to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isEmpty - * @static - */ - isEmpty : function (actual, message) { - YUITest.Assert._increment(); - if (actual.length > 0){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Array should be empty.")); - } - }, - - /** - * Asserts that an array is not empty. - * @param {Array} actual The array to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method isNotEmpty - * @static - */ - isNotEmpty : function (actual, message) { - YUITest.Assert._increment(); - if (actual.length === 0){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Array should not be empty.")); - } - }, - - /** - * Asserts that the values in an array are the same, and in the same position, - * as values in another array. This uses the triple equals sign - * so no type cohersion will occur. Note that the array objects themselves - * need not be the same for this test to pass. - * @param {Array} expected An array of the expected values. - * @param {Array} actual Any array of the actual values. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method itemsAreSame - * @static - */ - itemsAreSame : function (expected, actual, - message) { - - YUITest.Assert._increment(); - - //first check array length - if (expected.length != actual.length){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Array should have a length of " + expected.length + " but has a length of " + actual.length)); - } - - //begin checking values - for (var i=0; i < expected.length; i++){ - if (expected[i] !== actual[i]){ - throw new YUITest.Assert.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values in position " + i + " are not the same."), expected[i], actual[i]); - } - } - }, - - /** - * Asserts that the given value is contained in an array at the specified index, - * starting from the back of the array. - * This uses the triple equals sign so no type cohersion will occur. - * @param {Object} needle The value to look for. - * @param {Array} haystack The array to search in. - * @param {int} index The index at which the value should exist. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method lastIndexOf - * @static - */ - lastIndexOf : function (needle, haystack, index, message) { - - //try to find the value in the array - for (var i=haystack.length; i >= 0; i--){ - if (haystack[i] === needle){ - if (index != i){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value exists at index " + i + " but should be at index " + index + ".")); - } - return; - } - } - - //if it makes it here, it wasn't found at all - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Value doesn't exist in array.")); - } - -}; - - -/** - * The ObjectAssert object provides functions to test JavaScript objects - * for a variety of cases. - * @namespace YUITest - * @class ObjectAssert - * @static - */ -YUITest.ObjectAssert = { - - /** - * Asserts that an object has all of the same properties - * and property values as the other. - * @param {Object} expected The object with all expected properties and values. - * @param {Object} actual The object to inspect. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method areEqual - * @static - * @deprecated - */ - areEqual: function(expected, actual, message) { - YUITest.Assert._increment(); - - for (var name in expected){ - if (expected.hasOwnProperty(name)){ - if (expected[name] != actual[name]){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, "Values should be equal for property " + name), expected[name], actual[name]); - } - } - } - }, - - /** - * Asserts that an object has a property with the given name. - * @param {String} propertyName The name of the property to test. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method hasKey - * @static - * @deprecated Use ownsOrInheritsKey() instead - */ - hasKey: function (propertyName, object, message) { - YUITest.ObjectAssert.ownsOrInheritsKey(propertyName, object, message); - }, - - /** - * Asserts that an object has all properties of a reference object. - * @param {Array} properties An array of property names that should be on the object. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method hasKeys - * @static - * @deprecated Use ownsOrInheritsKeys() instead - */ - hasKeys: function (properties, object, message) { - YUITest.ObjectAssert.ownsOrInheritsKeys(properties, objects, message); - }, - - /** - * Asserts that a property with the given name exists on an object's prototype. - * @param {String} propertyName The name of the property to test. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method inheritsKey - * @static - */ - inheritsKey: function (propertyName, object, message) { - YUITest.Assert._increment(); - if (!(propertyName in object && !object.hasOwnProperty(propertyName))){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + propertyName + "' not found on object instance.")); - } - }, - - /** - * Asserts that all properties exist on an object prototype. - * @param {Array} properties An array of property names that should be on the object. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method inheritsKeys - * @static - */ - inheritsKeys: function (properties, object, message) { - YUITest.Assert._increment(); - for (var i=0; i < properties.length; i++){ - if (!(propertyName in object && !object.hasOwnProperty(properties[i]))){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + properties[i] + "' not found on object instance.")); - } - } - }, - - /** - * Asserts that a property with the given name exists on an object instance (not on its prototype). - * @param {String} propertyName The name of the property to test. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method ownsKey - * @static - */ - ownsKey: function (propertyName, object, message) { - YUITest.Assert._increment(); - if (!object.hasOwnProperty(propertyName)){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + propertyName + "' not found on object instance.")); - } - }, - - /** - * Asserts that all properties exist on an object instance (not on its prototype). - * @param {Array} properties An array of property names that should be on the object. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method ownsKeys - * @static - */ - ownsKeys: function (properties, object, message) { - YUITest.Assert._increment(); - for (var i=0; i < properties.length; i++){ - if (!object.hasOwnProperty(properties[i])){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + properties[i] + "' not found on object instance.")); - } - } - }, - - /** - * Asserts that an object owns no properties. - * @param {Object} object The object to check. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method ownsNoKeys - * @static - */ - ownsNoKeys : function (object, message) { - YUITest.Assert._increment(); - var count = 0, - name; - for (name in object){ - if (object.hasOwnProperty(name)){ - count++; - } - } - - if (count !== 0){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Object owns " + count + " properties but should own none.")); - } - - }, - - /** - * Asserts that an object has a property with the given name. - * @param {String} propertyName The name of the property to test. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method ownsOrInheritsKey - * @static - */ - ownsOrInheritsKey: function (propertyName, object, message) { - YUITest.Assert._increment(); - if (!(propertyName in object)){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + propertyName + "' not found on object.")); - } - }, - - /** - * Asserts that an object has all properties of a reference object. - * @param {Array} properties An array of property names that should be on the object. - * @param {Object} object The object to search. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method ownsOrInheritsKeys - * @static - */ - ownsOrInheritsKeys: function (properties, object, message) { - YUITest.Assert._increment(); - for (var i=0; i < properties.length; i++){ - if (!(properties[i] in object)){ - YUITest.Assert.fail(YUITest.Assert._formatMessage(message, "Property '" + properties[i] + "' not found on object.")); - } - } - } -}; - - - -/** - * The DateAssert object provides functions to test JavaScript Date objects - * for a variety of cases. - * @namespace YUITest - * @class DateAssert - * @static - */ - -YUITest.DateAssert = { - - /** - * Asserts that a date's month, day, and year are equal to another date's. - * @param {Date} expected The expected date. - * @param {Date} actual The actual date to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method datesAreEqual - * @static - */ - datesAreEqual : function (expected, actual, message){ - YUITest.Assert._increment(); - if (expected instanceof Date && actual instanceof Date){ - var msg = ""; - - //check years first - if (expected.getFullYear() != actual.getFullYear()){ - msg = "Years should be equal."; - } - - //now check months - if (expected.getMonth() != actual.getMonth()){ - msg = "Months should be equal."; - } - - //last, check the day of the month - if (expected.getDate() != actual.getDate()){ - msg = "Days of month should be equal."; - } - - if (msg.length){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, msg), expected, actual); - } - } else { - throw new TypeError("YUITest.DateAssert.datesAreEqual(): Expected and actual values must be Date objects."); - } - }, - - /** - * Asserts that a date's hour, minutes, and seconds are equal to another date's. - * @param {Date} expected The expected date. - * @param {Date} actual The actual date to test. - * @param {String} message (Optional) The message to display if the assertion fails. - * @method timesAreEqual - * @static - */ - timesAreEqual : function (expected, actual, message){ - YUITest.Assert._increment(); - if (expected instanceof Date && actual instanceof Date){ - var msg = ""; - - //check hours first - if (expected.getHours() != actual.getHours()){ - msg = "Hours should be equal."; - } - - //now check minutes - if (expected.getMinutes() != actual.getMinutes()){ - msg = "Minutes should be equal."; - } - - //last, check the seconds - if (expected.getSeconds() != actual.getSeconds()){ - msg = "Seconds should be equal."; - } - - if (msg.length){ - throw new YUITest.ComparisonFailure(YUITest.Assert._formatMessage(message, msg), expected, actual); - } - } else { - throw new TypeError("YUITest.DateAssert.timesAreEqual(): Expected and actual values must be Date objects."); - } - } - -}; - -/** - * Creates a new mock object. - * @namespace YUITest - * @class Mock - * @constructor - * @param {Object} template (Optional) An object whose methods - * should be stubbed out on the mock object. - */ -YUITest.Mock = function(template){ - - //use blank object is nothing is passed in - template = template || {}; - - var mock, - name; - - //try to create mock that keeps prototype chain intact - //fails in the case of ActiveX objects - try { - function f(){} - f.prototype = template; - mock = new f(); - } catch (ex) { - mock = {}; - } - - //create stubs for all methods - for (name in template){ - if (template.hasOwnProperty(name)){ - if (typeof template[name] == "function"){ - mock[name] = function(name){ - return function(){ - YUITest.Assert.fail("Method " + name + "() was called but was not expected to be."); - }; - }(name); - } - } - } - - //return it - return mock; -}; - -/** - * Assigns an expectation to a mock object. This is used to create - * methods and properties on the mock object that are monitored for - * calls and changes, respectively. - * @param {Object} mock The object to add the expectation to. - * @param {Object} expectation An object defining the expectation. For - * a method, the keys "method" and "args" are required with - * an optional "returns" key available. For properties, the keys - * "property" and "value" are required. - * @return {void} - * @method expect - * @static - */ -YUITest.Mock.expect = function(mock /*:Object*/, expectation /*:Object*/){ - - //make sure there's a place to store the expectations - if (!mock.__expectations) { - mock.__expectations = {}; - } - - //method expectation - if (expectation.method){ - var name = expectation.method, - args = expectation.args || [], - result = expectation.returns, - callCount = (typeof expectation.callCount == "number") ? expectation.callCount : 1, - error = expectation.error, - run = expectation.run || function(){}, - i; - - //save expectations - mock.__expectations[name] = expectation; - expectation.callCount = callCount; - expectation.actualCallCount = 0; - - //process arguments - for (i=0; i < args.length; i++){ - if (!(args[i] instanceof YUITest.Mock.Value)){ - args[i] = YUITest.Mock.Value(YUITest.Assert.areSame, [args[i]], "Argument " + i + " of " + name + "() is incorrect."); - } - } - - //if the method is expected to be called - if (callCount > 0){ - mock[name] = function(){ - try { - expectation.actualCallCount++; - YUITest.Assert.areEqual(args.length, arguments.length, "Method " + name + "() passed incorrect number of arguments."); - for (var i=0, len=args.length; i < len; i++){ - args[i].verify(arguments[i]); - } - - run.apply(this, arguments); - - if (error){ - throw error; - } - } catch (ex){ - //route through TestRunner for proper handling - YUITest.TestRunner._handleError(ex); - } - - return result; - }; - } else { - - //method should fail if called when not expected - mock[name] = function(){ - try { - YUITest.Assert.fail("Method " + name + "() should not have been called."); - } catch (ex){ - //route through TestRunner for proper handling - YUITest.TestRunner._handleError(ex); - } - }; - } - } else if (expectation.property){ - //save expectations - mock.__expectations[name] = expectation; - } -}; - -/** - * Verifies that all expectations of a mock object have been met and - * throws an assertion error if not. - * @param {Object} mock The object to verify.. - * @return {void} - * @method verify - * @static - */ -YUITest.Mock.verify = function(mock){ - try { - - for (var name in mock.__expectations){ - if (mock.__expectations.hasOwnProperty(name)){ - var expectation = mock.__expectations[name]; - if (expectation.method) { - YUITest.Assert.areEqual(expectation.callCount, expectation.actualCallCount, "Method " + expectation.method + "() wasn't called the expected number of times."); - } else if (expectation.property){ - YUITest.Assert.areEqual(expectation.value, mock[expectation.property], "Property " + expectation.property + " wasn't set to the correct value."); - } - } - } - - } catch (ex){ - //route through TestRunner for proper handling - YUITest.TestRunner._handleError(ex); - } -}; - -/** - * Creates a new value matcher. - * @param {Function} method The function to call on the value. - * @param {Array} originalArgs (Optional) Array of arguments to pass to the method. - * @param {String} message (Optional) Message to display in case of failure. - * @namespace YUITest.Mock - * @class Value - * @constructor - */ -YUITest.Mock.Value = function(method, originalArgs, message){ - if (this instanceof YUITest.Mock.Value){ - this.verify = function(value){ - var args = [].concat(originalArgs || []); - args.push(value); - args.push(message); - method.apply(null, args); - }; - } else { - return new YUITest.Mock.Value(method, originalArgs, message); - } -}; - -/** - * Predefined matcher to match any value. - * @property Any - * @static - * @type Function - */ -YUITest.Mock.Value.Any = YUITest.Mock.Value(function(){}); - -/** - * Predefined matcher to match boolean values. - * @property Boolean - * @static - * @type Function - */ -YUITest.Mock.Value.Boolean = YUITest.Mock.Value(YUITest.Assert.isBoolean); - -/** - * Predefined matcher to match number values. - * @property Number - * @static - * @type Function - */ -YUITest.Mock.Value.Number = YUITest.Mock.Value(YUITest.Assert.isNumber); - -/** - * Predefined matcher to match string values. - * @property String - * @static - * @type Function - */ -YUITest.Mock.Value.String = YUITest.Mock.Value(YUITest.Assert.isString); - -/** - * Predefined matcher to match object values. - * @property Object - * @static - * @type Function - */ -YUITest.Mock.Value.Object = YUITest.Mock.Value(YUITest.Assert.isObject); - -/** - * Predefined matcher to match function values. - * @property Function - * @static - * @type Function - */ -YUITest.Mock.Value.Function = YUITest.Mock.Value(YUITest.Assert.isFunction); - -/** - * Test case containing various tests to run. - * @param template An object containing any number of test methods, other methods, - * an optional name, and anything else the test case needs. - * @class TestCase - * @namespace YUITest - * @constructor - */ -YUITest.TestCase = function (template) { - - /** - * Special rules for the test case. Possible subobjects - * are fail, for tests that should fail, and error, for - * tests that should throw an error. - */ - this._should = {}; - - //copy over all properties from the template to this object - for (var prop in template) { - this[prop] = template[prop]; - } - - //check for a valid name - if (typeof this.name != "string"){ - this.name = "testCase" + (+new Date()); - } - -}; - -YUITest.TestCase.prototype = { - - //restore constructor - constructor: YUITest.TestCase, - - /** - * Resumes a paused test and runs the given function. - * @param {Function} segment (Optional) The function to run. - * If omitted, the test automatically passes. - * @return {Void} - * @method resume - */ - resume : function (segment) { - YUITest.TestRunner.resume(segment); - }, - - /** - * Causes the test case to wait a specified amount of time and then - * continue executing the given code. - * @param {Function} segment (Optional) The function to run after the delay. - * If omitted, the TestRunner will wait until resume() is called. - * @param {int} delay (Optional) The number of milliseconds to wait before running - * the function. If omitted, defaults to zero. - * @return {Void} - * @method wait - */ - wait : function (segment, delay){ - delay = (typeof delay == "number" ? delay : 10000); - if (typeof segment == "function"){ - throw new YUITest.Wait(segment, delay); - } else { - throw new YUITest.Wait(function(){ - YUITest.Assert.fail("Timeout: wait() called but resume() never called."); - }, delay); - } - }, - - //------------------------------------------------------------------------- - // Assertion Methods - //------------------------------------------------------------------------- - - /** - * Asserts that a given condition is true. If not, then a YUITest.AssertionError object is thrown - * and the test fails. - * @method assert - * @param {Boolean} condition The condition to test. - * @param {String} message The message to display if the assertion fails. - */ - assert : function (condition, message){ - YUITest.Assert._increment(); - if (!condition){ - throw new YUITest.AssertionError(YUITest.Assert._formatMessage(message, "Assertion failed.")); - } - }, - - /** - * Forces an assertion error to occur. Shortcut for YUITest.Assert.fail(). - * @method fail - * @param {String} message (Optional) The message to display with the failure. - */ - fail: function (message) { - YUITest.Assert.fail(message); - }, - - //------------------------------------------------------------------------- - // Stub Methods - //------------------------------------------------------------------------- - - /** - * Function to run before each test is executed. - * @return {Void} - * @method setUp - */ - setUp : function () { - }, - - /** - * Function to run after each test is executed. - * @return {Void} - * @method tearDown - */ - tearDown: function () { - } -}; - - - -/** - * A test suite that can contain a collection of TestCase and TestSuite objects. - * @param {String||Object} data The name of the test suite or an object containing - * a name property as well as setUp and tearDown methods. - * @namespace YUITest - * @class TestSuite - * @constructor - */ -YUITest.TestSuite = function (data) { - - /** - * The name of the test suite. - * @type String - * @property name - */ - this.name = ""; - - /** - * Array of test suites and test cases. - * @type Array - * @property items - * @private - */ - this.items = []; - - //initialize the properties - if (typeof data == "string"){ - this.name = data; - } else if (data instanceof Object){ - for (var prop in data){ - if (data.hasOwnProperty(prop)){ - this[prop] = data[prop]; - } - } - } - - //double-check name - if (this.name === ""){ - this.name = "testSuite" + (+new Date()); - } - -}; - -YUITest.TestSuite.prototype = { - - //restore constructor - constructor: YUITest.TestSuite, - - /** - * Adds a test suite or test case to the test suite. - * @param {YUITest.TestSuite||YUITest.TestCase} testObject The test suite or test case to add. - * @return {Void} - * @method add - */ - add : function (testObject) { - if (testObject instanceof YUITest.TestSuite || testObject instanceof YUITest.TestCase) { - this.items.push(testObject); - } - return this; - }, - - //------------------------------------------------------------------------- - // Stub Methods - //------------------------------------------------------------------------- - - /** - * Function to run before each test is executed. - * @return {Void} - * @method setUp - */ - setUp : function () { - }, - - /** - * Function to run after each test is executed. - * @return {Void} - * @method tearDown - */ - tearDown: function () { - } - -}; - -/** - * An object object containing test result formatting methods. - * @namespace YUITest - * @class TestFormat - * @static - */ -YUITest.TestFormat = function(){ - - /* (intentionally not documented) - * Basic XML escaping method. Replaces quotes, less-than, greater-than, - * apostrophe, and ampersand characters with their corresponding entities. - * @param {String} text The text to encode. - * @return {String} The XML-escaped text. - */ - function xmlEscape(text){ - - return text.replace(/[<>"'&]/g, function(value){ - switch(value){ - case "<": return "<"; - case ">": return ">"; - case "\"": return """; - case "'": return "'"; - case "&": return "&"; - } - }); - - } - - - return { - - /** - * Returns test results formatted as a JSON string. Requires JSON utility. - * @param {Object} result The results object created by TestRunner. - * @return {String} A JSON-formatted string of results. - * @method JSON - * @static - */ - JSON: function(results) { - return YUITest.Util.JSON.stringify(results); - }, - - /** - * Returns test results formatted as an XML string. - * @param {Object} result The results object created by TestRunner. - * @return {String} An XML-formatted string of results. - * @method XML - * @static - */ - XML: function(results) { - - function serializeToXML(results){ - var xml = "<" + results.type + " name=\"" + xmlEscape(results.name) + "\""; - - if (typeof(results.duration)=="number"){ - xml += " duration=\"" + results.duration + "\""; - } - - if (results.type == "test"){ - xml += " result=\"" + results.result + "\" message=\"" + xmlEscape(results.message) + "\">"; - } else { - xml += " passed=\"" + results.passed + "\" failed=\"" + results.failed + "\" ignored=\"" + results.ignored + "\" total=\"" + results.total + "\">"; - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - xml += serializeToXML(results[prop]); - } - } - } - } - - xml += ""; - - return xml; - } - - return "" + serializeToXML(results); - - }, - - - /** - * Returns test results formatted in JUnit XML format. - * @param {Object} result The results object created by TestRunner. - * @return {String} An XML-formatted string of results. - * @method JUnitXML - * @static - */ - JUnitXML: function(results) { - - function serializeToJUnitXML(results){ - var xml = ""; - - switch (results.type){ - //equivalent to testcase in JUnit - case "test": - if (results.result != "ignore"){ - xml = ""; - if (results.result == "fail"){ - xml += ""; - } - xml+= ""; - } - break; - - //equivalent to testsuite in JUnit - case "testcase": - - xml = ""; - - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - xml += serializeToJUnitXML(results[prop]); - } - } - } - - xml += ""; - break; - - //no JUnit equivalent, don't output anything - case "testsuite": - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - xml += serializeToJUnitXML(results[prop]); - } - } - } - break; - - //top-level, equivalent to testsuites in JUnit - case "report": - - xml = ""; - - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - xml += serializeToJUnitXML(results[prop]); - } - } - } - - xml += ""; - - //no default - } - - return xml; - - } - - return "" + serializeToJUnitXML(results); - }, - - /** - * Returns test results formatted in TAP format. - * For more information, see Test Anything Protocol. - * @param {Object} result The results object created by TestRunner. - * @return {String} A TAP-formatted string of results. - * @method TAP - * @static - */ - TAP: function(results) { - - var currentTestNum = 1; - - function serializeToTAP(results){ - var text = ""; - - switch (results.type){ - - case "test": - if (results.result != "ignore"){ - - text = "ok " + (currentTestNum++) + " - " + results.name; - - if (results.result == "fail"){ - text = "not " + text + " - " + results.message; - } - - text += "\n"; - } else { - text = "#Ignored test " + results.name + "\n"; - } - break; - - case "testcase": - - text = "#Begin testcase " + results.name + "(" + results.failed + " failed of " + results.total + ")\n"; - - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - text += serializeToTAP(results[prop]); - } - } - } - - text += "#End testcase " + results.name + "\n"; - - - break; - - case "testsuite": - - text = "#Begin testsuite " + results.name + "(" + results.failed + " failed of " + results.total + ")\n"; - - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - text += serializeToTAP(results[prop]); - } - } - } - - text += "#End testsuite " + results.name + "\n"; - break; - - case "report": - - for (var prop in results){ - if (results.hasOwnProperty(prop)){ - if (results[prop] && typeof results[prop] == "object" && !(results[prop] instanceof Array)){ - text += serializeToTAP(results[prop]); - } - } - } - - //no default - } - - return text; - - } - - return "1.." + results.total + "\n" + serializeToTAP(results); - } - - }; -}(); - -/** - * An object object containing coverage result formatting methods. - * @namespace YUITest - * @class CoverageFormat - * @static - */ -YUITest.CoverageFormat = { - - /** - * Returns the coverage report in JSON format. This is the straight - * JSON representation of the native coverage report. - * @param {Object} coverage The coverage report object. - * @return {String} A JSON-formatted string of coverage data. - * @method JSON - * @namespace YUITest.CoverageFormat - */ - JSON: function(coverage){ - return YUITest.Util.JSON.stringify(coverage); - }, - - /** - * Returns the coverage report in a JSON format compatible with - * Xdebug. See Xdebug Documentation - * for more information. Note: function coverage is not available - * in this format. - * @param {Object} coverage The coverage report object. - * @return {String} A JSON-formatted string of coverage data. - * @method XdebugJSON - * @namespace YUITest.CoverageFormat - */ - XdebugJSON: function(coverage){ - - var report = {}; - for (var prop in coverage){ - if (coverage.hasOwnProperty(prop)){ - report[prop] = coverage[prop].lines; - } - } - - return YUITest.Util.JSON.stringify(coverage); - } - -}; - - -/** - * An object object containing methods to simulate browser events. - * @namespace YUITest - * @class Event - * @static - */ -YUITest.Event = (function() { - - var - - //mouse events supported - mouseEvents = { - click: 1, - dblclick: 1, - mouseover: 1, - mouseout: 1, - mousedown: 1, - mouseup: 1, - mousemove: 1 - }, - - //key events supported - keyEvents = { - keydown: 1, - keyup: 1, - keypress: 1 - }, - - //HTML events supported - uiEvents = { - blur: 1, - change: 1, - focus: 1, - resize: 1, - scroll: 1, - select: 1 - }, - - //events that bubble by default - bubbleEvents = { - scroll: 1, - resize: 1, - reset: 1, - submit: 1, - change: 1, - select: 1, - error: 1, - abort: 1, - - //also mouse events - click: 1, - dblclick: 1, - mouseover: 1, - mouseout: 1, - mousedown: 1, - mouseup: 1, - mousemove: 1, - - //and keyboard events - keydown: 1, - keyup: 1, - keypress: 1 - - }, - - //the object to return - object, - - //used for property name iteration - prop; - - /* - * Note: Intentionally not for YUIDoc generation. - * Simulates a key event using the given event information to populate - * the generated event object. This method does browser-equalizing - * calculations to account for differences in the DOM and IE event models - * as well as different browser quirks. Note: keydown causes Safari 2.x to - * crash. - * @method simulateKeyEvent - * @private - * @static - * @param {HTMLElement} target The target of the given event. - * @param {String} type The type of event to fire. This can be any one of - * the following: keyup, keydown, and keypress. - * @param {Boolean} bubbles (Optional) Indicates if the event can be - * bubbled up. DOM Level 3 specifies that all key events bubble by - * default. The default is true. - * @param {Boolean} cancelable (Optional) Indicates if the event can be - * canceled using preventDefault(). DOM Level 3 specifies that all - * key events can be cancelled. The default - * is true. - * @param {Window} view (Optional) The view containing the target. This is - * typically the window object. The default is window. - * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} metaKey (Optional) Indicates if one of the META keys - * is pressed while the event is firing. The default is false. - * @param {int} keyCode (Optional) The code for the key that is in use. - * The default is 0. - * @param {int} charCode (Optional) The Unicode code for the character - * associated with the key being used. The default is 0. - */ - function simulateKeyEvent(target /*:HTMLElement*/, type /*:String*/, - bubbles /*:Boolean*/, cancelable /*:Boolean*/, - view /*:Window*/, - ctrlKey /*:Boolean*/, altKey /*:Boolean*/, - shiftKey /*:Boolean*/, metaKey /*:Boolean*/, - keyCode /*:int*/, charCode /*:int*/) /*:Void*/ - { - //check target - if (!target){ - throw new Error("simulateKeyEvent(): Invalid target."); - } - - //check event type - if (typeof type == "string"){ - type = type.toLowerCase(); - switch(type){ - case "textevent": //DOM Level 3 - type = "keypress"; - break; - case "keyup": - case "keydown": - case "keypress": - break; - default: - throw new Error("simulateKeyEvent(): Event type '" + type + "' not supported."); - } - } else { - throw new Error("simulateKeyEvent(): Event type must be a string."); - } - - //setup default values - if (typeof bubbles != "boolean"){ - bubbles = true; //all key events bubble - } - if (typeof cancelable != "boolean"){ - cancelable = true; //all key events can be cancelled - } - if (typeof view != "object" || view == null){ - view = window; //view is typically window - } - if (typeof ctrlKey != "boolean"){ - ctrlKey = false; - } - if (typeof altKey != "boolean"){ - altKey = false; - } - if (typeof shiftKey != "boolean"){ - shiftKey = false; - } - if (typeof metaKey != "boolean"){ - metaKey = false; - } - if (typeof keyCode != "number"){ - keyCode = 0; - } - if (typeof charCode != "number"){ - charCode = 0; - } - - //try to create a mouse event - var customEvent = null; - - //check for DOM-compliant browsers first - if (typeof document.createEvent == "function"){ - - try { - - //try to create key event - customEvent = document.createEvent("KeyEvents"); - - /* - * Interesting problem: Firefox implemented a non-standard - * version of initKeyEvent() based on DOM Level 2 specs. - * Key event was removed from DOM Level 2 and re-introduced - * in DOM Level 3 with a different interface. Firefox is the - * only browser with any implementation of Key Events, so for - * now, assume it's Firefox if the above line doesn't error. - */ - // @TODO: Decipher between Firefox's implementation and a correct one. - customEvent.initKeyEvent(type, bubbles, cancelable, view, ctrlKey, - altKey, shiftKey, metaKey, keyCode, charCode); - - } catch (ex){ - - /* - * If it got here, that means key events aren't officially supported. - * Safari/WebKit is a real problem now. WebKit 522 won't let you - * set keyCode, charCode, or other properties if you use a - * UIEvent, so we first must try to create a generic event. The - * fun part is that this will throw an error on Safari 2.x. The - * end result is that we need another try...catch statement just to - * deal with this mess. - */ - try { - - //try to create generic event - will fail in Safari 2.x - customEvent = document.createEvent("Events"); - - } catch (uierror /*:Error*/){ - - //the above failed, so create a UIEvent for Safari 2.x - customEvent = document.createEvent("UIEvents"); - - } finally { - - customEvent.initEvent(type, bubbles, cancelable); - - //initialize - customEvent.view = view; - customEvent.altKey = altKey; - customEvent.ctrlKey = ctrlKey; - customEvent.shiftKey = shiftKey; - customEvent.metaKey = metaKey; - customEvent.keyCode = keyCode; - customEvent.charCode = charCode; - - } - - } - - //fire the event - target.dispatchEvent(customEvent); - - } else if (typeof document.createEventObject != "undefined"){ //IE - - //create an IE event object - customEvent = document.createEventObject(); - - //assign available properties - customEvent.bubbles = bubbles; - customEvent.cancelable = cancelable; - customEvent.view = view; - customEvent.ctrlKey = ctrlKey; - customEvent.altKey = altKey; - customEvent.shiftKey = shiftKey; - customEvent.metaKey = metaKey; - - /* - * IE doesn't support charCode explicitly. CharCode should - * take precedence over any keyCode value for accurate - * representation. - */ - customEvent.keyCode = (charCode > 0) ? charCode : keyCode; - - //fire the event - target.fireEvent("on" + type, customEvent); - - } else { - throw new Error("simulateKeyEvent(): No event simulation framework present."); - } - } - - /* - * Note: Intentionally not for YUIDoc generation. - * Simulates a mouse event using the given event information to populate - * the generated event object. This method does browser-equalizing - * calculations to account for differences in the DOM and IE event models - * as well as different browser quirks. - * @method simulateMouseEvent - * @private - * @static - * @param {HTMLElement} target The target of the given event. - * @param {String} type The type of event to fire. This can be any one of - * the following: click, dblclick, mousedown, mouseup, mouseout, - * mouseover, and mousemove. - * @param {Boolean} bubbles (Optional) Indicates if the event can be - * bubbled up. DOM Level 2 specifies that all mouse events bubble by - * default. The default is true. - * @param {Boolean} cancelable (Optional) Indicates if the event can be - * canceled using preventDefault(). DOM Level 2 specifies that all - * mouse events except mousemove can be cancelled. The default - * is true for all events except mousemove, for which the default - * is false. - * @param {Window} view (Optional) The view containing the target. This is - * typically the window object. The default is window. - * @param {int} detail (Optional) The number of times the mouse button has - * been used. The default value is 1. - * @param {int} screenX (Optional) The x-coordinate on the screen at which - * point the event occured. The default is 0. - * @param {int} screenY (Optional) The y-coordinate on the screen at which - * point the event occured. The default is 0. - * @param {int} clientX (Optional) The x-coordinate on the client at which - * point the event occured. The default is 0. - * @param {int} clientY (Optional) The y-coordinate on the client at which - * point the event occured. The default is 0. - * @param {Boolean} ctrlKey (Optional) Indicates if one of the CTRL keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} altKey (Optional) Indicates if one of the ALT keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} shiftKey (Optional) Indicates if one of the SHIFT keys - * is pressed while the event is firing. The default is false. - * @param {Boolean} metaKey (Optional) Indicates if one of the META keys - * is pressed while the event is firing. The default is false. - * @param {int} button (Optional) The button being pressed while the event - * is executing. The value should be 0 for the primary mouse button - * (typically the left button), 1 for the terciary mouse button - * (typically the middle button), and 2 for the secondary mouse button - * (typically the right button). The default is 0. - * @param {HTMLElement} relatedTarget (Optional) For mouseout events, - * this is the element that the mouse has moved to. For mouseover - * events, this is the element that the mouse has moved from. This - * argument is ignored for all other events. The default is null. - */ - function simulateMouseEvent(target /*:HTMLElement*/, type /*:String*/, - bubbles /*:Boolean*/, cancelable /*:Boolean*/, - view /*:Window*/, detail /*:int*/, - screenX /*:int*/, screenY /*:int*/, - clientX /*:int*/, clientY /*:int*/, - ctrlKey /*:Boolean*/, altKey /*:Boolean*/, - shiftKey /*:Boolean*/, metaKey /*:Boolean*/, - button /*:int*/, relatedTarget /*:HTMLElement*/) /*:Void*/ - { - - //check target - if (!target){ - throw new Error("simulateMouseEvent(): Invalid target."); - } - - //check event type - if (typeof type == "string"){ - type = type.toLowerCase(); - - //make sure it's a supported mouse event - if (!mouseEvents[type]){ - throw new Error("simulateMouseEvent(): Event type '" + type + "' not supported."); - } - } else { - throw new Error("simulateMouseEvent(): Event type must be a string."); - } - - //setup default values - if (typeof bubbles != "boolean"){ - bubbles = true; //all mouse events bubble - } - if (typeof cancelable != "boolean"){ - cancelable = (type != "mousemove"); //mousemove is the only one that can't be cancelled - } - if (typeof view != "object" || view != null){ - view = window; //view is typically window - } - if (typeof detail != "number"){ - detail = 1; //number of mouse clicks must be at least one - } - if (typeof screenX != "number"){ - screenX = 0; - } - if (typeof screenY != "number"){ - screenY = 0; - } - if (typeof clientX != "number"){ - clientX = 0; - } - if (typeof clientY != "number"){ - clientY = 0; - } - if (typeof ctrlKey != "boolean"){ - ctrlKey = false; - } - if (typeof altKey != "boolean"){ - altKey = false; - } - if (typeof shiftKey != "boolean"){ - shiftKey = false; - } - if (typeof metaKey != "boolean"){ - metaKey = false; - } - if (typeof button != "number"){ - button = 0; - } - - //try to create a mouse event - var customEvent /*:MouseEvent*/ = null; - - //check for DOM-compliant browsers first - if (typeof document.createEvent == "function"){ - - customEvent = document.createEvent("MouseEvents"); - - //Safari 2.x (WebKit 418) still doesn't implement initMouseEvent() - if (customEvent.initMouseEvent){ - customEvent.initMouseEvent(type, bubbles, cancelable, view, detail, - screenX, screenY, clientX, clientY, - ctrlKey, altKey, shiftKey, metaKey, - button, relatedTarget); - } else { //Safari - - //the closest thing available in Safari 2.x is UIEvents - customEvent = document.createEvent("UIEvents"); - customEvent.initEvent(type, bubbles, cancelable); - customEvent.view = view; - customEvent.detail = detail; - customEvent.screenX = screenX; - customEvent.screenY = screenY; - customEvent.clientX = clientX; - customEvent.clientY = clientY; - customEvent.ctrlKey = ctrlKey; - customEvent.altKey = altKey; - customEvent.metaKey = metaKey; - customEvent.shiftKey = shiftKey; - customEvent.button = button; - customEvent.relatedTarget = relatedTarget; - } - - /* - * Check to see if relatedTarget has been assigned. Firefox - * versions less than 2.0 don't allow it to be assigned via - * initMouseEvent() and the property is readonly after event - * creation, so in order to keep YAHOO.util.getRelatedTarget() - * working, assign to the IE proprietary toElement property - * for mouseout event and fromElement property for mouseover - * event. - */ - if (relatedTarget && !customEvent.relatedTarget){ - if (type == "mouseout"){ - customEvent.toElement = relatedTarget; - } else if (type == "mouseover"){ - customEvent.fromElement = relatedTarget; - } - } - - //fire the event - target.dispatchEvent(customEvent); - - } else if (typeof document.createEventObject != "undefined"){ //IE - - //create an IE event object - customEvent = document.createEventObject(); - - //assign available properties - customEvent.bubbles = bubbles; - customEvent.cancelable = cancelable; - customEvent.view = view; - customEvent.detail = detail; - customEvent.screenX = screenX; - customEvent.screenY = screenY; - customEvent.clientX = clientX; - customEvent.clientY = clientY; - customEvent.ctrlKey = ctrlKey; - customEvent.altKey = altKey; - customEvent.metaKey = metaKey; - customEvent.shiftKey = shiftKey; - - //fix button property for IE's wacky implementation - switch(button){ - case 0: - customEvent.button = 1; - break; - case 1: - customEvent.button = 4; - break; - case 2: - //leave as is - break; - default: - customEvent.button = 0; - } - - /* - * Have to use relatedTarget because IE won't allow assignment - * to toElement or fromElement on generic events. This keeps - * YAHOO.util.customEvent.getRelatedTarget() functional. - */ - customEvent.relatedTarget = relatedTarget; - - //fire the event - target.fireEvent("on" + type, customEvent); - - } else { - throw new Error("simulateMouseEvent(): No event simulation framework present."); - } - } - - /* - * Note: Intentionally not for YUIDoc generation. - * Simulates a UI event using the given event information to populate - * the generated event object. This method does browser-equalizing - * calculations to account for differences in the DOM and IE event models - * as well as different browser quirks. - * @method simulateHTMLEvent - * @private - * @static - * @param {HTMLElement} target The target of the given event. - * @param {String} type The type of event to fire. This can be any one of - * the following: click, dblclick, mousedown, mouseup, mouseout, - * mouseover, and mousemove. - * @param {Boolean} bubbles (Optional) Indicates if the event can be - * bubbled up. DOM Level 2 specifies that all mouse events bubble by - * default. The default is true. - * @param {Boolean} cancelable (Optional) Indicates if the event can be - * canceled using preventDefault(). DOM Level 2 specifies that all - * mouse events except mousemove can be cancelled. The default - * is true for all events except mousemove, for which the default - * is false. - * @param {Window} view (Optional) The view containing the target. This is - * typically the window object. The default is window. - * @param {int} detail (Optional) The number of times the mouse button has - * been used. The default value is 1. - */ - function simulateUIEvent(target /*:HTMLElement*/, type /*:String*/, - bubbles /*:Boolean*/, cancelable /*:Boolean*/, - view /*:Window*/, detail /*:int*/) /*:Void*/ - { - - //check target - if (!target){ - throw new Error("simulateUIEvent(): Invalid target."); - } - - //check event type - if (typeof type == "string"){ - type = type.toLowerCase(); - - //make sure it's a supported mouse event - if (!uiEvents[type]){ - throw new Error("simulateUIEvent(): Event type '" + type + "' not supported."); - } - } else { - throw new Error("simulateUIEvent(): Event type must be a string."); - } - - //try to create a mouse event - var customEvent = null; - - - //setup default values - if (typeof bubbles != "boolean"){ - bubbles = (type in bubbleEvents); //not all events bubble - } - if (typeof cancelable != "boolean"){ - cancelable = (type == "submit"); //submit is the only one that can be cancelled - } - if (typeof view != "object" || view != null){ - view = window; //view is typically window - } - if (typeof detail != "number"){ - detail = 1; //usually not used but defaulted to this - } - - //check for DOM-compliant browsers first - if (typeof document.createEvent == "function"){ - - //just a generic UI Event object is needed - customEvent = document.createEvent("UIEvents"); - customEvent.initUIEvent(type, bubbles, cancelable, view, detail); - - //fire the event - target.dispatchEvent(customEvent); - - } else if (typeof document.createEventObject != "undefined"){ //IE - - //create an IE event object - customEvent = document.createEventObject(); - - //assign available properties - customEvent.bubbles = bubbles; - customEvent.cancelable = cancelable; - customEvent.view = view; - customEvent.detail = detail; - - //fire the event - target.fireEvent("on" + type, customEvent); - - } else { - throw new Error("simulateUIEvent(): No event simulation framework present."); - } - } - - - /** - * Allows event simulation for browser-based events. - * @namespace YUITest - * @class Event - * @static - */ - object = { - - /** - * Simulates the event with the given name on a target. - * @param {HTMLElement} target The DOM element that's the target of the event. - * @param {String} type The type of event to simulate (i.e., "click"). - * @param {Object} options (Optional) Extra options to copy onto the event object. - * @return {void} - * @method simulate - * @static - * @deprecated - */ - simulate: function(target, type, options){ - - options = options || {}; - - if (mouseEvents[type]){ - simulateMouseEvent(target, type, options.bubbles, - options.cancelable, options.view, options.detail, options.screenX, - options.screenY, options.clientX, options.clientY, options.ctrlKey, - options.altKey, options.shiftKey, options.metaKey, options.button, - options.relatedTarget); - } else if (keyEvents[type]){ - simulateKeyEvent(target, type, options.bubbles, - options.cancelable, options.view, options.ctrlKey, - options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode); - } else if (uiEvents[type]){ - simulateUIEvent(target, type, options.bubbles, - options.cancelable, options.view, options.detail); - } else { - throw new Error("simulate(): Event '" + type + "' can't be simulated."); - } - } - }; - - //create the convenience methods for mouse events - for (prop in mouseEvents){ - if (mouseEvents.hasOwnProperty(prop)){ - object[prop] = (function(type){ - return function(target, options){ - options = options || {}; - simulateMouseEvent(target, type, options.bubbles, - options.cancelable, options.view, options.detail, options.screenX, - options.screenY, options.clientX, options.clientY, options.ctrlKey, - options.altKey, options.shiftKey, options.metaKey, options.button, - options.relatedTarget); - }; - })(prop); - } - } - - //create the convenience methods for key events - for (prop in keyEvents){ - if (keyEvents.hasOwnProperty(prop)){ - object[prop] = (function(type){ - return function(target, options){ - options = options || {}; - simulateKeyEvent(target, type, options.bubbles, - options.cancelable, options.view, options.ctrlKey, - options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode); - }; - })(prop); - } - } - - //create the convenience methods for key events - for (prop in uiEvents){ - if (uiEvents.hasOwnProperty(prop)){ - object[prop] = (function(type){ - return function(target, options){ - options = options || {}; - simulateUIEvent(target, type, options.bubbles, - options.cancelable, options.view, options.detail); - }; - })(prop); - } - } - - return object; - -})(); - - - /** - * An object capable of sending test results to a server. - * @param {String} url The URL to submit the results to. - * @param {Function} format (Optiona) A function that outputs the results in a specific format. - * Default is YUITest.TestFormat.XML. - * @constructor - * @namespace YUITest - * @class Reporter - */ - YUITest.Reporter = function(url, format) { - - /** - * The URL to submit the data to. - * @type String - * @property url - */ - this.url = url; - - /** - * The formatting function to call when submitting the data. - * @type Function - * @property format - */ - this.format = format || Y.Test.Format.XML; - - /** - * Extra fields to submit with the request. - * @type Object - * @property _fields - * @private - */ - this._fields = new Object(); - - /** - * The form element used to submit the results. - * @type HTMLFormElement - * @property _form - * @private - */ - this._form = null; - - /** - * Iframe used as a target for form submission. - * @type HTMLIFrameElement - * @property _iframe - * @private - */ - this._iframe = null; - }; - - YUITest.Reporter.prototype = { - - //restore missing constructor - constructor: YUITest.Reporter, - - /** - * Adds a field to the form that submits the results. - * @param {String} name The name of the field. - * @param {Variant} value The value of the field. - * @return {Void} - * @method addField - */ - addField : function (name, value){ - this._fields[name] = value; - }, - - /** - * Removes all previous defined fields. - * @return {Void} - * @method addField - */ - clearFields : function(){ - this._fields = new Object(); - }, - - /** - * Cleans up the memory associated with the TestReporter, removing DOM elements - * that were created. - * @return {Void} - * @method destroy - */ - destroy : function() { - if (this._form){ - this._form.parentNode.removeChild(this._form); - this._form = null; - } - if (this._iframe){ - this._iframe.parentNode.removeChild(this._iframe); - this._iframe = null; - } - this._fields = null; - }, - - /** - * Sends the report to the server. - * @param {Object} results The results object created by TestRunner. - * @return {Void} - * @method report - */ - report : function(results){ - - //if the form hasn't been created yet, create it - if (!this._form){ - this._form = document.createElement("form"); - this._form.method = "post"; - this._form.style.visibility = "hidden"; - this._form.style.position = "absolute"; - this._form.style.top = 0; - document.body.appendChild(this._form); - - //IE won't let you assign a name using the DOM, must do it the hacky way - try { - this._iframe = document.createElement("