@supernal/interface 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +165 -0
- package/dist/cjs/names/API.js +104 -0
- package/dist/cjs/names/API.js.map +1 -0
- package/dist/cjs/names/Components.js +104 -0
- package/dist/cjs/names/Components.js.map +1 -0
- package/dist/cjs/names/Containers.js +99 -0
- package/dist/cjs/names/Containers.js.map +1 -0
- package/dist/cjs/names/Functions.js +114 -0
- package/dist/cjs/names/Functions.js.map +1 -0
- package/dist/cjs/names/index.js +118 -0
- package/dist/cjs/names/index.js.map +1 -0
- package/dist/cjs/src/adapters/ChatUIProvider.js +176 -0
- package/dist/cjs/src/adapters/ChatUIProvider.js.map +1 -0
- package/dist/cjs/src/adapters/bridge.js +225 -0
- package/dist/cjs/src/adapters/bridge.js.map +1 -0
- package/dist/cjs/src/adapters/copilotkit/CopilotKitAdapter.js +289 -0
- package/dist/cjs/src/adapters/copilotkit/CopilotKitAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/copilotkit/index.js +10 -0
- package/dist/cjs/src/adapters/copilotkit/index.js.map +1 -0
- package/dist/cjs/src/adapters/index.js +63 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/adapters/native/NativeAdapter.js +268 -0
- package/dist/cjs/src/adapters/native/NativeAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/native/index.js +10 -0
- package/dist/cjs/src/adapters/native/index.js.map +1 -0
- package/dist/cjs/src/adapters/types/index.js +9 -0
- package/dist/cjs/src/adapters/types/index.js.map +1 -0
- package/dist/cjs/src/ai/ToolExecutor.js +211 -0
- package/dist/cjs/src/ai/ToolExecutor.js.map +1 -0
- package/dist/cjs/src/ai/ToolMatcher.js +202 -0
- package/dist/cjs/src/ai/ToolMatcher.js.map +1 -0
- package/dist/cjs/src/ai/index.js +29 -0
- package/dist/cjs/src/ai/index.js.map +1 -0
- package/dist/cjs/src/architecture/createContainer.js +106 -0
- package/dist/cjs/src/architecture/createContainer.js.map +1 -0
- package/dist/cjs/src/architecture/initialize.js +125 -0
- package/dist/cjs/src/architecture/initialize.js.map +1 -0
- package/dist/cjs/src/architecture/registry.js +111 -0
- package/dist/cjs/src/architecture/registry.js.map +1 -0
- package/dist/cjs/src/background/architecture/ArchitectureInitializer.js +174 -0
- package/dist/cjs/src/background/architecture/ArchitectureInitializer.js.map +1 -0
- package/dist/cjs/src/background/architecture/Containers.js +46 -0
- package/dist/cjs/src/background/architecture/Containers.js.map +1 -0
- package/dist/cjs/src/background/architecture/DataContractTypes.js +28 -0
- package/dist/cjs/src/background/architecture/DataContractTypes.js.map +1 -0
- package/dist/cjs/src/background/architecture/index.js +24 -0
- package/dist/cjs/src/background/architecture/index.js.map +1 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js +71 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -0
- package/dist/cjs/src/background/navigation/RuntimeTreeBuilder.js +66 -0
- package/dist/cjs/src/background/navigation/RuntimeTreeBuilder.js.map +1 -0
- package/dist/cjs/src/background/navigation/useComponentTracking.js +20 -0
- package/dist/cjs/src/background/navigation/useComponentTracking.js.map +1 -0
- package/dist/cjs/src/background/registry/ComponentRegistry.js +340 -0
- package/dist/cjs/src/background/registry/ComponentRegistry.js.map +1 -0
- package/dist/cjs/src/background/registry/ToolRegistry.js +668 -0
- package/dist/cjs/src/background/registry/ToolRegistry.js.map +1 -0
- package/dist/cjs/src/browser.js +70 -0
- package/dist/cjs/src/browser.js.map +1 -0
- package/dist/cjs/src/components/ComponentScanner.js +362 -0
- package/dist/cjs/src/components/ComponentScanner.js.map +1 -0
- package/dist/cjs/src/components/index.js +24 -0
- package/dist/cjs/src/components/index.js.map +1 -0
- package/dist/cjs/src/data/TestDataManager.js +187 -0
- package/dist/cjs/src/data/TestDataManager.js.map +1 -0
- package/dist/cjs/src/data/index.js +23 -0
- package/dist/cjs/src/data/index.js.map +1 -0
- package/dist/cjs/src/decorators/Component.js +108 -0
- package/dist/cjs/src/decorators/Component.js.map +1 -0
- package/dist/cjs/src/decorators/ContainerHelpers.js +45 -0
- package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -0
- package/dist/cjs/src/decorators/SpecializedTools.js +386 -0
- package/dist/cjs/src/decorators/SpecializedTools.js.map +1 -0
- package/dist/cjs/src/decorators/Tool.js +700 -0
- package/dist/cjs/src/decorators/Tool.js.map +1 -0
- package/dist/cjs/src/decorators/ToolHelpers.js +261 -0
- package/dist/cjs/src/decorators/ToolHelpers.js.map +1 -0
- package/dist/cjs/src/decorators/ToolPreset.js +270 -0
- package/dist/cjs/src/decorators/ToolPreset.js.map +1 -0
- package/dist/cjs/src/decorators/ToolProvider.js +86 -0
- package/dist/cjs/src/decorators/ToolProvider.js.map +1 -0
- package/dist/cjs/src/decorators/index.js +44 -0
- package/dist/cjs/src/decorators/index.js.map +1 -0
- package/dist/cjs/src/execution/DOMExecutor.js +233 -0
- package/dist/cjs/src/execution/DOMExecutor.js.map +1 -0
- package/dist/cjs/src/execution/PlaywrightExecutor.js +196 -0
- package/dist/cjs/src/execution/PlaywrightExecutor.js.map +1 -0
- package/dist/cjs/src/exposure/ExposureCollector.js +358 -0
- package/dist/cjs/src/exposure/ExposureCollector.js.map +1 -0
- package/dist/cjs/src/exposure/index.js +26 -0
- package/dist/cjs/src/exposure/index.js.map +1 -0
- package/dist/cjs/src/index.js +187 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/interfaces/StatefulComponent.js +50 -0
- package/dist/cjs/src/interfaces/StatefulComponent.js.map +1 -0
- package/dist/cjs/src/name-contracts/ContractScanner.js +15 -0
- package/dist/cjs/src/name-contracts/ContractScanner.js.map +1 -0
- package/dist/cjs/src/name-contracts/RouteContractScanner.js +225 -0
- package/dist/cjs/src/name-contracts/RouteContractScanner.js.map +1 -0
- package/dist/cjs/src/name-contracts/index.js +15 -0
- package/dist/cjs/src/name-contracts/index.js.map +1 -0
- package/dist/cjs/src/names/createNames.js +86 -0
- package/dist/cjs/src/names/createNames.js.map +1 -0
- package/dist/cjs/src/react/hooks/useChatWithContext.js +221 -0
- package/dist/cjs/src/react/hooks/useChatWithContext.js.map +1 -0
- package/dist/cjs/src/react/index.js +28 -0
- package/dist/cjs/src/react/index.js.map +1 -0
- package/dist/cjs/src/react/useNavigationHandler.js +88 -0
- package/dist/cjs/src/react/useNavigationHandler.js.map +1 -0
- package/dist/cjs/src/react/usePersistedState.js +72 -0
- package/dist/cjs/src/react/usePersistedState.js.map +1 -0
- package/dist/cjs/src/react/useToolBinding.js +110 -0
- package/dist/cjs/src/react/useToolBinding.js.map +1 -0
- package/dist/cjs/src/routes/RouteContractGenerator.js +119 -0
- package/dist/cjs/src/routes/RouteContractGenerator.js.map +1 -0
- package/dist/cjs/src/routes/RouteContractsConfig.js +39 -0
- package/dist/cjs/src/routes/RouteContractsConfig.js.map +1 -0
- package/dist/cjs/src/routes/index.js +20 -0
- package/dist/cjs/src/routes/index.js.map +1 -0
- package/dist/cjs/src/routes/scanners/NameExtractor.js +193 -0
- package/dist/cjs/src/routes/scanners/NameExtractor.js.map +1 -0
- package/dist/cjs/src/routes/scanners/NextjsDynamicScanner.js +102 -0
- package/dist/cjs/src/routes/scanners/NextjsDynamicScanner.js.map +1 -0
- package/dist/cjs/src/routes/scanners/RouteScanner.js +13 -0
- package/dist/cjs/src/routes/scanners/RouteScanner.js.map +1 -0
- package/dist/cjs/src/storage/LocalStorageAdapter.js +87 -0
- package/dist/cjs/src/storage/LocalStorageAdapter.js.map +1 -0
- package/dist/cjs/src/storage/StateManager.js +299 -0
- package/dist/cjs/src/storage/StateManager.js.map +1 -0
- package/dist/cjs/src/storage/StorageAdapter.js +164 -0
- package/dist/cjs/src/storage/StorageAdapter.js.map +1 -0
- package/dist/cjs/src/storage/index.js +37 -0
- package/dist/cjs/src/storage/index.js.map +1 -0
- package/dist/cjs/src/testing/BrowserStateInjection.js +130 -0
- package/dist/cjs/src/testing/BrowserStateInjection.js.map +1 -0
- package/dist/cjs/src/testing/ComponentStateHelpers.js +200 -0
- package/dist/cjs/src/testing/ComponentStateHelpers.js.map +1 -0
- package/dist/cjs/src/testing/GherkinParser.js +252 -0
- package/dist/cjs/src/testing/GherkinParser.js.map +1 -0
- package/dist/cjs/src/testing/PlaywrightStateHelpers.js +254 -0
- package/dist/cjs/src/testing/PlaywrightStateHelpers.js.map +1 -0
- package/dist/cjs/src/testing/TestRunner.js +158 -0
- package/dist/cjs/src/testing/TestRunner.js.map +1 -0
- package/dist/cjs/src/testing/index.js +46 -0
- package/dist/cjs/src/testing/index.js.map +1 -0
- package/dist/cjs/src/testing/selectors.js +84 -0
- package/dist/cjs/src/testing/selectors.js.map +1 -0
- package/dist/cjs/src/tools/SystemTools.js +262 -0
- package/dist/cjs/src/tools/SystemTools.js.map +1 -0
- package/dist/cjs/src/types/ClassifiedTool.js +50 -0
- package/dist/cjs/src/types/ClassifiedTool.js.map +1 -0
- package/dist/cjs/src/types/ComponentState.js +30 -0
- package/dist/cjs/src/types/ComponentState.js.map +1 -0
- package/dist/cjs/src/types/DiscoverableToolProvider.js +9 -0
- package/dist/cjs/src/types/DiscoverableToolProvider.js.map +1 -0
- package/dist/cjs/src/types/ExposureState.js +25 -0
- package/dist/cjs/src/types/ExposureState.js.map +1 -0
- package/dist/cjs/src/types/NavigationGraph.js +8 -0
- package/dist/cjs/src/types/NavigationGraph.js.map +1 -0
- package/dist/cjs/src/types/OperationType.js +49 -0
- package/dist/cjs/src/types/OperationType.js.map +1 -0
- package/dist/cjs/src/types/StateManagers.js +39 -0
- package/dist/cjs/src/types/StateManagers.js.map +1 -0
- package/dist/cjs/src/types/Tool.js +41 -0
- package/dist/cjs/src/types/Tool.js.map +1 -0
- package/dist/cjs/src/types/ToolPermissions.js +54 -0
- package/dist/cjs/src/types/ToolPermissions.js.map +1 -0
- package/dist/cjs/src/types/ToolResult.js +25 -0
- package/dist/cjs/src/types/ToolResult.js.map +1 -0
- package/dist/cjs/src/types/index.js +59 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/cjs/src/ui/react/chat/ChatBubble.js +221 -0
- package/dist/cjs/src/ui/react/chat/ChatBubble.js.map +1 -0
- package/dist/esm/names/API.d.ts +77 -0
- package/dist/esm/names/API.d.ts.map +1 -0
- package/dist/esm/names/API.js +99 -0
- package/dist/esm/names/API.js.map +1 -0
- package/dist/esm/names/Components.d.ts +77 -0
- package/dist/esm/names/Components.d.ts.map +1 -0
- package/dist/esm/names/Components.js +99 -0
- package/dist/esm/names/Components.js.map +1 -0
- package/dist/esm/names/Containers.d.ts +84 -0
- package/dist/esm/names/Containers.d.ts.map +1 -0
- package/dist/esm/names/Containers.js +94 -0
- package/dist/esm/names/Containers.js.map +1 -0
- package/dist/esm/names/Functions.d.ts +87 -0
- package/dist/esm/names/Functions.d.ts.map +1 -0
- package/dist/esm/names/Functions.js +109 -0
- package/dist/esm/names/Functions.js.map +1 -0
- package/dist/esm/names/index.d.ts +187 -0
- package/dist/esm/names/index.d.ts.map +1 -0
- package/dist/esm/names/index.js +99 -0
- package/dist/esm/names/index.js.map +1 -0
- package/dist/esm/src/adapters/ChatUIProvider.d.ts +76 -0
- package/dist/esm/src/adapters/ChatUIProvider.d.ts.map +1 -0
- package/dist/esm/src/adapters/ChatUIProvider.js +136 -0
- package/dist/esm/src/adapters/ChatUIProvider.js.map +1 -0
- package/dist/esm/src/adapters/bridge.d.ts +145 -0
- package/dist/esm/src/adapters/bridge.d.ts.map +1 -0
- package/dist/esm/src/adapters/bridge.js +218 -0
- package/dist/esm/src/adapters/bridge.js.map +1 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.d.ts +49 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.d.ts.map +1 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.js +251 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.js.map +1 -0
- package/dist/esm/src/adapters/copilotkit/index.d.ts +6 -0
- package/dist/esm/src/adapters/copilotkit/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/copilotkit/index.js +5 -0
- package/dist/esm/src/adapters/copilotkit/index.js.map +1 -0
- package/dist/esm/src/adapters/index.d.ts +31 -0
- package/dist/esm/src/adapters/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/index.js +32 -0
- package/dist/esm/src/adapters/index.js.map +1 -0
- package/dist/esm/src/adapters/native/NativeAdapter.d.ts +47 -0
- package/dist/esm/src/adapters/native/NativeAdapter.d.ts.map +1 -0
- package/dist/esm/src/adapters/native/NativeAdapter.js +230 -0
- package/dist/esm/src/adapters/native/NativeAdapter.js.map +1 -0
- package/dist/esm/src/adapters/native/index.d.ts +6 -0
- package/dist/esm/src/adapters/native/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/native/index.js +5 -0
- package/dist/esm/src/adapters/native/index.js.map +1 -0
- package/dist/esm/src/adapters/types/index.d.ts +155 -0
- package/dist/esm/src/adapters/types/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/types/index.js +8 -0
- package/dist/esm/src/adapters/types/index.js.map +1 -0
- package/dist/esm/src/ai/ToolExecutor.d.ts +49 -0
- package/dist/esm/src/ai/ToolExecutor.d.ts.map +1 -0
- package/dist/esm/src/ai/ToolExecutor.js +174 -0
- package/dist/esm/src/ai/ToolExecutor.js.map +1 -0
- package/dist/esm/src/ai/ToolMatcher.d.ts +61 -0
- package/dist/esm/src/ai/ToolMatcher.d.ts.map +1 -0
- package/dist/esm/src/ai/ToolMatcher.js +198 -0
- package/dist/esm/src/ai/ToolMatcher.js.map +1 -0
- package/dist/esm/src/ai/index.d.ts +9 -0
- package/dist/esm/src/ai/index.d.ts.map +1 -0
- package/dist/esm/src/ai/index.js +13 -0
- package/dist/esm/src/ai/index.js.map +1 -0
- package/dist/esm/src/architecture/createContainer.d.ts +60 -0
- package/dist/esm/src/architecture/createContainer.d.ts.map +1 -0
- package/dist/esm/src/architecture/createContainer.js +102 -0
- package/dist/esm/src/architecture/createContainer.js.map +1 -0
- package/dist/esm/src/architecture/initialize.d.ts +81 -0
- package/dist/esm/src/architecture/initialize.d.ts.map +1 -0
- package/dist/esm/src/architecture/initialize.js +121 -0
- package/dist/esm/src/architecture/initialize.js.map +1 -0
- package/dist/esm/src/architecture/registry.d.ts +61 -0
- package/dist/esm/src/architecture/registry.d.ts.map +1 -0
- package/dist/esm/src/architecture/registry.js +107 -0
- package/dist/esm/src/architecture/registry.js.map +1 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.d.ts +95 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.js +170 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.js.map +1 -0
- package/dist/esm/src/background/architecture/Containers.d.ts +52 -0
- package/dist/esm/src/background/architecture/Containers.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/Containers.js +40 -0
- package/dist/esm/src/background/architecture/Containers.js.map +1 -0
- package/dist/esm/src/background/architecture/DataContractTypes.d.ts +33 -0
- package/dist/esm/src/background/architecture/DataContractTypes.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/DataContractTypes.js +22 -0
- package/dist/esm/src/background/architecture/DataContractTypes.js.map +1 -0
- package/dist/esm/src/background/architecture/index.d.ts +12 -0
- package/dist/esm/src/background/architecture/index.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/index.js +13 -0
- package/dist/esm/src/background/architecture/index.js.map +1 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts +48 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js +67 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.d.ts +30 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.js +60 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.js.map +1 -0
- package/dist/esm/src/background/navigation/useComponentTracking.d.ts +10 -0
- package/dist/esm/src/background/navigation/useComponentTracking.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/useComponentTracking.js +17 -0
- package/dist/esm/src/background/navigation/useComponentTracking.js.map +1 -0
- package/dist/esm/src/background/registry/ComponentRegistry.d.ts +192 -0
- package/dist/esm/src/background/registry/ComponentRegistry.d.ts.map +1 -0
- package/dist/esm/src/background/registry/ComponentRegistry.js +336 -0
- package/dist/esm/src/background/registry/ComponentRegistry.js.map +1 -0
- package/dist/esm/src/background/registry/ToolRegistry.d.ts +232 -0
- package/dist/esm/src/background/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/esm/src/background/registry/ToolRegistry.js +664 -0
- package/dist/esm/src/background/registry/ToolRegistry.js.map +1 -0
- package/dist/esm/src/browser.d.ts +21 -0
- package/dist/esm/src/browser.d.ts.map +1 -0
- package/dist/esm/src/browser.js +31 -0
- package/dist/esm/src/browser.js.map +1 -0
- package/dist/esm/src/components/ComponentScanner.d.ts +99 -0
- package/dist/esm/src/components/ComponentScanner.d.ts.map +1 -0
- package/dist/esm/src/components/ComponentScanner.js +325 -0
- package/dist/esm/src/components/ComponentScanner.js.map +1 -0
- package/dist/esm/src/components/index.d.ts +9 -0
- package/dist/esm/src/components/index.d.ts.map +1 -0
- package/dist/esm/src/components/index.js +8 -0
- package/dist/esm/src/components/index.js.map +1 -0
- package/dist/esm/src/data/TestDataManager.d.ts +125 -0
- package/dist/esm/src/data/TestDataManager.d.ts.map +1 -0
- package/dist/esm/src/data/TestDataManager.js +183 -0
- package/dist/esm/src/data/TestDataManager.js.map +1 -0
- package/dist/esm/src/data/index.d.ts +7 -0
- package/dist/esm/src/data/index.d.ts.map +1 -0
- package/dist/esm/src/data/index.js +7 -0
- package/dist/esm/src/data/index.js.map +1 -0
- package/dist/esm/src/decorators/Component.d.ts +59 -0
- package/dist/esm/src/decorators/Component.d.ts.map +1 -0
- package/dist/esm/src/decorators/Component.js +103 -0
- package/dist/esm/src/decorators/Component.js.map +1 -0
- package/dist/esm/src/decorators/ContainerHelpers.d.ts +26 -0
- package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -0
- package/dist/esm/src/decorators/ContainerHelpers.js +42 -0
- package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -0
- package/dist/esm/src/decorators/SpecializedTools.d.ts +218 -0
- package/dist/esm/src/decorators/SpecializedTools.d.ts.map +1 -0
- package/dist/esm/src/decorators/SpecializedTools.js +383 -0
- package/dist/esm/src/decorators/SpecializedTools.js.map +1 -0
- package/dist/esm/src/decorators/Tool.d.ts +210 -0
- package/dist/esm/src/decorators/Tool.d.ts.map +1 -0
- package/dist/esm/src/decorators/Tool.js +694 -0
- package/dist/esm/src/decorators/Tool.js.map +1 -0
- package/dist/esm/src/decorators/ToolHelpers.d.ts +74 -0
- package/dist/esm/src/decorators/ToolHelpers.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolHelpers.js +219 -0
- package/dist/esm/src/decorators/ToolHelpers.js.map +1 -0
- package/dist/esm/src/decorators/ToolPreset.d.ts +138 -0
- package/dist/esm/src/decorators/ToolPreset.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolPreset.js +259 -0
- package/dist/esm/src/decorators/ToolPreset.js.map +1 -0
- package/dist/esm/src/decorators/ToolProvider.d.ts +65 -0
- package/dist/esm/src/decorators/ToolProvider.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolProvider.js +81 -0
- package/dist/esm/src/decorators/ToolProvider.js.map +1 -0
- package/dist/esm/src/decorators/index.d.ts +13 -0
- package/dist/esm/src/decorators/index.d.ts.map +1 -0
- package/dist/esm/src/decorators/index.js +14 -0
- package/dist/esm/src/decorators/index.js.map +1 -0
- package/dist/esm/src/execution/DOMExecutor.d.ts +43 -0
- package/dist/esm/src/execution/DOMExecutor.d.ts.map +1 -0
- package/dist/esm/src/execution/DOMExecutor.js +229 -0
- package/dist/esm/src/execution/DOMExecutor.js.map +1 -0
- package/dist/esm/src/execution/PlaywrightExecutor.d.ts +38 -0
- package/dist/esm/src/execution/PlaywrightExecutor.d.ts.map +1 -0
- package/dist/esm/src/execution/PlaywrightExecutor.js +192 -0
- package/dist/esm/src/execution/PlaywrightExecutor.js.map +1 -0
- package/dist/esm/src/exposure/ExposureCollector.d.ts +88 -0
- package/dist/esm/src/exposure/ExposureCollector.d.ts.map +1 -0
- package/dist/esm/src/exposure/ExposureCollector.js +354 -0
- package/dist/esm/src/exposure/ExposureCollector.js.map +1 -0
- package/dist/esm/src/exposure/index.d.ts +8 -0
- package/dist/esm/src/exposure/index.d.ts.map +1 -0
- package/dist/esm/src/exposure/index.js +10 -0
- package/dist/esm/src/exposure/index.js.map +1 -0
- package/dist/esm/src/index.d.ts +49 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js +79 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/interfaces/StatefulComponent.d.ts +72 -0
- package/dist/esm/src/interfaces/StatefulComponent.d.ts.map +1 -0
- package/dist/esm/src/interfaces/StatefulComponent.js +47 -0
- package/dist/esm/src/interfaces/StatefulComponent.js.map +1 -0
- package/dist/esm/src/name-contracts/ContractScanner.d.ts +61 -0
- package/dist/esm/src/name-contracts/ContractScanner.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/ContractScanner.js +11 -0
- package/dist/esm/src/name-contracts/ContractScanner.js.map +1 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.d.ts +30 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.js +188 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.js.map +1 -0
- package/dist/esm/src/name-contracts/index.d.ts +10 -0
- package/dist/esm/src/name-contracts/index.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/index.js +10 -0
- package/dist/esm/src/name-contracts/index.js.map +1 -0
- package/dist/esm/src/names/createNames.d.ts +49 -0
- package/dist/esm/src/names/createNames.d.ts.map +1 -0
- package/dist/esm/src/names/createNames.js +81 -0
- package/dist/esm/src/names/createNames.js.map +1 -0
- package/dist/esm/src/react/hooks/useChatWithContext.d.ts +68 -0
- package/dist/esm/src/react/hooks/useChatWithContext.d.ts.map +1 -0
- package/dist/esm/src/react/hooks/useChatWithContext.js +218 -0
- package/dist/esm/src/react/hooks/useChatWithContext.js.map +1 -0
- package/dist/esm/src/react/index.d.ts +12 -0
- package/dist/esm/src/react/index.d.ts.map +1 -0
- package/dist/esm/src/react/index.js +21 -0
- package/dist/esm/src/react/index.js.map +1 -0
- package/dist/esm/src/react/useNavigationHandler.d.ts +42 -0
- package/dist/esm/src/react/useNavigationHandler.d.ts.map +1 -0
- package/dist/esm/src/react/useNavigationHandler.js +85 -0
- package/dist/esm/src/react/useNavigationHandler.js.map +1 -0
- package/dist/esm/src/react/usePersistedState.d.ts +13 -0
- package/dist/esm/src/react/usePersistedState.d.ts.map +1 -0
- package/dist/esm/src/react/usePersistedState.js +69 -0
- package/dist/esm/src/react/usePersistedState.js.map +1 -0
- package/dist/esm/src/react/useToolBinding.d.ts +8 -0
- package/dist/esm/src/react/useToolBinding.d.ts.map +1 -0
- package/dist/esm/src/react/useToolBinding.js +107 -0
- package/dist/esm/src/react/useToolBinding.js.map +1 -0
- package/dist/esm/src/routes/RouteContractGenerator.d.ts +37 -0
- package/dist/esm/src/routes/RouteContractGenerator.d.ts.map +1 -0
- package/dist/esm/src/routes/RouteContractGenerator.js +115 -0
- package/dist/esm/src/routes/RouteContractGenerator.js.map +1 -0
- package/dist/esm/src/routes/RouteContractsConfig.d.ts +93 -0
- package/dist/esm/src/routes/RouteContractsConfig.d.ts.map +1 -0
- package/dist/esm/src/routes/RouteContractsConfig.js +36 -0
- package/dist/esm/src/routes/RouteContractsConfig.js.map +1 -0
- package/dist/esm/src/routes/index.d.ts +13 -0
- package/dist/esm/src/routes/index.d.ts.map +1 -0
- package/dist/esm/src/routes/index.js +13 -0
- package/dist/esm/src/routes/index.js.map +1 -0
- package/dist/esm/src/routes/scanners/NameExtractor.d.ts +36 -0
- package/dist/esm/src/routes/scanners/NameExtractor.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/NameExtractor.js +156 -0
- package/dist/esm/src/routes/scanners/NameExtractor.js.map +1 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.d.ts +35 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.js +98 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.js.map +1 -0
- package/dist/esm/src/routes/scanners/RouteScanner.d.ts +64 -0
- package/dist/esm/src/routes/scanners/RouteScanner.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/RouteScanner.js +9 -0
- package/dist/esm/src/routes/scanners/RouteScanner.js.map +1 -0
- package/dist/esm/src/storage/LocalStorageAdapter.d.ts +29 -0
- package/dist/esm/src/storage/LocalStorageAdapter.d.ts.map +1 -0
- package/dist/esm/src/storage/LocalStorageAdapter.js +83 -0
- package/dist/esm/src/storage/LocalStorageAdapter.js.map +1 -0
- package/dist/esm/src/storage/StateManager.d.ts +175 -0
- package/dist/esm/src/storage/StateManager.d.ts.map +1 -0
- package/dist/esm/src/storage/StateManager.js +295 -0
- package/dist/esm/src/storage/StateManager.js.map +1 -0
- package/dist/esm/src/storage/StorageAdapter.d.ts +94 -0
- package/dist/esm/src/storage/StorageAdapter.d.ts.map +1 -0
- package/dist/esm/src/storage/StorageAdapter.js +158 -0
- package/dist/esm/src/storage/StorageAdapter.js.map +1 -0
- package/dist/esm/src/storage/index.d.ts +12 -0
- package/dist/esm/src/storage/index.d.ts.map +1 -0
- package/dist/esm/src/storage/index.js +17 -0
- package/dist/esm/src/storage/index.js.map +1 -0
- package/dist/esm/src/testing/BrowserStateInjection.d.ts +74 -0
- package/dist/esm/src/testing/BrowserStateInjection.d.ts.map +1 -0
- package/dist/esm/src/testing/BrowserStateInjection.js +126 -0
- package/dist/esm/src/testing/BrowserStateInjection.js.map +1 -0
- package/dist/esm/src/testing/ComponentStateHelpers.d.ts +121 -0
- package/dist/esm/src/testing/ComponentStateHelpers.d.ts.map +1 -0
- package/dist/esm/src/testing/ComponentStateHelpers.js +190 -0
- package/dist/esm/src/testing/ComponentStateHelpers.js.map +1 -0
- package/dist/esm/src/testing/GherkinParser.d.ts +87 -0
- package/dist/esm/src/testing/GherkinParser.d.ts.map +1 -0
- package/dist/esm/src/testing/GherkinParser.js +248 -0
- package/dist/esm/src/testing/GherkinParser.js.map +1 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.d.ts +163 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.d.ts.map +1 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.js +242 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.js.map +1 -0
- package/dist/esm/src/testing/TestRunner.d.ts +50 -0
- package/dist/esm/src/testing/TestRunner.d.ts.map +1 -0
- package/dist/esm/src/testing/TestRunner.js +121 -0
- package/dist/esm/src/testing/TestRunner.js.map +1 -0
- package/dist/esm/src/testing/index.d.ts +12 -0
- package/dist/esm/src/testing/index.d.ts.map +1 -0
- package/dist/esm/src/testing/index.js +25 -0
- package/dist/esm/src/testing/index.js.map +1 -0
- package/dist/esm/src/testing/selectors.d.ts +65 -0
- package/dist/esm/src/testing/selectors.d.ts.map +1 -0
- package/dist/esm/src/testing/selectors.js +76 -0
- package/dist/esm/src/testing/selectors.js.map +1 -0
- package/dist/esm/src/tools/SystemTools.d.ts +139 -0
- package/dist/esm/src/tools/SystemTools.d.ts.map +1 -0
- package/dist/esm/src/tools/SystemTools.js +258 -0
- package/dist/esm/src/tools/SystemTools.js.map +1 -0
- package/dist/esm/src/types/ClassifiedTool.d.ts +61 -0
- package/dist/esm/src/types/ClassifiedTool.d.ts.map +1 -0
- package/dist/esm/src/types/ClassifiedTool.js +47 -0
- package/dist/esm/src/types/ClassifiedTool.js.map +1 -0
- package/dist/esm/src/types/ComponentState.d.ts +207 -0
- package/dist/esm/src/types/ComponentState.d.ts.map +1 -0
- package/dist/esm/src/types/ComponentState.js +25 -0
- package/dist/esm/src/types/ComponentState.js.map +1 -0
- package/dist/esm/src/types/DiscoverableToolProvider.d.ts +59 -0
- package/dist/esm/src/types/DiscoverableToolProvider.d.ts.map +1 -0
- package/dist/esm/src/types/DiscoverableToolProvider.js +8 -0
- package/dist/esm/src/types/DiscoverableToolProvider.js.map +1 -0
- package/dist/esm/src/types/ExposureState.d.ts +75 -0
- package/dist/esm/src/types/ExposureState.d.ts.map +1 -0
- package/dist/esm/src/types/ExposureState.js +22 -0
- package/dist/esm/src/types/ExposureState.js.map +1 -0
- package/dist/esm/src/types/NavigationGraph.d.ts +98 -0
- package/dist/esm/src/types/NavigationGraph.d.ts.map +1 -0
- package/dist/esm/src/types/NavigationGraph.js +7 -0
- package/dist/esm/src/types/NavigationGraph.js.map +1 -0
- package/dist/esm/src/types/OperationType.d.ts +45 -0
- package/dist/esm/src/types/OperationType.d.ts.map +1 -0
- package/dist/esm/src/types/OperationType.js +46 -0
- package/dist/esm/src/types/OperationType.js.map +1 -0
- package/dist/esm/src/types/StateManagers.d.ts +35 -0
- package/dist/esm/src/types/StateManagers.d.ts.map +1 -0
- package/dist/esm/src/types/StateManagers.js +36 -0
- package/dist/esm/src/types/StateManagers.js.map +1 -0
- package/dist/esm/src/types/Tool.d.ts +162 -0
- package/dist/esm/src/types/Tool.d.ts.map +1 -0
- package/dist/esm/src/types/Tool.js +38 -0
- package/dist/esm/src/types/Tool.js.map +1 -0
- package/dist/esm/src/types/ToolPermissions.d.ts +73 -0
- package/dist/esm/src/types/ToolPermissions.d.ts.map +1 -0
- package/dist/esm/src/types/ToolPermissions.js +51 -0
- package/dist/esm/src/types/ToolPermissions.js.map +1 -0
- package/dist/esm/src/types/ToolResult.d.ts +129 -0
- package/dist/esm/src/types/ToolResult.d.ts.map +1 -0
- package/dist/esm/src/types/ToolResult.js +22 -0
- package/dist/esm/src/types/ToolResult.js.map +1 -0
- package/dist/esm/src/types/index.d.ts +47 -0
- package/dist/esm/src/types/index.d.ts.map +1 -0
- package/dist/esm/src/types/index.js +42 -0
- package/dist/esm/src/types/index.js.map +1 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts +23 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts.map +1 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.js +184 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.js.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gherkin Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Gherkin .feature files and converts them to executable test scenarios.
|
|
5
|
+
* Basic open-source version (Story system is enterprise edition).
|
|
6
|
+
*/
|
|
7
|
+
// Story system moved to enterprise edition
|
|
8
|
+
// import { StoryBuilder, StoryDefinition, StoryRegistry } from '../background/stories.js';
|
|
9
|
+
import { ToolRegistry } from '../background/registry/ToolRegistry.js';
|
|
10
|
+
export class GherkinParser {
|
|
11
|
+
/**
|
|
12
|
+
* Parse a Gherkin feature file content
|
|
13
|
+
*/
|
|
14
|
+
static parseFeature(content) {
|
|
15
|
+
const lines = content.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
|
|
16
|
+
let feature = {
|
|
17
|
+
scenarios: []
|
|
18
|
+
};
|
|
19
|
+
let currentScenario = null;
|
|
20
|
+
let tags = [];
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
// Parse tags
|
|
23
|
+
if (line.startsWith('@')) {
|
|
24
|
+
tags = line.split(/\s+/).map(t => t.substring(1));
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Parse feature
|
|
28
|
+
if (line.startsWith('Feature:')) {
|
|
29
|
+
feature.name = line.substring(8).trim();
|
|
30
|
+
if (tags.length > 0) {
|
|
31
|
+
feature.tags = tags;
|
|
32
|
+
tags = [];
|
|
33
|
+
}
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// Parse scenario
|
|
37
|
+
if (line.startsWith('Scenario:')) {
|
|
38
|
+
if (currentScenario) {
|
|
39
|
+
feature.scenarios.push(currentScenario);
|
|
40
|
+
}
|
|
41
|
+
currentScenario = {
|
|
42
|
+
name: line.substring(9).trim(),
|
|
43
|
+
tags: tags.length > 0 ? tags : undefined,
|
|
44
|
+
steps: []
|
|
45
|
+
};
|
|
46
|
+
tags = [];
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Parse steps
|
|
50
|
+
const stepMatch = line.match(/^(Given|When|Then|And|But)\s+(.+)$/);
|
|
51
|
+
if (stepMatch && currentScenario) {
|
|
52
|
+
const [, keyword, text] = stepMatch;
|
|
53
|
+
currentScenario.steps.push({
|
|
54
|
+
keyword: keyword,
|
|
55
|
+
text
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Description (lines after Feature: but before Scenario:)
|
|
59
|
+
if (!line.startsWith('Feature:') && !line.startsWith('Scenario:') && !stepMatch && feature.name && !currentScenario) {
|
|
60
|
+
feature.description = (feature.description || '') + line + ' ';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Add last scenario
|
|
64
|
+
if (currentScenario) {
|
|
65
|
+
feature.scenarios.push(currentScenario);
|
|
66
|
+
}
|
|
67
|
+
return feature;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve tool IDs from step text using natural language matching
|
|
71
|
+
*/
|
|
72
|
+
static resolveSteps(steps) {
|
|
73
|
+
return steps.map(step => {
|
|
74
|
+
// Extract the command text (without Given/When/Then)
|
|
75
|
+
const commandText = step.text.toLowerCase();
|
|
76
|
+
// Try to find matching tool
|
|
77
|
+
const tools = ToolRegistry.searchTools(commandText);
|
|
78
|
+
if (tools.length > 0) {
|
|
79
|
+
// Use best match (first result)
|
|
80
|
+
const tool = tools[0];
|
|
81
|
+
// Extract parameters from step text
|
|
82
|
+
const params = this.extractParameters(step.text, tool.examples || []);
|
|
83
|
+
return {
|
|
84
|
+
...step,
|
|
85
|
+
toolId: tool.toolId,
|
|
86
|
+
params
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return step;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract parameters from step text
|
|
94
|
+
*/
|
|
95
|
+
static extractParameters(text, examples) {
|
|
96
|
+
const params = {};
|
|
97
|
+
// Look for quoted strings
|
|
98
|
+
const quotedMatch = text.match(/"([^"]+)"/g);
|
|
99
|
+
if (quotedMatch) {
|
|
100
|
+
params.value = quotedMatch[0].replace(/"/g, '');
|
|
101
|
+
}
|
|
102
|
+
// Look for numbers
|
|
103
|
+
const numberMatch = text.match(/\b\d+\b/);
|
|
104
|
+
if (numberMatch) {
|
|
105
|
+
params.count = parseInt(numberMatch[0]);
|
|
106
|
+
}
|
|
107
|
+
return params;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Convert Gherkin scenario to Story definition
|
|
111
|
+
*
|
|
112
|
+
* NOTE: Story system is part of @supernal/interface-enterprise
|
|
113
|
+
* This method is not available in the open source edition.
|
|
114
|
+
*
|
|
115
|
+
* For enterprise features including story system, visit:
|
|
116
|
+
* https://supernal.ai/enterprise
|
|
117
|
+
*/
|
|
118
|
+
static scenarioToStory(scenario, featureName) {
|
|
119
|
+
throw new Error('Story system is part of @supernal/interface-enterprise. ' +
|
|
120
|
+
'Visit https://supernal.ai/enterprise for more information.');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Convert entire feature to stories and register them
|
|
124
|
+
*
|
|
125
|
+
* NOTE: Story system is part of @supernal/interface-enterprise
|
|
126
|
+
* This method is not available in the open source edition.
|
|
127
|
+
*/
|
|
128
|
+
static featureToStories(feature) {
|
|
129
|
+
throw new Error('Story system is part of @supernal/interface-enterprise. ' +
|
|
130
|
+
'Visit https://supernal.ai/enterprise for more information.');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate unique story ID from feature and scenario names
|
|
134
|
+
*/
|
|
135
|
+
static generateStoryId(featureName, scenarioName) {
|
|
136
|
+
const cleanFeature = featureName.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
137
|
+
const cleanScenario = scenarioName.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
138
|
+
return `${cleanFeature}-${cleanScenario}`;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generate Gherkin steps from tools
|
|
142
|
+
* Moved from ToolPromptGenerator for consolidation
|
|
143
|
+
*/
|
|
144
|
+
static generateSteps(tools) {
|
|
145
|
+
return tools
|
|
146
|
+
.map(tool => {
|
|
147
|
+
const examples = tool.examples || [tool.name.toLowerCase()];
|
|
148
|
+
return examples
|
|
149
|
+
.map((ex) => ` When I ${ex}`)
|
|
150
|
+
.join('\n');
|
|
151
|
+
})
|
|
152
|
+
.join('\n');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate complete Gherkin feature from tool metadata
|
|
156
|
+
* Consolidated from both ToolPromptGenerator and original generateFeature
|
|
157
|
+
*/
|
|
158
|
+
static generateFeature(featureName, tools, options) {
|
|
159
|
+
let feature = '';
|
|
160
|
+
// Tags
|
|
161
|
+
if (options?.tags && options.tags.length > 0) {
|
|
162
|
+
feature += options.tags.map(t => `@${t}`).join(' ') + '\n';
|
|
163
|
+
}
|
|
164
|
+
// Feature header
|
|
165
|
+
feature += `Feature: ${featureName}\n`;
|
|
166
|
+
if (options?.description) {
|
|
167
|
+
feature += ` ${options.description}\n`;
|
|
168
|
+
}
|
|
169
|
+
feature += '\n Scenario: AI navigation and interaction\n';
|
|
170
|
+
// Generate steps from tools
|
|
171
|
+
feature += this.generateSteps(tools);
|
|
172
|
+
return feature;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Generate Playwright test from Gherkin feature
|
|
176
|
+
*/
|
|
177
|
+
static generatePlaywrightTest(feature) {
|
|
178
|
+
let test = `/**\n`;
|
|
179
|
+
test += ` * ${feature.name} - Generated from Gherkin\n`;
|
|
180
|
+
test += ` */\n\n`;
|
|
181
|
+
test += `import { test, expect } from '@playwright/test';\n`;
|
|
182
|
+
test += `import { StoryExecutor } from '@supernal-interface/core';\n\n`;
|
|
183
|
+
test += `test.describe('${feature.name}', () => {\n`;
|
|
184
|
+
for (const scenario of feature.scenarios) {
|
|
185
|
+
const storyId = this.generateStoryId(feature.name, scenario.name);
|
|
186
|
+
test += ` test('${scenario.name}', async ({ page }) => {\n`;
|
|
187
|
+
test += ` const executor = new StoryExecutor();\n`;
|
|
188
|
+
test += ` const context = { page };\n`;
|
|
189
|
+
test += ` \n`;
|
|
190
|
+
test += ` const result = await executor.executeStory('${storyId}', context);\n`;
|
|
191
|
+
test += ` \n`;
|
|
192
|
+
test += ` expect(result.success).toBe(true);\n`;
|
|
193
|
+
test += ` });\n\n`;
|
|
194
|
+
}
|
|
195
|
+
test += `});\n`;
|
|
196
|
+
return test;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate round-trip: Generate → Parse → Generate
|
|
200
|
+
* Ensures parsing and generation are consistent
|
|
201
|
+
*/
|
|
202
|
+
static validateRoundTrip(tools, featureName = 'Test Feature') {
|
|
203
|
+
const errors = [];
|
|
204
|
+
// Generate original
|
|
205
|
+
const original = this.generateFeature(featureName, tools);
|
|
206
|
+
// Parse it
|
|
207
|
+
let parsed;
|
|
208
|
+
try {
|
|
209
|
+
parsed = this.parseFeature(original);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return {
|
|
213
|
+
valid: false,
|
|
214
|
+
original,
|
|
215
|
+
parsed: { name: '', scenarios: [] },
|
|
216
|
+
regenerated: '',
|
|
217
|
+
errors: [`Parse error: ${error}`]
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Regenerate from parsed structure
|
|
221
|
+
const regenerated = this.generateFeature(parsed.name, tools, {
|
|
222
|
+
description: parsed.description,
|
|
223
|
+
tags: parsed.tags
|
|
224
|
+
});
|
|
225
|
+
// Compare (normalized)
|
|
226
|
+
const normalizeGherkin = (str) => str.trim().replace(/\s+/g, ' ').replace(/\n\s*/g, '\n');
|
|
227
|
+
const originalNorm = normalizeGherkin(original);
|
|
228
|
+
const regeneratedNorm = normalizeGherkin(regenerated);
|
|
229
|
+
if (originalNorm !== regeneratedNorm) {
|
|
230
|
+
errors.push('Round-trip failed: Generated text differs after parse');
|
|
231
|
+
}
|
|
232
|
+
// Validate structure
|
|
233
|
+
if (!parsed.name) {
|
|
234
|
+
errors.push('Parsed feature has no name');
|
|
235
|
+
}
|
|
236
|
+
if (parsed.scenarios.length === 0) {
|
|
237
|
+
errors.push('Parsed feature has no scenarios');
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
valid: errors.length === 0,
|
|
241
|
+
original,
|
|
242
|
+
parsed,
|
|
243
|
+
regenerated,
|
|
244
|
+
errors
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=GherkinParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GherkinParser.js","sourceRoot":"","sources":["../../../../src/testing/GherkinParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright Test Helpers for Browser State Injection
|
|
3
|
+
*
|
|
4
|
+
* Utilities for E2E tests to interact with component state
|
|
5
|
+
* using the browser state injection system.
|
|
6
|
+
*
|
|
7
|
+
* @module PlaywrightStateHelpers
|
|
8
|
+
*/
|
|
9
|
+
import { Page } from '@playwright/test';
|
|
10
|
+
/**
|
|
11
|
+
* Set component state in the browser
|
|
12
|
+
*
|
|
13
|
+
* @param page - Playwright page object
|
|
14
|
+
* @param componentName - Component name from @Component decorator
|
|
15
|
+
* @param state - Partial state to merge
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* await setComponentState(page, 'counter', { count: 5 });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function setComponentState(page: Page, componentName: string, state: any): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get component state from the browser
|
|
25
|
+
*
|
|
26
|
+
* @param page - Playwright page object
|
|
27
|
+
* @param componentName - Component name from @Component decorator
|
|
28
|
+
* @returns Current component state or undefined
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const state = await getComponentState(page, 'counter');
|
|
33
|
+
* expect(state.count).toBe(5);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function getComponentState<TState = any>(page: Page, componentName: string): Promise<TState | undefined>;
|
|
37
|
+
/**
|
|
38
|
+
* Reset component to initial state
|
|
39
|
+
*
|
|
40
|
+
* @param page - Playwright page object
|
|
41
|
+
* @param componentName - Component name from @Component decorator
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* await resetComponentState(page, 'counter');
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function resetComponentState(page: Page, componentName: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Wait for component to be available in the DOM
|
|
51
|
+
*
|
|
52
|
+
* @param page - Playwright page object
|
|
53
|
+
* @param componentName - Component name from @Component decorator
|
|
54
|
+
* @param timeoutMs - Timeout in milliseconds (default: 5000)
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* await waitForComponent(page, 'counter');
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function waitForComponent(page: Page, componentName: string, timeoutMs?: number): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if component is available
|
|
64
|
+
*
|
|
65
|
+
* @param page - Playwright page object
|
|
66
|
+
* @param componentName - Component name from @Component decorator
|
|
67
|
+
* @returns True if component is rendered and available
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const isAvailable = await hasComponent(page, 'counter');
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function hasComponent(page: Page, componentName: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Set component state from a data contract
|
|
77
|
+
*
|
|
78
|
+
* @param page - Playwright page object
|
|
79
|
+
* @param componentName - Component name
|
|
80
|
+
* @param dataContract - Data contract object (e.g., ExamplesData.counter.state.five)
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* import { ExamplesData } from '@supernal-interface/core';
|
|
85
|
+
*
|
|
86
|
+
* await setComponentStateFromContract(
|
|
87
|
+
* page,
|
|
88
|
+
* 'counter',
|
|
89
|
+
* ExamplesData.counter.state.five
|
|
90
|
+
* );
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare function setComponentStateFromContract(page: Page, componentName: string, dataContract: any): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Assert component state matches data contract
|
|
96
|
+
*
|
|
97
|
+
* @param page - Playwright page object
|
|
98
|
+
* @param componentName - Component name
|
|
99
|
+
* @param expectedContract - Expected data contract
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* await assertComponentStateMatches(
|
|
104
|
+
* page,
|
|
105
|
+
* 'counter',
|
|
106
|
+
* ExamplesData.counter.state.five
|
|
107
|
+
* );
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function assertComponentStateMatches(page: Page, componentName: string, expectedContract: any): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Get component element by name
|
|
113
|
+
*
|
|
114
|
+
* @param page - Playwright page object
|
|
115
|
+
* @param componentName - Component name
|
|
116
|
+
* @returns Locator for the component element
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const counter = getComponentElement(page, 'counter');
|
|
121
|
+
* await expect(counter).toBeVisible();
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function getComponentElement(page: Page, componentName: string): import("playwright-core").Locator;
|
|
125
|
+
/**
|
|
126
|
+
* Initialize test state manager in the browser
|
|
127
|
+
* Call this in beforeEach or at the start of tests
|
|
128
|
+
*
|
|
129
|
+
* @param page - Playwright page object
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* test.beforeEach(async ({ page }) => {
|
|
134
|
+
* await initializeTestState(page);
|
|
135
|
+
* });
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export declare function initializeTestState(page: Page): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Batch state operations
|
|
141
|
+
* Useful for setting up complex test scenarios
|
|
142
|
+
*
|
|
143
|
+
* @param page - Playwright page object
|
|
144
|
+
* @param operations - Array of state operations
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* await batchStateOperations(page, [
|
|
149
|
+
* { type: 'set', component: 'counter', state: { count: 5 } },
|
|
150
|
+
* { type: 'set', component: 'chat', state: { messages: [] } },
|
|
151
|
+
* { type: 'reset', component: 'form' },
|
|
152
|
+
* ]);
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export declare function batchStateOperations(page: Page, operations: Array<{
|
|
156
|
+
type: 'set';
|
|
157
|
+
component: string;
|
|
158
|
+
state: any;
|
|
159
|
+
} | {
|
|
160
|
+
type: 'reset';
|
|
161
|
+
component: string;
|
|
162
|
+
}>): Promise<void>;
|
|
163
|
+
//# sourceMappingURL=PlaywrightStateHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaywrightStateHelpers.d.ts","sourceRoot":"","sources":["../../../../src/testing/PlaywrightStateHelpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,GAAG,GAAG,EAClD,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,GAAG,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,GAAG,GACpB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,qCAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,KAAK,CACb;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CACvC,GACA,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright Test Helpers for Browser State Injection
|
|
3
|
+
*
|
|
4
|
+
* Utilities for E2E tests to interact with component state
|
|
5
|
+
* using the browser state injection system.
|
|
6
|
+
*
|
|
7
|
+
* @module PlaywrightStateHelpers
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Set component state in the browser
|
|
11
|
+
*
|
|
12
|
+
* @param page - Playwright page object
|
|
13
|
+
* @param componentName - Component name from @Component decorator
|
|
14
|
+
* @param state - Partial state to merge
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* await setComponentState(page, 'counter', { count: 5 });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export async function setComponentState(page, componentName, state) {
|
|
22
|
+
await page.evaluate(({ component, newState }) => {
|
|
23
|
+
if (!window.__testState__) {
|
|
24
|
+
throw new Error('Test state manager not initialized. Did you forget to call initializeTestStateManager()?');
|
|
25
|
+
}
|
|
26
|
+
window.__testState__.setState(component, newState);
|
|
27
|
+
}, { component: componentName, newState: state });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get component state from the browser
|
|
31
|
+
*
|
|
32
|
+
* @param page - Playwright page object
|
|
33
|
+
* @param componentName - Component name from @Component decorator
|
|
34
|
+
* @returns Current component state or undefined
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const state = await getComponentState(page, 'counter');
|
|
39
|
+
* expect(state.count).toBe(5);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export async function getComponentState(page, componentName) {
|
|
43
|
+
return await page.evaluate((component) => {
|
|
44
|
+
if (!window.__testState__) {
|
|
45
|
+
throw new Error('Test state manager not initialized');
|
|
46
|
+
}
|
|
47
|
+
return window.__testState__.getState(component);
|
|
48
|
+
}, componentName);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Reset component to initial state
|
|
52
|
+
*
|
|
53
|
+
* @param page - Playwright page object
|
|
54
|
+
* @param componentName - Component name from @Component decorator
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* await resetComponentState(page, 'counter');
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export async function resetComponentState(page, componentName) {
|
|
62
|
+
await page.evaluate((component) => {
|
|
63
|
+
if (!window.__testState__) {
|
|
64
|
+
throw new Error('Test state manager not initialized');
|
|
65
|
+
}
|
|
66
|
+
window.__testState__.resetState(component);
|
|
67
|
+
}, componentName);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Wait for component to be available in the DOM
|
|
71
|
+
*
|
|
72
|
+
* @param page - Playwright page object
|
|
73
|
+
* @param componentName - Component name from @Component decorator
|
|
74
|
+
* @param timeoutMs - Timeout in milliseconds (default: 5000)
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* await waitForComponent(page, 'counter');
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export async function waitForComponent(page, componentName, timeoutMs = 5000) {
|
|
82
|
+
await page.evaluate(async ({ component, timeout }) => {
|
|
83
|
+
if (!window.__testState__) {
|
|
84
|
+
throw new Error('Test state manager not initialized');
|
|
85
|
+
}
|
|
86
|
+
await window.__testState__.waitForComponent(component, timeout);
|
|
87
|
+
}, { component: componentName, timeout: timeoutMs });
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if component is available
|
|
91
|
+
*
|
|
92
|
+
* @param page - Playwright page object
|
|
93
|
+
* @param componentName - Component name from @Component decorator
|
|
94
|
+
* @returns True if component is rendered and available
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const isAvailable = await hasComponent(page, 'counter');
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export async function hasComponent(page, componentName) {
|
|
102
|
+
return await page.evaluate((component) => {
|
|
103
|
+
if (!window.__testState__) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return window.__testState__.hasComponent(component);
|
|
107
|
+
}, componentName);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Set component state from a data contract
|
|
111
|
+
*
|
|
112
|
+
* @param page - Playwright page object
|
|
113
|
+
* @param componentName - Component name
|
|
114
|
+
* @param dataContract - Data contract object (e.g., ExamplesData.counter.state.five)
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* import { ExamplesData } from '@supernal-interface/core';
|
|
119
|
+
*
|
|
120
|
+
* await setComponentStateFromContract(
|
|
121
|
+
* page,
|
|
122
|
+
* 'counter',
|
|
123
|
+
* ExamplesData.counter.state.five
|
|
124
|
+
* );
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export async function setComponentStateFromContract(page, componentName, dataContract) {
|
|
128
|
+
await setComponentState(page, componentName, dataContract);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Assert component state matches data contract
|
|
132
|
+
*
|
|
133
|
+
* @param page - Playwright page object
|
|
134
|
+
* @param componentName - Component name
|
|
135
|
+
* @param expectedContract - Expected data contract
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* await assertComponentStateMatches(
|
|
140
|
+
* page,
|
|
141
|
+
* 'counter',
|
|
142
|
+
* ExamplesData.counter.state.five
|
|
143
|
+
* );
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export async function assertComponentStateMatches(page, componentName, expectedContract) {
|
|
147
|
+
const actualState = await getComponentState(page, componentName);
|
|
148
|
+
if (!actualState) {
|
|
149
|
+
throw new Error(`Component '${componentName}' state is undefined`);
|
|
150
|
+
}
|
|
151
|
+
// Deep equality check
|
|
152
|
+
const actualJson = JSON.stringify(actualState);
|
|
153
|
+
const expectedJson = JSON.stringify(expectedContract);
|
|
154
|
+
if (actualJson !== expectedJson) {
|
|
155
|
+
throw new Error(`Component '${componentName}' state does not match.\n` +
|
|
156
|
+
`Expected: ${expectedJson}\n` +
|
|
157
|
+
`Actual: ${actualJson}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get component element by name
|
|
162
|
+
*
|
|
163
|
+
* @param page - Playwright page object
|
|
164
|
+
* @param componentName - Component name
|
|
165
|
+
* @returns Locator for the component element
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* const counter = getComponentElement(page, 'counter');
|
|
170
|
+
* await expect(counter).toBeVisible();
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export function getComponentElement(page, componentName) {
|
|
174
|
+
return page.locator(`[data-component="${componentName}"]`);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Initialize test state manager in the browser
|
|
178
|
+
* Call this in beforeEach or at the start of tests
|
|
179
|
+
*
|
|
180
|
+
* @param page - Playwright page object
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* test.beforeEach(async ({ page }) => {
|
|
185
|
+
* await initializeTestState(page);
|
|
186
|
+
* });
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
export async function initializeTestState(page) {
|
|
190
|
+
await page.evaluate(() => {
|
|
191
|
+
// Force initialize test state manager regardless of NODE_ENV
|
|
192
|
+
if (typeof window !== 'undefined' && !window.__testState__) {
|
|
193
|
+
// Create a minimal test state manager
|
|
194
|
+
window.__testState__ = {
|
|
195
|
+
states: new Map(),
|
|
196
|
+
getState(component) {
|
|
197
|
+
return this.states.get(component);
|
|
198
|
+
},
|
|
199
|
+
setState(component, state) {
|
|
200
|
+
const current = this.states.get(component) || {};
|
|
201
|
+
this.states.set(component, { ...current, ...state });
|
|
202
|
+
},
|
|
203
|
+
resetState(component) {
|
|
204
|
+
this.states.delete(component);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
console.log('[TEST] Test state manager initialized in browser');
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Batch state operations
|
|
213
|
+
* Useful for setting up complex test scenarios
|
|
214
|
+
*
|
|
215
|
+
* @param page - Playwright page object
|
|
216
|
+
* @param operations - Array of state operations
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```typescript
|
|
220
|
+
* await batchStateOperations(page, [
|
|
221
|
+
* { type: 'set', component: 'counter', state: { count: 5 } },
|
|
222
|
+
* { type: 'set', component: 'chat', state: { messages: [] } },
|
|
223
|
+
* { type: 'reset', component: 'form' },
|
|
224
|
+
* ]);
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export async function batchStateOperations(page, operations) {
|
|
228
|
+
await page.evaluate((ops) => {
|
|
229
|
+
if (!window.__testState__) {
|
|
230
|
+
throw new Error('Test state manager not initialized');
|
|
231
|
+
}
|
|
232
|
+
for (const op of ops) {
|
|
233
|
+
if (op.type === 'set') {
|
|
234
|
+
window.__testState__.setState(op.component, op.state);
|
|
235
|
+
}
|
|
236
|
+
else if (op.type === 'reset') {
|
|
237
|
+
window.__testState__.resetState(op.component);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}, operations);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=PlaywrightStateHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaywrightStateHelpers.js","sourceRoot":"","sources":["../../../../src/testing/PlaywrightStateHelpers.ts"],"names":[],"mappings":"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"}
|