From c28163ae6abecd394d8fc4260ce550a4894a9d55 Mon Sep 17 00:00:00 2001 From: Konstantin Aksenov Date: Tue, 6 Jan 2026 11:04:43 +1000 Subject: [PATCH 1/2] stable --- .github/workflows/on-push-master-library.yml | 2 +- .../workflows/publish-release-workflow.yaml | 2 +- .github/workflows/pull-request-library.yml | 4 +- .idea/gradle.xml | 9 +- .idea/misc.xml | 2 +- README.md | 328 +- .../.gitignore | 0 appium-tests/build.gradle.kts | 15 + .../proguard-rules.pro | 0 .../test/kotlin/appium/MainActivityScreen.kt | 15 + .../test/kotlin/appium/SimpleAppiumTest.kt | 43 + {compose-test => appium}/.gitignore | 0 appium/build.gradle.kts | 17 + {compose-test => appium}/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../io/github/kakaocup/appium/KakaoAppium.kt | 52 + .../appium/exception/KakaoAppiumException.kt | 3 + .../appium}/intercept/base/Interception.kt | 2 +- .../appium}/intercept/base/Interceptor.kt | 43 +- .../intercept/delegate/AppiumInterceptable.kt | 32 + .../appium}/intercept/delegate/Delegate.kt | 18 +- .../intercept/delegate/WebElementDelegate.kt | 51 + .../interaction/AppiumInteraction.kt | 32 + .../intercept/interaction/Interaction.kt | 4 +- .../intercept/operation/AppiumOperation.kt | 6 +- .../operation/AppiumOperationImpl.kt | 33 + .../operation/AppiumOperationType.kt | 8 + .../appium/node/action/TextActions.kt | 21 + .../appium/node/action/WebElementActions.kt | 19 + .../node/assertion/WebElementAssertions.kt | 19 + .../appium/node/builder/ViewBuilder.kt | 64 + .../appium/node/builder/WebElementMatcher.kt | 8 + .../appium/node/builder/WebElementProvider.kt | 14 + .../builder/patform/AndroidDataMatcher.kt | 8 + .../node/builder/patform/DataMatcher.kt | 13 + .../node/builder/patform/IOSDataMatcher.kt | 8 + .../kakaocup/appium/node/core/AppiumMarker.kt | 4 + .../kakaocup/appium/node/core/BaseNode.kt | 77 + .../github/kakaocup/appium}/node/core/KDSL.kt | 2 +- .../appium/node/element/AppiumScreen.kt | 41 + .../appium/node/element/KWebElement.kt | 25 + .../appium/rule/KakaoAppiumTestRule.kt | 24 + .../kakaocup/appium/utilities/Extensions.kt | 17 + buildSrc/src/main/kotlin/Github.kt | 6 +- compose-semantics/build.gradle.kts | 13 - .../semantics/SemanticsBackgroundKt.kt | 14 - .../kakaocup/compose/semantics/SemanticsKt.kt | 86 - compose-test/build.gradle.kts | 17 - compose-test/src/main/AndroidManifest.xml | 2 - .../kakaocup/compose/foundation/Background.kt | 95 - .../kakaocup/compose/foundation/Button.kt | 74 - .../kakaocup/compose/foundation/Icon.kt | 96 - .../compose/foundation/ProgressIndicator.kt | 116 - .../kakaocup/compose/foundation/Text.kt | 256 - compose-ui/.gitignore | 1 - compose-ui/build.gradle.kts | 14 - compose-ui/proguard-rules.pro | 21 - compose-ui/src/main/AndroidManifest.xml | 2 - .../compose/foundation/BackgroundKt.kt | 37 - .../kakaocup/compose/foundation/Button.kt | 174 - .../kakaocup/compose/foundation/Icon.kt | 160 - .../compose/foundation/ProgressIndicator.kt | 173 - .../kakaocup/compose/foundation/Text.kt | 265 - compose/.gitignore | 1 - compose/build.gradle.kts | 15 - compose/proguard-rules.pro | 21 - compose/src/main/AndroidManifest.xml | 2 - .../github/kakaocup/compose/KakaoCompose.kt | 67 - .../exception/KakaoComposeException.kt | 3 - .../intercept/delegate/ComposeDelegate.kt | 43 - .../delegate/ComposeInterceptable.kt | 31 - .../interaction/ComposeInteraction.kt | 33 - .../operation/ComposeOperationImpls.kt | 33 - .../operation/ComposeOperationType.kt | 8 - .../compose/node/action/NodeActions.kt | 265 - .../compose/node/action/TextActions.kt | 68 - .../node/assertion/LazyListNodeAssertions.kt | 30 - .../node/assertion/ListNodeAssertions.kt | 39 - .../compose/node/assertion/NodeAssertions.kt | 336 - .../assertion/TextResourcesNodeAssertions.kt | 111 - .../compose/node/builder/NodeMatcher.kt | 10 - .../compose/node/builder/NodeProvider.kt | 17 - .../compose/node/builder/ViewBuilder.kt | 465 - .../kakaocup/compose/node/core/BaseNode.kt | 122 - .../compose/node/core/ComposeMarker.kt | 4 - .../compose/node/element/ComposeScreen.kt | 61 - .../kakaocup/compose/node/element/KNode.kt | 26 - .../element/lazylist/KLazyListItemBuilder.kt | 28 - .../element/lazylist/KLazyListItemNode.kt | 28 - .../node/element/lazylist/KLazyListNode.kt | 161 - .../lazylist/LazyListItemProvidedException.kt | 11 - .../node/element/list/KListItemNode.kt | 54 - .../compose/node/element/list/KListNode.kt | 554 - .../compose/rule/KakaoComposeTestRule.kt | 28 - .../compose/utilities/ContextUtils.kt | 6 - .../kakaocup/compose/utilities/Extensions.kt | 15 - documentation/.gitignore | 20 - documentation/README.md | 1 - documentation/babel.config.js | 3 - .../blog/2024-09-01-compose-release-1-0-0.md | 6 - documentation/blog/tags.yml | 4 - documentation/docs/advance/_category_.json | 8 - .../docs/advance/reusable_components.md | 5 - documentation/docs/basics/_category_.json | 8 - .../docs/basics/kakao_compose_structure.md | 73 - documentation/docs/basics/kakao_test_rule.md | 66 - documentation/docs/basics/screens.md | 175 - .../docs/intermediate/_category_.json | 8 - documentation/docs/intermediate/async_code.md | 224 - documentation/docs/introduction.md | 49 - documentation/docs/setup.md | 20 - documentation/docusaurus.config.ts | 130 - documentation/package-lock.json | 15919 ---------------- documentation/package.json | 48 - documentation/sidebars.ts | 31 - .../src/components/HomepageFeatures/index.tsx | 62 - .../HomepageFeatures/styles.module.css | 11 - documentation/src/css/custom.css | 30 - documentation/src/pages/index.module.css | 23 - documentation/src/pages/index.tsx | 43 - documentation/src/pages/markdown-page.md | 7 - documentation/static/.nojekyll | 0 .../static/img/docusaurus-social-card.jpg | Bin 55746 -> 0 bytes documentation/static/img/docusaurus.png | Bin 5142 -> 0 bytes documentation/static/img/espresso.png | Bin 9621 -> 0 bytes documentation/static/img/favicon.ico | Bin 3626 -> 0 bytes documentation/static/img/logo.png | Bin 27007 -> 0 bytes documentation/tsconfig.json | 7 - gradle.properties | 5 +- gradle/libs.versions.toml | 15 +- gradlew | 6 +- sample/build.gradle.kts | 10 +- .../kakaocup/compose/SampleNoActivityTest.kt | 19 - .../extensions/ComposeTestRuleExtensions.kt | 12 - .../kakaocup/compose/node/KAppListNode.kt | 18 - .../screen/BackgroundActivityScreen.kt | 21 - .../compose/screen/ButtonActivityScreen.kt | 24 - ...ustomSemanticsPropertyKeyActivityScreen.kt | 16 - .../screen/DelayDisplayActivityScreen.kt | 17 - .../compose/screen/DialogActivityScreen.kt | 31 - .../compose/screen/GlobalSemanticScreen.kt | 17 - .../compose/screen/IconActivityScreen.kt | 23 - .../kakaocup/compose/screen/LazyListScreen.kt | 48 - .../compose/screen/MainActivityScreen.kt | 34 - .../screen/ProgressIndicatorActivityScreen.kt | 27 - .../compose/screen/TextActivityScreen.kt | 30 - .../list/NotScrollableListComposeScreen.kt | 31 - .../list/ScrollableLazyListComposeScreen.kt | 23 - .../list/ScrollableListComposeScreen.kt | 23 - .../navigation/FirstNavigationScreen.kt | 18 - .../navigation/SecondNavigationScreen.kt | 13 - .../screen/navigation/SharedWidgetNode.kt | 16 - .../test/CustomSemanticsPropertyKeyTest.kt | 31 - .../kakaocup/compose/test/DialogTest.kt | 37 - .../kakaocup/compose/test/GestureTest.kt | 28 - .../kakaocup/compose/test/InterceptorTest.kt | 232 - .../kakaocup/compose/test/LazyListTest.kt | 69 - .../compose/test/SimpleNavigationTest.kt | 39 - .../kakaocup/compose/test/SimpleTest.kt | 42 - .../compose/test/SimpleTestGlobalSemantic.kt | 31 - .../kakaocup/compose/test/TouchInputTest.kt | 28 - .../kakaocup/compose/test/WaitForTest.kt | 35 - .../test/list/NotScrollableListTest.kt | 57 - .../test/list/ScrollableLazyListTest.kt | 68 - .../compose/test/list/ScrollableListTest.kt | 70 - .../test/modifier/BackgroundModifierTest.kt | 82 - .../compose/test/node/KButtonNodeTest.kt | 88 - .../compose/test/node/KIconNodeTest.kt | 81 - .../test/node/KProgressIndicatorNodeTest.kt | 114 - .../compose/test/node/KTextNodeTest.kt | 178 - sample/src/main/AndroidManifest.xml | 9 - .../sample/MainActivity.kt | 2 +- .../compose/sample/BackgroundActivity.kt | 76 - .../kakaocup/compose/sample/ButtonActivity.kt | 105 - .../CustomSemanticPropertyKeyActivity.kt | 61 - .../compose/sample/DelayDisplayActivity.kt | 74 - .../kakaocup/compose/sample/DialogActivity.kt | 136 - .../kakaocup/compose/sample/IconActivity.kt | 71 - .../kakaocup/compose/sample/LazyListScreen.kt | 158 - .../compose/sample/NotScrollableListScreen.kt | 229 - .../sample/ProgressIndicatorActivity.kt | 94 - .../sample/ScrollableLazyListScreen.kt | 129 - .../compose/sample/ScrollableListScreen.kt | 129 - .../compose/sample/SimpleNavigationScreen.kt | 105 - .../kakaocup/compose/sample/TextActivity.kt | 104 - .../compose/sample/semantics/ListItemIndex.kt | 12 - .../compose/sample/semantics/ListLength.kt | 12 - sample/src/main/res/values/strings.xml | 2 +- settings.gradle.kts | 6 +- 189 files changed, 743 insertions(+), 24962 deletions(-) rename {compose-semantics => appium-tests}/.gitignore (100%) create mode 100644 appium-tests/build.gradle.kts rename {compose-semantics => appium-tests}/proguard-rules.pro (100%) create mode 100644 appium-tests/src/test/kotlin/appium/MainActivityScreen.kt create mode 100644 appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt rename {compose-test => appium}/.gitignore (100%) create mode 100644 appium/build.gradle.kts rename {compose-test => appium}/proguard-rules.pro (100%) rename {compose-semantics => appium}/src/main/AndroidManifest.xml (100%) create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/KakaoAppium.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/exception/KakaoAppiumException.kt rename {compose/src/main/kotlin/io/github/kakaocup/compose => appium/src/main/kotlin/io/github/kakaocup/appium}/intercept/base/Interception.kt (59%) rename {compose/src/main/kotlin/io/github/kakaocup/compose => appium/src/main/kotlin/io/github/kakaocup/appium}/intercept/base/Interceptor.kt (70%) create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/AppiumInterceptable.kt rename {compose/src/main/kotlin/io/github/kakaocup/compose => appium/src/main/kotlin/io/github/kakaocup/appium}/intercept/delegate/Delegate.kt (83%) create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/WebElementDelegate.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/AppiumInteraction.kt rename {compose/src/main/kotlin/io/github/kakaocup/compose => appium/src/main/kotlin/io/github/kakaocup/appium}/intercept/interaction/Interaction.kt (75%) rename compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperation.kt => appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperation.kt (55%) create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationImpl.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationType.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/action/TextActions.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/action/WebElementActions.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/assertion/WebElementAssertions.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/ViewBuilder.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementMatcher.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementProvider.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/AndroidDataMatcher.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/DataMatcher.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/IOSDataMatcher.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/core/AppiumMarker.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/core/BaseNode.kt rename {compose/src/main/kotlin/io/github/kakaocup/compose => appium/src/main/kotlin/io/github/kakaocup/appium}/node/core/KDSL.kt (84%) create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/element/AppiumScreen.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/node/element/KWebElement.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/rule/KakaoAppiumTestRule.kt create mode 100644 appium/src/main/kotlin/io/github/kakaocup/appium/utilities/Extensions.kt delete mode 100644 compose-semantics/build.gradle.kts delete mode 100644 compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsBackgroundKt.kt delete mode 100644 compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsKt.kt delete mode 100644 compose-test/build.gradle.kts delete mode 100644 compose-test/src/main/AndroidManifest.xml delete mode 100644 compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Background.kt delete mode 100644 compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt delete mode 100644 compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt delete mode 100644 compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt delete mode 100644 compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt delete mode 100644 compose-ui/.gitignore delete mode 100644 compose-ui/build.gradle.kts delete mode 100644 compose-ui/proguard-rules.pro delete mode 100644 compose-ui/src/main/AndroidManifest.xml delete mode 100644 compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/BackgroundKt.kt delete mode 100644 compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt delete mode 100644 compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt delete mode 100644 compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt delete mode 100644 compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt delete mode 100644 compose/.gitignore delete mode 100644 compose/build.gradle.kts delete mode 100644 compose/proguard-rules.pro delete mode 100644 compose/src/main/AndroidManifest.xml delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/KakaoCompose.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/exception/KakaoComposeException.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeDelegate.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeInterceptable.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/ComposeInteraction.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationImpls.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationType.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/action/NodeActions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/action/TextActions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/LazyListNodeAssertions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/ListNodeAssertions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/NodeAssertions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/TextResourcesNodeAssertions.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeMatcher.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeProvider.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/ViewBuilder.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/core/BaseNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/core/ComposeMarker.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/ComposeScreen.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/KNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemBuilder.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/LazyListItemProvidedException.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListItemNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListNode.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/rule/KakaoComposeTestRule.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/utilities/ContextUtils.kt delete mode 100644 compose/src/main/kotlin/io/github/kakaocup/compose/utilities/Extensions.kt delete mode 100644 documentation/.gitignore delete mode 100644 documentation/README.md delete mode 100644 documentation/babel.config.js delete mode 100644 documentation/blog/2024-09-01-compose-release-1-0-0.md delete mode 100644 documentation/blog/tags.yml delete mode 100644 documentation/docs/advance/_category_.json delete mode 100644 documentation/docs/advance/reusable_components.md delete mode 100644 documentation/docs/basics/_category_.json delete mode 100644 documentation/docs/basics/kakao_compose_structure.md delete mode 100644 documentation/docs/basics/kakao_test_rule.md delete mode 100644 documentation/docs/basics/screens.md delete mode 100644 documentation/docs/intermediate/_category_.json delete mode 100644 documentation/docs/intermediate/async_code.md delete mode 100644 documentation/docs/introduction.md delete mode 100644 documentation/docs/setup.md delete mode 100644 documentation/docusaurus.config.ts delete mode 100644 documentation/package-lock.json delete mode 100644 documentation/package.json delete mode 100644 documentation/sidebars.ts delete mode 100644 documentation/src/components/HomepageFeatures/index.tsx delete mode 100644 documentation/src/components/HomepageFeatures/styles.module.css delete mode 100644 documentation/src/css/custom.css delete mode 100644 documentation/src/pages/index.module.css delete mode 100644 documentation/src/pages/index.tsx delete mode 100644 documentation/src/pages/markdown-page.md delete mode 100644 documentation/static/.nojekyll delete mode 100644 documentation/static/img/docusaurus-social-card.jpg delete mode 100644 documentation/static/img/docusaurus.png delete mode 100644 documentation/static/img/espresso.png delete mode 100644 documentation/static/img/favicon.ico delete mode 100644 documentation/static/img/logo.png delete mode 100644 documentation/tsconfig.json delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/SampleNoActivityTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/extensions/ComposeTestRuleExtensions.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/node/KAppListNode.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/BackgroundActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/ButtonActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/CustomSemanticsPropertyKeyActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/DelayDisplayActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/DialogActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/GlobalSemanticScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/IconActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/LazyListScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/MainActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/ProgressIndicatorActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/TextActivityScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/NotScrollableListComposeScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableLazyListComposeScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableListComposeScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/FirstNavigationScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SecondNavigationScreen.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SharedWidgetNode.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/CustomSemanticsPropertyKeyTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/DialogTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/GestureTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/InterceptorTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/LazyListTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleNavigationTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/TouchInputTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/WaitForTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/list/NotScrollableListTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableLazyListTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableListTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/modifier/BackgroundModifierTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KButtonNodeTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KIconNodeTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KProgressIndicatorNodeTest.kt delete mode 100644 sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KTextNodeTest.kt rename sample/src/main/java/io/github/kakaocup/{compose => appium}/sample/MainActivity.kt (98%) delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/BackgroundActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/ButtonActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/CustomSemanticPropertyKeyActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/DelayDisplayActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/DialogActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/IconActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/LazyListScreen.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/NotScrollableListScreen.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/ProgressIndicatorActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableLazyListScreen.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableListScreen.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/SimpleNavigationScreen.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/TextActivity.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListItemIndex.kt delete mode 100644 sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListLength.kt diff --git a/.github/workflows/on-push-master-library.yml b/.github/workflows/on-push-master-library.yml index 2cec0126..2df940d5 100644 --- a/.github/workflows/on-push-master-library.yml +++ b/.github/workflows/on-push-master-library.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-kotlin@v3 with: distribution: "temurin" java-version: 17 diff --git a/.github/workflows/publish-release-workflow.yaml b/.github/workflows/publish-release-workflow.yaml index c2657a9f..42ca6b9a 100644 --- a/.github/workflows/publish-release-workflow.yaml +++ b/.github/workflows/publish-release-workflow.yaml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Set up JDK 17 - uses: actions/setup-java@v1 + uses: actions/setup-kotlin@v1 with: java-version: 17 - uses: little-core-labs/get-git-tag@v3.0.2 diff --git a/.github/workflows/pull-request-library.yml b/.github/workflows/pull-request-library.yml index 4b7e1fb6..9cb08c58 100644 --- a/.github/workflows/pull-request-library.yml +++ b/.github/workflows/pull-request-library.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-kotlin@v3 with: distribution: "zulu" java-version: 17 @@ -30,7 +30,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-kotlin@v3 with: distribution: "zulu" java-version: 17 diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 1f02d34a..46b553dc 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -15,20 +15,17 @@ + - diff --git a/.idea/misc.xml b/.idea/misc.xml index 10b5b506..25308214 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,5 @@ - + diff --git a/README.md b/README.md index 061a8b29..335dc77e 100644 --- a/README.md +++ b/README.md @@ -1,337 +1,17 @@ -# Kakao Compose +# Kakao Appium [![Kotlin version badge](https://img.shields.io/badge/kotlin-2.0.0-blue.svg)](https://kotlinlang.org/) [![Telegram](https://img.shields.io/static/v1?label=Telegram&message=RU&color=0088CC)](https://t.me/kaspresso) [![Telegram](https://img.shields.io/static/v1?label=Telegram&message=EN&color=0088CC)](https://t.me/kaspresso_en) [![Documentation](https://img.shields.io/static/v1?label=Documentation&message=EN&color=008000)](https://kakaocup.github.io/Compose/docs/introduction) -Nice and simple DSL for Espresso Compose in Kotlin +Nice and simple DSL for Appium in Kotlin ![coco](https://user-images.githubusercontent.com/2812510/30947310-3825724c-a433-11e7-8a0d-3c3bfe00d584.png) -#### Benefits -- Readability -- Reusability -- Extensible DSL -- Interceptors - -### Concept -The one of the main concepts of Jetpack Compose is a presentation of UI according to UI tree (UI hierarchy) approach with a parent-children relationships support. -It means that the related UI test library has to support a parent-children relationships for Nodes by default. -It will be discovered below how Kakao Compose library supports mentioned parent-children relationships approach. - -### How to use it -#### Create Screen -Create your entity `ComposeScreen` where you will add the views involved in the interactions of the tests: -```Kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider - ) -``` -`ComposeScreen` can represent the whole user interface or a portion of UI. -If you are using [Page Object pattern](https://martinfowler.com/bliki/PageObject.html) you can put the interactions of Kakao inside the Page Objects. - -Described way of Screen definition is very similar with the way that Kakao library offers. -But, usually, `Screen` in Jetpack Compose is a UI element (Node) too. That's why there is an additional option to declare `ComposeScreen`: -```Kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") } - ) -``` -So, `ComposeScreen` is a `BaseNode`'s inheritor in Kakao-Compose library. And, as you've seen above, there is a possibility to describe -`ComposeScreen` without mandatory `viewBuilderAction` in cases when Screen is an abstraction without clear connection with any Node. - -#### Create KNode -`ComposeScreen` contains `KNode`, these are the Jetpack Compose nodes where you want to do the interactions: -```Kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") } - ) { - - val myButton: KNode = child { - hasTestTag("myTestButton") - } -} -``` - -`myButton` was declared as a child of `MainActivityScreen`. -It means that `myButton` will be calculated using matchers specified in a lambda explicitly and a parent matcher implicitly (`MainActivityScreen`). -Under the hood, the `SemanticMatcher` of `myButton` is equal to `hasTestTag("myTestButton") + hasParent(MainActivityScreen.matcher)`. - -Also, `KNode` can be declared as a child of another `KNode`: -```Kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") } - ) { - - val myButton: KNode = child { - hasTestTag("myTestButton") - } - - val myButton2: KNode = myButton.child { - hasTestTag("myTestButton2") - } -} -``` -`myButton2` will be calculated with the following -`SemanticMatcher = hasTestTag("myTestButton") + hasParent(myButton.matcher) + hasParent(MainActivityScreen.matcher)`. -But, we advise not to abuse inheritance and use only the following chain: "ComposeScreen" - "Element of ComposeScreen". - -The last, `KNode` can be declared without `child` function using only explicit matchers: -```Kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") } - ) { - - val myButton = KNode(this) { - hasTestTag("myTestButton") - } -} -``` - -Every `KNode` contains many matches. Some examples of matchers provided by Kakao Compose: - -* `hasText` -* `hasTestTag` -* and more - -Like in Espresso you can combine different matchers: -```Kotlin -val myButton = KNode(this) { - hasTestTag("myTestButton") - hasText("Button 1") -} -``` - -#### Write the interaction. - -The syntax of the test with Kakao is very easy, once you have the `ComposeScreen` and the `KNode` defined, you only have to apply -the actions or assertions like in Espresso: -```Kotlin -class ExampleInstrumentedTest { - @Rule - @JvmField - val composeTestRule = createAndroidComposeRule() - - @Test - fun simpleTest() { - onComposeScreen(composeTestRule) { - myButton { - assertIsDisplayed() - assertTextContains("Button 1") - } - - onNode { - hasTestTag("doesNotExist") - }.invoke { - assertDoesNotExist() - } - } - } -} -``` - -#### Lazy lists testing - -:warning: This API is experimental and might change in future! - -To test lazy lists such as `LazyRow` or `LazyColumn` you should add `KLazyListNode` into your `ComposeScreen`: -```Kotlin -val list = KLazyListNode( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("LazyList") }, - itemTypeBuilder = { - itemType(::LazyListItemNode) - itemType(::LazyListHeaderNode) - }, - positionMatcher = { position -> SemanticsMatcher.expectValue(LazyListItemPosition, position) } -) -``` - -Inside `itemTypeBuilder` function you should register `KLazyListItemNode` types to differentiate elements in lazy list: -```kotlin -class LazyListItemNode( - semanticsNode: SemanticsNode, - semanticsProvider: SemanticsNodeInteractionsProvider, -) : KLazyListItemNode(semanticsNode, semanticsProvider) - -class LazyListHeaderNode( - semanticsNode: SemanticsNode, - semanticsProvider: SemanticsNodeInteractionsProvider, -) : KLazyListItemNode(semanticsNode, semanticsProvider) { - val title: KNode = child { - hasTestTag("LazyListHeaderTitle") - } -} -``` - -The element position might be changed during the scroll due to lazy list construction, that’s why we should provide `positionMatcher` to determine the element position correctly. It could be achieved in different ways, for example you can determine item position through `TestTag`: -```kotlin -LazyColumn( - Modifier - .fillMaxSize() - .testTag("LazyList") -) { - itemsIndexed(items) { index, item -> - when (item) { - is LazyListItem.Header -> ListItemHeader(item, Modifier.testTag("position=$index")) - is LazyListItem.Item -> ListItemCell(item, Modifier.testTag("position=$index")) - } - } -} -``` - -And then check this position inside `positionMatcher` lambda: -```kotlin -positionMatcher = { position -> hasTestTag("position=$position") } -``` - -But it will be more convenient and less error prone to create custom semantics property and custom modifier: -```kotlin -val LazyListItemPosition = SemanticsPropertyKey("LazyListItemPosition") -var SemanticsPropertyReceiver.lazyListItemPosition by LazyListItemPosition - -fun Modifier.lazyListItemPosition(position: Int): Modifier { - return semantics { lazyListItemPosition = position } -} -``` - -And check an item position with `SemanticsMatcher`: -```kotlin -positionMatcher = { position -> SemanticsMatcher.expectValue(LazyListItemPosition, position) } -``` - -So the typical lazy list test may look like this: -```kotlin - @Test -fun lazyListTest() { - onComposeScreen(composeTestRule) { - list { - firstChild { - title.assertTextEquals("Items from 1 to 10") - } - childWith { - hasText("Item 1") - } perform { - assertTextEquals("Item 1") - } - childAt(10) { - assertTextEquals("Item 10") - } - } - } -} -``` - -Check the lazy list test [example](sample/src/androidTest/java/io/github/kakaocup/compose/test/LazyListTest.kt) for more information. - -#### Intercepting - -If you need to add custom logic during the `Kakao-Compose -> Espresso(Compose)` call chain (for example, logging) or -if you need to completely change the events/commands that are being sent to Espresso -during runtime in some cases, you can use the intercepting mechanism. - -Interceptors are lambdas that you pass to a configuration DSL that will be invoked before calls happening from inside Kakao-Compose. - -You have the ability to provide interceptors at two main different levels: Kakao-Compose runtime and any individual `BaseNode` instance. -Interceptors in Kakao-Compose support a parent-children concept too. -It means that any `BaseNode` inherits interceptors of his parents. - -On each invocation of Espresso function that can be intercepted, Kakao-Compose will aggregate all available interceptors -for this particular call and invoke them in descending order: `Active BaseNode interceptor -> Interceptor of the parent Active BaseNode -> -... -> Kakao-Compose interceptor`. - -Each of the interceptors in the chain can break the chain call by setting `isOverride` to true during configuration. -In that case Kakao-Compose will not only stop invoking remaining interceptors in the chain, **but will not perform the Espresso -call**. It means that in such case, the responsibility to actually invoke Espresso lies on the shoulders -of the developer. - -Here's the examples of intercepting configurations: -```Kotlin -class SomeTest { - @Before - fun setup() { - KakaoCompose { // KakaoCompose runtime - intercept { - onComposeInteraction { - onAll { list.add("ALL") } - onCheck { _, _ -> list.add("CHECK") } - onPerform { _, _ -> list.add("PERFORM") } - } - } - } - } - - @Test - fun test() { - onComposeScreen { - intercept { - onCheck { interaction, assertion -> // Intercept check() call - Log.d("KAKAO", "$interaction is checking $assertion") - } - } - - myView { - intercept { // Intercepting ComposeInteraction calls on this individual Node - onPerform(true) { interaction, action -> // Intercept perform() call and overriding the chain - // When performing actions on this view, Kakao level interceptor will not be called - // and we have to manually call Espresso now. - Log.d("KAKAO_NODE", "$interaction is performing $action") - interaction.perform(action) - } - } - } - } - } -} -``` -For more detailed info please refer to the documentation. - -### `KakaoComposeTestRule` - -By default Espresso using `useUnmergedTree = true` and it create a lot of inconveniences with node matching. -However you can override global parameter with `KakaoComposeTestRule`. - -Every Compose screen require `composeTestRule` whats creating a lot of boilerplate like `onComposeScreen**(composeTestRule)** {` -But you can provide `composeTestRule` into `KakaoComposeTestRule` and use all screens without injection like `onComposeScreen {`, it possible to mix both -of implementation, injected `composeTestRule` will override provided via `KakaoComposeTestRule`. - -You can find examples of it in [Simple project](https://github.com/KakaoCup/Compose/blob/master/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt) - -### Setup -Maven -```xml - - io.github.kakaocup - compose - - pom - -``` -or Gradle: -```groovy -dependencies { - androidTestImplementation 'io.github.kakaocup:compose:' -} -``` - -```kotlin -dependencies { - androidTestImplementation("io.github.kakaocup:compose:") -} -``` ### Contribution Policy -**Kakao Compose** is an open source project, and depends on its users to improve it. We are more than happy to find you interested in taking the project forward. +**Kakao Appium** is an open source project, and depends on its users to improve it. We are more than happy to find you interested in taking the project forward. Kindly refer to the [Contribution Guidelines](https://github.com/kakaocup/compose/blob/master/CONTRIBUTING.md) for detailed information. @@ -341,7 +21,7 @@ Please refer to [Code of Conduct](https://github.com/kakaocup/compose/blob/maste ### License -Kakao Compose is open source and available under the [Apache License, Version 2.0](https://github.com/kakaocup/compose/blob/master/LICENSE). +Kakao Appium is open source and available under the [Apache License, Version 2.0](https://github.com/kakaocup/compose/blob/master/LICENSE). ### Thanks for supporting Open Source diff --git a/compose-semantics/.gitignore b/appium-tests/.gitignore similarity index 100% rename from compose-semantics/.gitignore rename to appium-tests/.gitignore diff --git a/appium-tests/build.gradle.kts b/appium-tests/build.gradle.kts new file mode 100644 index 00000000..eadafd01 --- /dev/null +++ b/appium-tests/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + kotlin("jvm") +} + +kotlin { + jvmToolchain(17) +} + +dependencies { + testImplementation(kotlin("test")) + testImplementation("junit:junit:4.13.2") + testImplementation("io.appium:kotlin-client:9.0.0") + + testImplementation(project(":appium")) +} \ No newline at end of file diff --git a/compose-semantics/proguard-rules.pro b/appium-tests/proguard-rules.pro similarity index 100% rename from compose-semantics/proguard-rules.pro rename to appium-tests/proguard-rules.pro diff --git a/appium-tests/src/test/kotlin/appium/MainActivityScreen.kt b/appium-tests/src/test/kotlin/appium/MainActivityScreen.kt new file mode 100644 index 00000000..1912c31d --- /dev/null +++ b/appium-tests/src/test/kotlin/appium/MainActivityScreen.kt @@ -0,0 +1,15 @@ +package io.github.kakaocup.appium + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.node.element.AppiumScreen +import io.github.kakaocup.appium.node.element.KWebElement + +class MainActivityScreen(driver: AppiumDriver? = null) : AppiumScreen( + driver = driver +) { + val button1: KWebElement = onWebElement { + android { + hasText("Button 1") + } + } +} \ No newline at end of file diff --git a/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt b/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt new file mode 100644 index 00000000..49c9a7bb --- /dev/null +++ b/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt @@ -0,0 +1,43 @@ +// kotlin +package io.github.kakaocup.appium + +import io.appium.java_client.AppiumDriver +import io.appium.java_client.android.AndroidDriver +import io.github.kakaocup.appium.node.element.AppiumScreen.Companion.onAppiumScreen +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.openqa.selenium.remote.DesiredCapabilities +import java.net.URL + +class SimpleAppiumTest { + private lateinit var driver: AppiumDriver + + @Before + fun setUp() { + val caps = DesiredCapabilities().apply { + setCapability("platformName", "Android") + setCapability("deviceName", "emulator-5554") + setCapability("automationName", "UiAutomator2") + setCapability("appPackage", "io.github.kakaocup.sample") + setCapability("appActivity", "io.github.kakaocup.sample.MainActivity") + setCapability("noReset", true) + } + + driver = AndroidDriver(URL("http://127.0.0.1:4723"), caps) + } + + @Test + fun sampleClickAndAssert() { + onAppiumScreen { + button1 { + performClick() + } + } + } + + @After + fun tearDown() { + driver.quit() + } +} \ No newline at end of file diff --git a/compose-test/.gitignore b/appium/.gitignore similarity index 100% rename from compose-test/.gitignore rename to appium/.gitignore diff --git a/appium/build.gradle.kts b/appium/build.gradle.kts new file mode 100644 index 00000000..dd425005 --- /dev/null +++ b/appium/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("convention.library") + id("convention.publishing") +} + +android { + namespace = "io.github.kakaocup.appium" +} + +dependencies { + implementation(libs.androidx.test.ext.junit) + + implementation(libs.java.client) + implementation(libs.selenium.java) + + implementation(kotlin("test")) +} diff --git a/compose-test/proguard-rules.pro b/appium/proguard-rules.pro similarity index 100% rename from compose-test/proguard-rules.pro rename to appium/proguard-rules.pro diff --git a/compose-semantics/src/main/AndroidManifest.xml b/appium/src/main/AndroidManifest.xml similarity index 100% rename from compose-semantics/src/main/AndroidManifest.xml rename to appium/src/main/AndroidManifest.xml diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/KakaoAppium.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/KakaoAppium.kt new file mode 100644 index 00000000..f2ecdca1 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/KakaoAppium.kt @@ -0,0 +1,52 @@ +package io.github.kakaocup.appium + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.intercept.base.Interceptor +import io.github.kakaocup.appium.intercept.interaction.AppiumInteraction +import io.github.kakaocup.appium.intercept.operation.AppiumAction +import io.github.kakaocup.appium.intercept.operation.AppiumAssertion + +object KakaoAppium { + internal var appiumInterceptor: Interceptor? = + null + + /** + * Operator that allows usage of DSL style + * + * @param function Tail lambda with receiver which is your Kakao-Appium runtime + */ + operator fun invoke(function: KakaoAppium.() -> Unit) { + function(this) + } + + /** + * Sets the interceptors for the whole Kakao-Appium runtime. + * Interceptors will be invoked on all of the interactions with the BaseNode instances. + * + * @param configurator Configuration of the interceptors + * + * @see Interceptor + */ + fun intercept(configurator: Interceptor.Configurator.() -> Unit) { + Interceptor.Configurator().apply(configurator).configure().also { (appiumInterceptor) -> + this.appiumInterceptor = appiumInterceptor + } + } + + /** + * Global parameters + */ + + object Global { + /** + * Global Appium Driver can be set via KakaoDriverTestRule + * to avoid injection boilerplate into each AppiumScreen + * @see KakaoAppiumTestRule + */ + var driver: AppiumDriver? = null + } + + fun reset() { + appiumInterceptor = null + } +} diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/exception/KakaoAppiumException.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/exception/KakaoAppiumException.kt new file mode 100644 index 00000000..2b4c2eab --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/exception/KakaoAppiumException.kt @@ -0,0 +1,3 @@ +package io.github.kakaocup.appium.exception + +class KakaoAppiumException(message: String) : Exception(message) \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interception.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interception.kt similarity index 59% rename from compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interception.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interception.kt index e79ddff6..6f8f307b 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interception.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interception.kt @@ -1,3 +1,3 @@ -package io.github.kakaocup.compose.intercept.base +package io.github.kakaocup.appium.intercept.base data class Interception(val isOverride: Boolean, val interceptor: T) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interceptor.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interceptor.kt similarity index 70% rename from compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interceptor.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interceptor.kt index e0629d69..127edf4e 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/base/Interceptor.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/base/Interceptor.kt @@ -1,24 +1,22 @@ -package io.github.kakaocup.compose.intercept.base +package io.github.kakaocup.appium.intercept.base -import androidx.test.espresso.ViewInteraction -import io.github.kakaocup.compose.intercept.base.Interceptor.Builder -import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction -import io.github.kakaocup.compose.intercept.operation.ComposeAction -import io.github.kakaocup.compose.intercept.operation.ComposeAssertion +import io.github.kakaocup.appium.intercept.interaction.AppiumInteraction +import io.github.kakaocup.appium.intercept.operation.AppiumAction +import io.github.kakaocup.appium.intercept.operation.AppiumAssertion /** - * Base class for intercepting the call chain from Kakao-Compose to Compose. + * Base class for intercepting the call chain from Kakao-Appium to Appium. * - * Interceptors can be provided through [KakaoCompose][io.github.kakaocup.compose.KakaoCompose] runtime and - * different [Nodes][io.github.kakaocup.compose.node.core.BaseNode]. + * Interceptors can be provided through [KakaoAppium][io.github.kakaocup.appium.KakaoAppium] runtime and + * different [Nodes][io.github.kakaocup.appium.node.core.BaseNode]. * - * Interceptors are stacked during the runtime for any Kakao-Compose `check` and `perform` operations. - * The stack ordering is following: current BaseNode interceptor -> current BaseNode parents' interceptors -> Kakao-Compose interceptor. + * Interceptors are stacked during the runtime for any Kakao-Appium `check` and `perform` operations. + * The stack ordering is following: current BaseNode interceptor -> current BaseNode parents' interceptors -> Kakao-Appium interceptor. * * Any of the interceptors in the chain can break the chain call by setting `isOverride` to true * in [onCheck][Builder.onCheck], [onPerform][Builder.onPerform] or [onAll][Builder.onAll] interception * functions during the configuration. Doing this will not only prevent underlying - * interceptors from being invoked, but prevents Kakao-Compose from executing the operation. In that case, + * interceptors from being invoked, but prevents Kakao-Appium from executing the operation. In that case, * responsibility for actually making Espresso call lies on developer. * * For each operation the interceptor invocation cycle will be as follows: @@ -32,9 +30,9 @@ import io.github.kakaocup.compose.intercept.operation.ComposeAssertion * onPerform?.invoke() * ``` * - * @see io.github.kakaocup.compose.KakaoCompose - * @see io.github.kakaocup.compose.node.core.BaseNode - * @see io.github.kakaocup.compose.intercept.delegate.ComposeInterceptable + * @see io.github.kakaocup.appium.KakaoAppium + * @see io.github.kakaocup.appium.node.core.BaseNode + * @see io.github.kakaocup.appium.intercept.delegate.AppiumInterceptable */ class Interceptor( val onCheck: Interception<(INTERACTION, ASSERTION) -> Unit>?, @@ -89,7 +87,8 @@ class Interceptor( onAll = Interception(isOverride, interceptor) } - internal fun build(): Interceptor = Interceptor(onCheck, onPerform, onAll) + internal fun build(): Interceptor = + Interceptor(onCheck, onPerform, onAll) } /** @@ -100,23 +99,25 @@ class Interceptor( * @see io.github.kakaocup.kakao.screen.Screen */ class Configurator { - private var composeInterceptor: Interceptor? = null + private var appiumInterceptor: Interceptor? = + null /** * Setups the interceptor for `check` and `perform` operations happening through [ViewInteraction] * * @param builder Builder of interceptor for [ViewInteraction] */ - fun onComposeInteraction(builder: Builder.() -> Unit) { - composeInterceptor = Builder().apply(builder).build() + fun onAppiumInteraction(builder: Builder.() -> Unit) { + appiumInterceptor = + Builder().apply(builder).build() } internal fun configure() = Configuration( - composeInterceptor + appiumInterceptor ) } data class Configuration( - val composeInterceptor: Interceptor?, + val composeInterceptor: Interceptor?, ) } diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/AppiumInterceptable.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/AppiumInterceptable.kt new file mode 100644 index 00000000..15205803 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/AppiumInterceptable.kt @@ -0,0 +1,32 @@ +package io.github.kakaocup.appium.intercept.delegate + +import io.github.kakaocup.appium.intercept.base.Interceptor +import io.github.kakaocup.appium.intercept.interaction.AppiumInteraction +import io.github.kakaocup.appium.intercept.operation.AppiumAction +import io.github.kakaocup.appium.intercept.operation.AppiumAssertion + +interface AppiumInterceptable { + + val delegate: WebElementDelegate + + /** + * Sets the interceptors for the instance. + * Interceptors will be invoked on the interaction with the BaseNode. + * + * @param builder Builder of the interceptors + * + * @see Interceptor + */ + fun intercept(builder: Interceptor.Builder.() -> Unit) { + delegate.currentInterceptor = + Interceptor.Builder() + .apply(builder).build() + } + + /** + * Removes the interceptors from the instance. + */ + fun reset() { + delegate.currentInterceptor = null + } +} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/Delegate.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/Delegate.kt similarity index 83% rename from compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/Delegate.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/Delegate.kt index cb159b22..5c0879d5 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/Delegate.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/Delegate.kt @@ -1,10 +1,10 @@ -package io.github.kakaocup.compose.intercept.delegate +package io.github.kakaocup.appium.intercept.delegate -import io.github.kakaocup.compose.intercept.base.Interceptor -import io.github.kakaocup.compose.intercept.interaction.Interaction +import io.github.kakaocup.appium.intercept.base.Interceptor +import io.github.kakaocup.appium.intercept.interaction.Interaction /** - * Base delegate interface for Kakao-Compose. + * Base delegate interface for Kakao-Appium. * * Provides functionality of aggregating interceptors and invoking them on `check` * and `perform` functions. @@ -63,14 +63,20 @@ interface Delegate : Interaction, assertion: ASSERTION): Boolean { + private fun interceptOnCheck( + interceptor: Interceptor, + assertion: ASSERTION + ): Boolean { return interceptor.onCheck?.let { (isOverride, interception) -> interception(interaction, assertion) isOverride } ?: false } - private fun interceptOnPerform(interceptor: Interceptor, action: ACTION): Boolean { + private fun interceptOnPerform( + interceptor: Interceptor, + action: ACTION + ): Boolean { return interceptor.onPerform?.let { (isOverride, interception) -> interception(interaction, action) isOverride diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/WebElementDelegate.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/WebElementDelegate.kt new file mode 100644 index 00000000..c730b762 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/delegate/WebElementDelegate.kt @@ -0,0 +1,51 @@ +package io.github.kakaocup.appium.intercept.delegate + +import io.github.kakaocup.appium.KakaoAppium +import io.github.kakaocup.appium.intercept.base.Interceptor +import io.github.kakaocup.appium.intercept.interaction.AppiumInteraction +import io.github.kakaocup.appium.intercept.operation.AppiumAction +import io.github.kakaocup.appium.intercept.operation.AppiumAssertion +import io.github.kakaocup.appium.intercept.operation.AppiumOperationType +import io.github.kakaocup.appium.intercept.operation.produceAppiumAction +import io.github.kakaocup.appium.intercept.operation.produceAppiumAssertion +import io.github.kakaocup.appium.node.builder.WebElementProvider +import org.openqa.selenium.WebElement + +/** + * Compose implementation of Base delegate interface for Kakao-Compose + */ +class WebElementDelegate( + nodeProvider: WebElementProvider, + private val parentDelegate: WebElementDelegate?, +) : Delegate { + + var currentInterceptor: Interceptor? = null + + override val interaction = AppiumInteraction(nodeProvider) + + override val nodeInterceptors: () -> Iterable> = + { + val currentList = currentInterceptor?.let { listOf(it) } ?: emptyList() + val parentList = parentDelegate?.nodeInterceptors?.invoke() ?: emptyList() + currentList + parentList + } + + override val globalInterceptor: () -> Interceptor? = + { KakaoAppium.appiumInterceptor } + + fun check( + type: AppiumOperationType, + description: String? = null, + webElement: WebElement.() -> Unit + ) { + check(produceAppiumAssertion(type, description, webElement)) + } + + fun perform( + type: AppiumOperationType, + description: String? = null, + webElement: WebElement.() -> Unit + ) { + perform(produceAppiumAction(type, description, webElement)) + } +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/AppiumInteraction.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/AppiumInteraction.kt new file mode 100644 index 00000000..f461b666 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/AppiumInteraction.kt @@ -0,0 +1,32 @@ +package io.github.kakaocup.appium.intercept.interaction + +import io.github.kakaocup.appium.intercept.operation.AppiumAction +import io.github.kakaocup.appium.intercept.operation.AppiumAssertion +import io.github.kakaocup.appium.node.builder.WebElementProvider +import org.openqa.selenium.WebElement + +class AppiumInteraction( + val appiumWebElementProvider: WebElementProvider, +) : Interaction { + + var webElement: WebElement = appiumWebElementProvider.provideWebElement() + private set + + override fun check(assertion: AppiumAssertion) { + assertion.execute(webElement) + } + + override fun perform(action: AppiumAction) { + action.execute(webElement) + } + + fun reFindNode() { + webElement = appiumWebElementProvider.provideWebElement() + } + + override fun toString(): String { + val nodeMatcher = appiumWebElementProvider.webElementMatcher + return "by: ${nodeMatcher.by}; " + + "position: ${nodeMatcher.position};" + } +} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/Interaction.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/Interaction.kt similarity index 75% rename from compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/Interaction.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/Interaction.kt index 68d4ccef..785b3307 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/Interaction.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/interaction/Interaction.kt @@ -1,7 +1,7 @@ -package io.github.kakaocup.compose.intercept.interaction +package io.github.kakaocup.appium.intercept.interaction /** - * Base Interaction interface for Kakao-Compose + * Base Interaction interface for Kakao-Appium * * Inspired by the idea from legacy UI system where all interactions with a View are possible through only two methods: `check` and `perform`. * Such approach allows to introduce Interceptors simply. diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperation.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperation.kt similarity index 55% rename from compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperation.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperation.kt index b75e72e8..427e2b4e 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperation.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperation.kt @@ -1,11 +1,11 @@ -package io.github.kakaocup.compose.intercept.operation +package io.github.kakaocup.appium.intercept.operation /** * Responsible for executing an interaction on the element of Jetpack Compose */ -interface ComposeOperation { +interface AppiumOperation { - val type: ComposeOperationType + val type: AppiumOperationType val description: String? diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationImpl.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationImpl.kt new file mode 100644 index 00000000..d474c844 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationImpl.kt @@ -0,0 +1,33 @@ +package io.github.kakaocup.appium.intercept.operation + +import org.openqa.selenium.WebElement + +interface AppiumAction : AppiumOperation + +interface AppiumAssertion : AppiumOperation + +fun produceAppiumAction( + type: AppiumOperationType, + description: String?, + webElement: WebElement.() -> Unit +): AppiumAction = object : AppiumAction { + override val type = type + override val description: String? = description + override fun execute(innerWebElement: WebElement) = webElement.invoke(innerWebElement) + override fun toString(): String { + return "AppiumAction (description=$description)" + } +} + +fun produceAppiumAssertion( + type: AppiumOperationType, + description: String?, + webElement: WebElement.() -> Unit +): AppiumAssertion = object : AppiumAssertion { + override val type = type + override val description: String? = description + override fun execute(innerWebElement: WebElement) = webElement.invoke(innerWebElement) + override fun toString(): String { + return "AppiumAssertion (escription=$description)" + } +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationType.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationType.kt new file mode 100644 index 00000000..d8693ce5 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/intercept/operation/AppiumOperationType.kt @@ -0,0 +1,8 @@ +package io.github.kakaocup.appium.intercept.operation + +/** + * Type of the concrete action executing on the given element of Appium + */ +interface AppiumOperationType { + val name: String +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/TextActions.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/TextActions.kt new file mode 100644 index 00000000..ae0ac236 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/TextActions.kt @@ -0,0 +1,21 @@ +package io.github.kakaocup.appium.node.action + +import io.github.kakaocup.appium.intercept.delegate.WebElementDelegate +import io.github.kakaocup.appium.intercept.operation.AppiumOperationType + +interface TextActions { + val delegate: WebElementDelegate + + /** + * Sends the given text to this node in similar way to IME. + * + * @param text Text to send. + */ + fun performTextInput(text: String) { + delegate.perform(AppiumTextActionType.PERFORM_TEXT_INPUT) { performTextInput(text) } + } + + enum class AppiumTextActionType : AppiumOperationType { + PERFORM_TEXT_INPUT, + } +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/WebElementActions.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/WebElementActions.kt new file mode 100644 index 00000000..0e171667 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/action/WebElementActions.kt @@ -0,0 +1,19 @@ +package io.github.kakaocup.appium.node.action + +import io.github.kakaocup.appium.intercept.delegate.WebElementDelegate +import io.github.kakaocup.appium.intercept.operation.AppiumOperationType + +interface WebElementActions { + val delegate: WebElementDelegate + + /** + * Performs a click action on the element represented by the given web element. + */ + fun performClick() { + delegate.perform(AppiumBaseActionType.PERFORM_CLICK) { this.click() } + } + + enum class AppiumBaseActionType : AppiumOperationType { + PERFORM_CLICK, + } +} diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/assertion/WebElementAssertions.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/assertion/WebElementAssertions.kt new file mode 100644 index 00000000..b93ccb23 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/assertion/WebElementAssertions.kt @@ -0,0 +1,19 @@ +package io.github.kakaocup.appium.node.assertion + +import io.github.kakaocup.appium.intercept.delegate.WebElementDelegate +import io.github.kakaocup.appium.intercept.operation.AppiumOperationType +import kotlin.test.assertEquals + +interface WebElementAssertions { + val delegate: WebElementDelegate + + fun assertTextEquals(text: String) { + delegate.check(AppiumBaseAssertionType.ASSERT_TEXT_EQUALS) { + assertEquals(text, this.text) + } + } + + enum class AppiumBaseAssertionType : AppiumOperationType { + ASSERT_TEXT_EQUALS, + } +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/ViewBuilder.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/ViewBuilder.kt new file mode 100644 index 00000000..a39226f5 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/ViewBuilder.kt @@ -0,0 +1,64 @@ +package io.github.kakaocup.appium.node.builder + +import io.appium.java_client.AppiumDriver +import io.appium.java_client.android.AndroidDriver +import io.appium.java_client.ios.IOSDriver +import io.github.kakaocup.appium.node.builder.patform.AndroidDataMatcher +import io.github.kakaocup.appium.node.builder.patform.DataMatcher +import io.github.kakaocup.appium.node.builder.patform.IOSDataMatcher +import io.github.kakaocup.appium.node.core.AppiumMarker +import org.openqa.selenium.By +import org.openqa.selenium.support.pagefactory.ByAll + +@AppiumMarker +class ViewBuilder { + private enum class Platform { + ANDROID, + IOS, + DEFAULT, + } + + private val byPlatformList = mutableMapOf>() + + private var position = 0 + + fun android(android: AndroidDataMatcher.() -> Unit) { + val matcher = AndroidDataMatcher().apply(android) + byPlatformList[Platform.ANDROID] = matcher.matchers + } + + fun ios(ios: IOSDataMatcher.() -> Unit) { + val matcher = IOSDataMatcher().apply(ios) + byPlatformList[Platform.IOS] = matcher.matchers + } + + fun default(default: DataMatcher.() -> Unit) { + val matcher = DataMatcher().apply(default) + byPlatformList[Platform.DEFAULT] = matcher.matchers + } + + /** + * Returns whether the node matches exactly to the given custom matcher. + */ + fun hasPosition(position: Int) { + this.position = position + } + + fun build(driver: AppiumDriver): WebElementMatcher { + byPlatformList[ + when (driver) { + is AndroidDriver -> Platform.ANDROID + is IOSDriver -> Platform.IOS + else -> Platform.DEFAULT + }] + ?: byPlatformList[Platform.DEFAULT]?.let { + return WebElementMatcher( + by = ByAll(*it.toTypedArray()), + position = position + ) + } + throw ViewBuilderException("Please set matchers for your platform or use default") + } +} + +private class ViewBuilderException(message: String) : RuntimeException(message) diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementMatcher.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementMatcher.kt new file mode 100644 index 00000000..fff29d50 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementMatcher.kt @@ -0,0 +1,8 @@ +package io.github.kakaocup.appium.node.builder + +import org.openqa.selenium.By + +data class WebElementMatcher( + val by: By, + val position: Int = 0, +) \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementProvider.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementProvider.kt new file mode 100644 index 00000000..e7f99da7 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/WebElementProvider.kt @@ -0,0 +1,14 @@ +package io.github.kakaocup.appium.node.builder + +import io.appium.java_client.AppiumDriver +import org.openqa.selenium.WebElement + +class WebElementProvider( + val webElementMatcher: WebElementMatcher, + private val driver: AppiumDriver, +) { + + fun provideWebElement(): WebElement { + return driver.findElement(webElementMatcher.by) + } +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/AndroidDataMatcher.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/AndroidDataMatcher.kt new file mode 100644 index 00000000..b1f05105 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/AndroidDataMatcher.kt @@ -0,0 +1,8 @@ +package io.github.kakaocup.appium.node.builder.patform + +import io.appium.java_client.AppiumBy + +class AndroidDataMatcher : DataMatcher() { + fun hasId(id: String) = addFilter(AppiumBy.ByAndroidDataMatcher.id(id)) + fun hasTag(tag: String) = addFilter(AppiumBy.ByAndroidDataMatcher.androidViewTag(tag)) +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/DataMatcher.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/DataMatcher.kt new file mode 100644 index 00000000..b0d5515a --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/DataMatcher.kt @@ -0,0 +1,13 @@ +package io.github.kakaocup.appium.node.builder.patform + +import org.openqa.selenium.By + +open class DataMatcher { + val matchers = mutableListOf() + + fun addFilter(matcher: By) { + matchers.add(matcher) + } + + fun hasText(text: String) = addFilter(By.xpath("//*[text()='$text']")) +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/IOSDataMatcher.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/IOSDataMatcher.kt new file mode 100644 index 00000000..ae965abb --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/builder/patform/IOSDataMatcher.kt @@ -0,0 +1,8 @@ +package io.github.kakaocup.appium.node.builder.patform + +import io.appium.java_client.AppiumBy + +class IOSDataMatcher : DataMatcher() { + fun hasNsPredicate(predicate: String) = + addFilter(AppiumBy.ByIosNsPredicate.iOSNsPredicateString(predicate)) +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/AppiumMarker.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/AppiumMarker.kt new file mode 100644 index 00000000..200fd37e --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/AppiumMarker.kt @@ -0,0 +1,4 @@ +package io.github.kakaocup.appium.node.core + +@DslMarker +annotation class AppiumMarker \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/BaseNode.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/BaseNode.kt new file mode 100644 index 00000000..4d8284f3 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/BaseNode.kt @@ -0,0 +1,77 @@ +package io.github.kakaocup.appium.node.core + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.intercept.delegate.AppiumInterceptable +import io.github.kakaocup.appium.intercept.delegate.WebElementDelegate +import io.github.kakaocup.appium.node.action.TextActions +import io.github.kakaocup.appium.node.action.WebElementActions +import io.github.kakaocup.appium.node.assertion.WebElementAssertions +import io.github.kakaocup.appium.node.builder.ViewBuilder +import io.github.kakaocup.appium.node.builder.WebElementMatcher +import io.github.kakaocup.appium.node.builder.WebElementProvider +import io.github.kakaocup.appium.utilities.checkNotNull +import org.openqa.selenium.By +import org.openqa.selenium.support.pagefactory.ByAll + +@AppiumMarker +abstract class BaseNode> constructor( + var driver: AppiumDriver? = null, + private var webElementMatcher: WebElementMatcher? = null, + private var parentNode: BaseNode<*>? = null, +) : KDSL, + WebElementAssertions, + WebElementActions, + TextActions, + AppiumInterceptable { + + constructor( + driver: AppiumDriver? = null, + viewBuilderAction: ViewBuilder.() -> Unit, + ) : this( + driver = driver, + webElementMatcher = ViewBuilder().apply(viewBuilderAction).build(driver.checkNotNull()), + parentNode = null + ) + + constructor( + driver: AppiumDriver? = null, + webElementMatcher: WebElementMatcher, + ) : this( + driver = driver, + webElementMatcher = webElementMatcher, + parentNode = null + ) + + override val delegate: WebElementDelegate by lazy(LazyThreadSafetyMode.NONE) { + WebElementDelegate( + nodeProvider = WebElementProvider( + webElementMatcher = WebElementMatcher( + by = combineSemanticMatchers(), + position = 0, + ), + driver = driver.checkNotNull() + ), + parentDelegate = parentNode?.delegate + ) + } + + /*** + * Combines semantic matchers from all ancestor nodes + */ + private fun combineSemanticMatchers(): By { + val semanticsMatcherList = mutableListOf() + var parent = this.parentNode + + /* + while (parent != null) { + semanticsMatcherList.add() + semanticsMatcherList.add(hasAnyAncestor(parent.nodeMatcher.checkNotNull().matcher)) + parent = parent.parentNode + } + + */ + semanticsMatcherList.add(this.webElementMatcher.checkNotNull()) + + return ByAll(*semanticsMatcherList.map { it.by }.toTypedArray()) + } +} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/KDSL.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/KDSL.kt similarity index 84% rename from compose/src/main/kotlin/io/github/kakaocup/compose/node/core/KDSL.kt rename to appium/src/main/kotlin/io/github/kakaocup/appium/node/core/KDSL.kt index 91169a64..753c9fe2 100644 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/KDSL.kt +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/core/KDSL.kt @@ -1,4 +1,4 @@ -package io.github.kakaocup.compose.node.core +package io.github.kakaocup.appium.node.core @Suppress("UNCHECKED_CAST") interface KDSL { diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/AppiumScreen.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/AppiumScreen.kt new file mode 100644 index 00000000..986a71ae --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/AppiumScreen.kt @@ -0,0 +1,41 @@ +package io.github.kakaocup.appium.node.element + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.node.builder.ViewBuilder +import io.github.kakaocup.appium.node.core.AppiumMarker +import io.github.kakaocup.appium.node.core.BaseNode +import io.github.kakaocup.appium.utilities.checkNotNull +import io.github.kakaocup.appium.utilities.orGlobal + +@Suppress("UNCHECKED_CAST") +@AppiumMarker +open class AppiumScreen> : BaseNode { + constructor( + driver: AppiumDriver? = null, + ) : super(driver) + + fun onWebElement(viewBuilderAction: ViewBuilder.() -> Unit) = KWebElement( + driver.orGlobal().checkNotNull(), + viewBuilderAction, + ) + + companion object { + inline fun > onAppiumScreen( + diver: AppiumDriver, + noinline function: T.() -> Unit, + ): T = T::class.java + .getDeclaredConstructor( + AppiumDriver::class.java + ) + .newInstance(diver) + .apply { this(function) } + + inline fun > onAppiumScreen( + noinline function: T.() -> Unit, + ): T = + T::class.java.getDeclaredConstructor() + .newInstance() + .apply { this(function) } + + } +} diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/KWebElement.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/KWebElement.kt new file mode 100644 index 00000000..3a3b9651 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/node/element/KWebElement.kt @@ -0,0 +1,25 @@ +package io.github.kakaocup.appium.node.element + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.node.builder.ViewBuilder +import io.github.kakaocup.appium.node.builder.WebElementMatcher +import io.github.kakaocup.appium.node.core.BaseNode + +open class KWebElement : BaseNode { + + constructor( + driver: AppiumDriver? = null, + nodeMatcher: WebElementMatcher, + parentNode: BaseNode<*>? = null, + ) : super(driver, nodeMatcher, parentNode) + + constructor( + driver: AppiumDriver? = null, + viewBuilderAction: ViewBuilder.() -> Unit, + ) : super(driver, viewBuilderAction) + + constructor( + driver: AppiumDriver? = null, + nodeMatcher: WebElementMatcher, + ) : super(driver, nodeMatcher) +} \ No newline at end of file diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/rule/KakaoAppiumTestRule.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/rule/KakaoAppiumTestRule.kt new file mode 100644 index 00000000..ac4d3db6 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/rule/KakaoAppiumTestRule.kt @@ -0,0 +1,24 @@ +package io.github.kakaocup.appium.rule + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.KakaoAppium +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +class KakaoAppiumTestRule( + val driver: AppiumDriver? = null, +) : TestRule { + override fun apply(base: Statement, description: Description): Statement = + object : Statement() { + override fun evaluate() { + val preEvaluatedDriver = KakaoAppium.Global.driver + driver?.let { KakaoAppium.Global.driver = it } + + base.evaluate() + + KakaoAppium.Global.driver = preEvaluatedDriver + } + } +} + diff --git a/appium/src/main/kotlin/io/github/kakaocup/appium/utilities/Extensions.kt b/appium/src/main/kotlin/io/github/kakaocup/appium/utilities/Extensions.kt new file mode 100644 index 00000000..8fd60f34 --- /dev/null +++ b/appium/src/main/kotlin/io/github/kakaocup/appium/utilities/Extensions.kt @@ -0,0 +1,17 @@ +package io.github.kakaocup.appium.utilities + +import io.appium.java_client.AppiumDriver +import io.github.kakaocup.appium.KakaoAppium +import io.github.kakaocup.appium.exception.KakaoAppiumException +import io.github.kakaocup.appium.node.builder.WebElementMatcher + +fun AppiumDriver?.orGlobal(): AppiumDriver? = + this ?: KakaoAppium.Global.driver + +fun AppiumDriver?.checkNotNull(): AppiumDriver = + this + ?: throw KakaoAppiumException("Appium Driver is null: Provide via constructor or use KakaoAppiumTestRule") + +fun WebElementMatcher?.checkNotNull(): WebElementMatcher = + this + ?: throw KakaoAppiumException("NodeMatcher is null: Provide via constructor or use 'initSemantics' method") \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Github.kt b/buildSrc/src/main/kotlin/Github.kt index c4efbbbc..a713ee0b 100644 --- a/buildSrc/src/main/kotlin/Github.kt +++ b/buildSrc/src/main/kotlin/Github.kt @@ -2,8 +2,8 @@ import org.kohsuke.github.GitHubBuilder class Github(private val token: String) { private val github by lazy { GitHubBuilder().withOAuthToken(token).build() } - private val composeRepo by lazy { github.getRepository("kakaocup/compose") } + private val appiumRepo by lazy { github.getRepository("kakaocup/appium") } - val collaborators by lazy { composeRepo.collaborators } - val contributors by lazy { composeRepo.statistics.contributorStats.map { it.author }.toSet() } + val collaborators by lazy { appiumRepo.collaborators } + val contributors by lazy { appiumRepo.statistics.contributorStats.map { it.author }.toSet() } } diff --git a/compose-semantics/build.gradle.kts b/compose-semantics/build.gradle.kts deleted file mode 100644 index 5becaf14..00000000 --- a/compose-semantics/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id("convention.library") - id("convention.publishing") -} - -android { - namespace = "io.github.kakaocup.compose.semantics" -} - -dependencies { - implementation(libs.androidx.compose.material) - implementation(libs.androidx.compose.ui.uiTooling) -} diff --git a/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsBackgroundKt.kt b/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsBackgroundKt.kt deleted file mode 100644 index 0e29e16b..00000000 --- a/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsBackgroundKt.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.kakaocup.compose.semantics - -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver - -val BackgroundShapeSemanticKey = SemanticsPropertyKey("BackgroundShape") -val BackgroundBrushSemanticKey = SemanticsPropertyKey("BackgroundBrush") -val BackgroundAlphaSemanticKey = SemanticsPropertyKey("BackgroundAlpha") - -var SemanticsPropertyReceiver.backgroundShape by BackgroundShapeSemanticKey -var SemanticsPropertyReceiver.backgroundBrush by BackgroundBrushSemanticKey -var SemanticsPropertyReceiver.backgroundAlpha by BackgroundAlphaSemanticKey diff --git a/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsKt.kt b/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsKt.kt deleted file mode 100644 index af45c290..00000000 --- a/compose-semantics/src/main/kotlin/io/github/kakaocup/compose/semantics/SemanticsKt.kt +++ /dev/null @@ -1,86 +0,0 @@ -package io.github.kakaocup.compose.semantics - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.TextUnit - -val BackgroundColorSemanticKey = SemanticsPropertyKey("BackgroundColor") -var SemanticsPropertyReceiver.backgroundColor by BackgroundColorSemanticKey - -val BorderSemanticKey = SemanticsPropertyKey("Border") -var SemanticsPropertyReceiver.border by BorderSemanticKey - -val ColorSemanticKey = SemanticsPropertyKey("Color") -var SemanticsPropertyReceiver.color by ColorSemanticKey - -val ContentPaddingSemanticKey = SemanticsPropertyKey("ContentPadding") -var SemanticsPropertyReceiver.contentPadding by ContentPaddingSemanticKey - -val FontSizeSemanticKey = SemanticsPropertyKey("FontSize") -var SemanticsPropertyReceiver.fontSize by FontSizeSemanticKey - -val FontStyleSemanticKey = SemanticsPropertyKey("FontStyle") -var SemanticsPropertyReceiver.fontStyle by FontStyleSemanticKey - -val FontWeightSemanticKey = SemanticsPropertyKey("FontWeight") -var SemanticsPropertyReceiver.fontWeight by FontWeightSemanticKey - -val FontFamilySemanticKey = SemanticsPropertyKey("FontFamily") -var SemanticsPropertyReceiver.fontFamily by FontFamilySemanticKey - -val ImageContentSemanticKey = SemanticsPropertyKey("ImageContent") -var SemanticsPropertyReceiver.imageContent by ImageContentSemanticKey - -val LetterSpacingSizeSemanticKey = SemanticsPropertyKey("LetterSpacing") -var SemanticsPropertyReceiver.letterSpacing by LetterSpacingSizeSemanticKey - -val LineHeightSemanticKey = SemanticsPropertyKey("LineHeight") -var SemanticsPropertyReceiver.lineHeight by LineHeightSemanticKey - -val MaxLinesSemanticKey = SemanticsPropertyKey("MaxLines") -var SemanticsPropertyReceiver.maxLines by MaxLinesSemanticKey - -val MinLinesSemanticKey = SemanticsPropertyKey("MinLines") -var SemanticsPropertyReceiver.minLines by MinLinesSemanticKey - -val OverflowSemanticKey = SemanticsPropertyKey("Overflow") -var SemanticsPropertyReceiver.overflow by OverflowSemanticKey - -val ProgressSemanticKey = SemanticsPropertyKey("Progress") -var SemanticsPropertyReceiver.progress by ProgressSemanticKey - -val ShapeSemanticKey = SemanticsPropertyKey("Shape") -var SemanticsPropertyReceiver.shape by ShapeSemanticKey - -val SoftWrapSemanticKey = SemanticsPropertyKey("SoftWrap") -var SemanticsPropertyReceiver.softWrap by SoftWrapSemanticKey - -val StrokeCapSemanticKey = SemanticsPropertyKey("StrokeCap") -var SemanticsPropertyReceiver.strokeCap by StrokeCapSemanticKey - -val StrokeWidthSemanticKey = SemanticsPropertyKey("StrokeWidth") -var SemanticsPropertyReceiver.strokeWidth by StrokeWidthSemanticKey - -val TextAlignSemanticKey = SemanticsPropertyKey("TextAlign") -var SemanticsPropertyReceiver.textAlign by TextAlignSemanticKey - -val TextColorSemanticKey = SemanticsPropertyKey("TextColor") -var SemanticsPropertyReceiver.textColor by TextColorSemanticKey - -val TextDecorationSemanticKey = SemanticsPropertyKey("TextDecoration") -var SemanticsPropertyReceiver.textDecoration by TextDecorationSemanticKey - -val TintColorSemanticKey = SemanticsPropertyKey("TintColor") -var SemanticsPropertyReceiver.tintColor by TintColorSemanticKey diff --git a/compose-test/build.gradle.kts b/compose-test/build.gradle.kts deleted file mode 100644 index 1d07909d..00000000 --- a/compose-test/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id("convention.library") - id("convention.publishing") -} - -android { - namespace = "io.github.kakaocup.compose.test" -} - -dependencies { - implementation(project(":compose")) - implementation(project(":compose-semantics")) - - implementation(libs.androidx.compose.ui.uiTooling) - implementation(libs.androidx.compose.material) - implementation(libs.androidx.compose.ui.uiTestJunit4) -} diff --git a/compose-test/src/main/AndroidManifest.xml b/compose-test/src/main/AndroidManifest.xml deleted file mode 100644 index 8072ee00..00000000 --- a/compose-test/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Background.kt b/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Background.kt deleted file mode 100644 index 2e504a75..00000000 --- a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Background.kt +++ /dev/null @@ -1,95 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.semantics.BackgroundAlphaSemanticKey -import io.github.kakaocup.compose.semantics.BackgroundBrushSemanticKey -import io.github.kakaocup.compose.semantics.BackgroundColorSemanticKey -import io.github.kakaocup.compose.semantics.BackgroundShapeSemanticKey - -/** - * Asserts that the compose view background color contains the given [color]. - * - * Throws [AssertionError] if the compose view background color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundColorSemanticKey] modifier. - */ -fun KNode.assertBackgroundColorEquals(color: Color) { - assertHasProperty( - color, - BackgroundColorSemanticKey, - "color", - ) -} - -/** - * Asserts that the compose view background color contains the given [color]. - * - * Throws [AssertionError] if the compose view background color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundColorSemanticKey] modifier. - * Throws [IllegalArgumentException] if the color value is incorrect. - */ -fun KNode.assertBackgroundColorEquals(color: String) { - assertHasProperty( - Color(android.graphics.Color.parseColor(color)), - BackgroundColorSemanticKey, - "color", - ) -} - -/** - * Asserts that the compose view background color contains the given [color]. - * - * Throws [AssertionError] if the compose view background color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundColorSemanticKey] modifier. - */ -fun KNode.assertBackgroundColorEquals(color: Long) { - assertHasProperty( - Color(color), - BackgroundColorSemanticKey, - "color", - ) -} - -/** - * Asserts that the compose view background shape contains the given [shape]. - * - * Throws [AssertionError] if the compose view background shape value is not equal to `shape`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundShapeSemanticKey] modifier. - */ -fun KNode.assertBackgroundShapeEquals(shape: Shape) { - assertHasProperty( - shape, - BackgroundShapeSemanticKey, - "shape", - ) -} - -/** - * Asserts that the compose view background brush contains the given [brush]. - * - * Throws [AssertionError] if the compose view background brush value is not equal to `brush`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundBrushSemanticKey] modifier. - */ -fun KNode.assertBackgroundBrushEquals(brush: Brush) { - assertHasProperty( - brush, - BackgroundBrushSemanticKey, - "brush", - ) -} - -/** - * Asserts that the compose view background brush contains the given [alpha]. - * - * Throws [AssertionError] if the compose view background alpha value is not equal to `alpha`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundAlphaSemanticKey] modifier. - */ -fun KNode.assertBackgroundAlphaEquals(alpha: Float) { - assertHasProperty( - alpha, - BackgroundAlphaSemanticKey, - "alpha", - ) -} diff --git a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt b/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt deleted file mode 100644 index c7600808..00000000 --- a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt +++ /dev/null @@ -1,74 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.semantics.BorderSemanticKey -import io.github.kakaocup.compose.semantics.ContentPaddingSemanticKey -import io.github.kakaocup.compose.semantics.ShapeSemanticKey - -open class KButtonNode : BaseNode { - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : super(semanticsProvider, nodeMatcher) - - /** - * Asserts that the shape is equal the given [shape]. - * - * Throws [AssertionError] if the button shape is not equal to `shape`. - * Throws [IllegalStateException] if the compose view does not contain the [ShapeSemanticKey] modifier. - */ - fun assertShapeEquals(shape: Shape) { - assertHasProperty( - shape, - ShapeSemanticKey, - "shape", - ) - } - - /** - * Asserts that the border stroke is equal the given [borderStroke]. - * - * Throws [AssertionError] if the button border stroke is not equal to `borderStroke`. - * Throws [IllegalStateException] if the compose view does not contain the [ShapeSemanticKey] modifier. - */ - fun assertBorderStrokeEquals(borderStroke: BorderStroke) { - assertHasProperty( - borderStroke, - BorderSemanticKey, - "border stroke", - ) - } - - - - /** - * Asserts that the content padding is equal the given [contentPadding]. - * - * Throws [AssertionError] if the content padding is not equal to `contentPadding`. - * Throws [IllegalStateException] if the compose view does not contain the [ContentPaddingSemanticKey] modifier. - */ - fun assertPaddingValuesEquals(contentPadding: PaddingValues) { - assertHasProperty( - contentPadding, - ContentPaddingSemanticKey, - "content padding", - ) - } -} diff --git a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt b/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt deleted file mode 100644 index 95746d98..00000000 --- a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt +++ /dev/null @@ -1,96 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.annotation.DrawableRes -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.semantics.ImageContentSemanticKey -import io.github.kakaocup.compose.semantics.TintColorSemanticKey - -open class KIconNode : BaseNode { - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : super(semanticsProvider, nodeMatcher) - - /** - * Asserts that the compose view tint color contains the given [color]. - * - * Throws [AssertionError] if the compose view tint color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TintColorSemanticKey] modifier. - */ - fun assertTintColorEquals(color: Color) { - assertHasProperty(color, TintColorSemanticKey, "tint color") - } - - /** - * Asserts that the compose view tint color contains the given [color]. - * - * Throws [AssertionError] if the compose view tint color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TintColorSemanticKey] modifier. - * Throws [IllegalArgumentException] if the color value is incorrect. - */ - fun assertTintColorEquals(color: String) { - assertHasProperty( - Color(android.graphics.Color.parseColor(color)), - TintColorSemanticKey, - "tint color", - ) - } - - /** - * Asserts that the compose view tint color contains the given [color]. - * - * Throws [AssertionError] if the compose view tint color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TintColorSemanticKey] modifier. - */ - fun assertTintColorEquals(color: Long) { - assertHasProperty( - Color(color), - TintColorSemanticKey, - "tint color", - ) - } - - /** - * Asserts that the image or icon content contains the given [imageVector]. - * - * Throws [AssertionError] if the image or icon content value is not equal to `imageVector`. - * Throws [IllegalStateException] if the image or icon does not contain the [ImageContentSemanticKey] modifier. - */ - fun assertContentEquals(imageVector: ImageVector) { - assertHasProperty( - imageVector, - ImageContentSemanticKey, - "image vector", - ) - } - - /** - * Asserts that the image or icon content contains the given [drawableRes]. - * - * Throws [AssertionError] if the image or icon content value is not equal to `drawableRes`. - * Throws [IllegalStateException] if the image or icon does not contain the [ImageContentSemanticKey] modifier. - */ - fun assertContentEquals(@DrawableRes drawableRes: Int) { - assertHasProperty( - drawableRes, - ImageContentSemanticKey, - "image drawable", - ) - } -} diff --git a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt b/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt deleted file mode 100644 index 823c0819..00000000 --- a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt +++ /dev/null @@ -1,116 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.unit.Dp -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.semantics.BackgroundColorSemanticKey -import io.github.kakaocup.compose.semantics.ColorSemanticKey -import io.github.kakaocup.compose.semantics.ProgressSemanticKey -import io.github.kakaocup.compose.semantics.StrokeCapSemanticKey -import io.github.kakaocup.compose.semantics.StrokeWidthSemanticKey - -open class KProgressIndicatorNode : BaseNode { - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : super(semanticsProvider, nodeMatcher) - - /** - * Asserts that the progress is equal the given [progress]. - * - * Throws [AssertionError] if the indicator progress is not equal to `progress`. - * Throws [IllegalStateException] if the compose view does not contain the [ProgressSemanticKey] modifier. - */ - fun assertProgressEquals(progress: Float) { - assertHasProperty( - progress, - ProgressSemanticKey, - "progress", - ) - } - - /** - * Asserts that the color is equal the given [color]. - * - * Throws [AssertionError] if the indicator color is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [ColorSemanticKey] modifier. - */ - fun assertColorEquals(color: Color) { - assertHasProperty( - color, - ColorSemanticKey, - "color", - ) - } - - /** - * Asserts that the stroke width is equal the given [strokeWidth]. - * - * Throws [AssertionError] if the indicator stroke width is not equal to `strokeWidth`. - * Throws [IllegalStateException] if the compose view does not contain the [StrokeWidthSemanticKey] modifier. - */ - fun assertStrokeWidthEquals(strokeWidth: Dp) { - assertHasProperty( - strokeWidth, - StrokeWidthSemanticKey, - "stroke width", - ) - } - - /** - * Asserts that the stroke cap is equal the given [strokeCap]. - * - * Throws [AssertionError] if the indicator stroke cap is not equal to `strokeCap`. - * Throws [IllegalStateException] if the compose view does not contain the [StrokeCapSemanticKey] modifier. - */ - fun assertStrokeCapEquals(strokeCap: StrokeCap) { - assertHasProperty( - strokeCap, - StrokeCapSemanticKey, - "stroke cap", - ) - } - - /** - * Asserts that the background color is equal the given [color]. - * - * Throws [AssertionError] if the indicator background color is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [BackgroundColorSemanticKey] modifier. - */ - fun assertBackgroundColorEquals(color: Color) { - assertHasProperty( - color, - BackgroundColorSemanticKey, - "background color", - ) - } - - /** - * Asserts that the stroke cap is equal the given [strokeCap]. - * - * Throws [AssertionError] if the indicator stroke cap is not equal to `strokeCap`. - * Throws [IllegalStateException] if the compose view does not contain the [StrokeCapSemanticKey] modifier. - */ - fun assertBackgroundColorEquals(strokeCap: StrokeCap) { - assertHasProperty( - strokeCap, - StrokeCapSemanticKey, - "stroke cap", - ) - } -} diff --git a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt b/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt deleted file mode 100644 index 1b4c26e0..00000000 --- a/compose-test/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt +++ /dev/null @@ -1,256 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.TextUnit -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.semantics.TextColorSemanticKey -import io.github.kakaocup.compose.semantics.FontFamilySemanticKey -import io.github.kakaocup.compose.semantics.FontSizeSemanticKey -import io.github.kakaocup.compose.semantics.FontStyleSemanticKey -import io.github.kakaocup.compose.semantics.FontWeightSemanticKey -import io.github.kakaocup.compose.semantics.LetterSpacingSizeSemanticKey -import io.github.kakaocup.compose.semantics.LineHeightSemanticKey -import io.github.kakaocup.compose.semantics.MaxLinesSemanticKey -import io.github.kakaocup.compose.semantics.MinLinesSemanticKey -import io.github.kakaocup.compose.semantics.OverflowSemanticKey -import io.github.kakaocup.compose.semantics.SoftWrapSemanticKey -import io.github.kakaocup.compose.semantics.TextAlignSemanticKey -import io.github.kakaocup.compose.semantics.TextDecorationSemanticKey - -open class KTextNode : BaseNode { - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : super(semanticsProvider, nodeMatcher) - - /** - * Asserts that the text color contains the given [color]. - * - * Throws [AssertionError] if the text color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TextColorSemanticKey] modifier. - */ - fun assertTextColorEquals(color: Color) { - assertHasProperty( - color, - TextColorSemanticKey, - "text color" - ) - } - - /** - * Asserts that text color contains the given [color]. - * - * Throws [AssertionError] if the text color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TextColorSemanticKey] modifier. - * Throws [IllegalArgumentException] if the color value is incorrect. - */ - fun assertTextColorEquals(color: String) { - assertHasProperty( - Color(android.graphics.Color.parseColor(color)), - TextColorSemanticKey, - "text color", - ) - } - - /** - * Asserts that the text color contains the given [color]. - * - * Throws [AssertionError] if the text color value is not equal to `color`. - * Throws [IllegalStateException] if the compose view does not contain the [TextColorSemanticKey] modifier. - */ - fun assertTextColorEquals(color: Long) { - assertHasProperty( - Color(color), - TextColorSemanticKey, - "text color", - ) - } - - /** - * Asserts that the font size is equal to the given [fontSize]. - * - * Throws [AssertionError] if the font size value is not equal to `fontSize`. - * Throws [IllegalStateException] if the compose view does not contain the [FontSizeSemanticKey] modifier. - */ - fun assertFontSizeEquals(fontSize: TextUnit) { - assertHasProperty( - fontSize, - FontSizeSemanticKey, - "font size", - ) - } - - /** - * Asserts that the font style is equal to the given [fontStyle]. - * - * Throws [AssertionError] if the font size value is not equal to `fontStyle`. - * Throws [IllegalStateException] if the compose view does not contain the [FontStyleSemanticKey] modifier. - */ - fun assertFontStyleEquals(fontStyle: FontStyle) { - assertHasProperty( - fontStyle, - FontStyleSemanticKey, - "font style", - ) - } - - /** - * Asserts that the font weight is equal to the given [fontWeight]. - * - * Throws [AssertionError] if the font weight value is not equal to `fontWeight`. - * Throws [IllegalStateException] if the compose view does not contain the [FontWeightSemanticKey] modifier. - */ - fun assertFontWeightEquals(fontWeight: FontWeight) { - assertHasProperty( - fontWeight, - FontWeightSemanticKey, - "font weight", - ) - } - - /** - * Asserts that the font family is equal to the given [fontFamily]. - * - * Throws [AssertionError] if the font family value is not equal to `fontFamily`. - * Throws [IllegalStateException] if the compose view does not contain the [FontFamilySemanticKey] modifier. - */ - fun assertFontFamilyEquals(fontFamily: FontFamily) { - assertHasProperty( - fontFamily, - FontFamilySemanticKey, - "font family", - ) - } - - /** - * Asserts that the letter spacing is equal to the given [letterSpacing]. - * - * Throws [AssertionError] if the letter spacing value is not equal to `letterSpacing`. - * Throws [IllegalStateException] if the compose view does not contain the [LetterSpacingSizeSemanticKey] modifier. - */ - fun assertLetterSpacingEquals(letterSpacing: TextUnit) { - assertHasProperty( - letterSpacing, - LetterSpacingSizeSemanticKey, - "letter spacing", - ) - } - - /** - * Asserts that the text decoration is equal to the given [textDecoration]. - * - * Throws [AssertionError] if the text decoration value is not equal to `textDecoration`. - * Throws [IllegalStateException] if the compose view does not contain the [TextDecorationSemanticKey] modifier. - */ - fun assertTextDecorationEquals(textDecoration: TextDecoration) { - assertHasProperty( - textDecoration, - TextDecorationSemanticKey, - "text decoration", - ) - } - - /** - * Asserts that the text align is equal to the given [textAlign]. - * - * Throws [AssertionError] if the text align is not equal to `textAlign`. - * Throws [IllegalStateException] if the compose view does not contain the [TextAlignSemanticKey] modifier. - */ - fun assertTextAlignEquals(textAlign: TextAlign) { - assertHasProperty( - textAlign, - TextAlignSemanticKey, - "text align", - ) - } - - /** - * Asserts that the line height is equal the given [lineHeight]. - * - * Throws [AssertionError] if the line height value is not equal to `lineHeight`. - * Throws [IllegalStateException] if the compose view does not contain the [LineHeightSemanticKey] modifier. - */ - fun assertLineHeightEquals(lineHeight: TextUnit) { - assertHasProperty( - lineHeight, - LineHeightSemanticKey, - "line height", - ) - } - - /** - * Asserts that the text overflow equal the given [overflow]. - * - * Throws [AssertionError] if the text overflow value is not equal to `overflow`. - * Throws [IllegalStateException] if the compose view does not contain the [OverflowSemanticKey] modifier. - */ - fun assertOverflowEquals(overflow: TextOverflow) { - assertHasProperty( - overflow, - OverflowSemanticKey, - "text overflow", - ) - } - - /** - * Asserts that the soft wrap is equal the given [softWrap]. - * - * Throws [AssertionError] if the soft wrap is not equal to `softWrap`. - * Throws [IllegalStateException] if the compose view does not contain the [SoftWrapSemanticKey] modifier. - */ - fun assertSoftWrapEquals(softWrap: Boolean) { - assertHasProperty( - softWrap, - SoftWrapSemanticKey, - "soft wrap", - ) - } - - /** - * Asserts that the max lines is equal the given [maxLines]. - * - * Throws [AssertionError] if the text max lines is not equal to `maxLines`. - * Throws [IllegalStateException] if the compose view does not contain the [MaxLinesSemanticKey] modifier. - */ - fun assertMaxLinesEquals(maxLines: Int) { - assertHasProperty( - maxLines, - MaxLinesSemanticKey, - "max lines", - ) - } - - /** - * Asserts that the min lines is equal the given [minLines]. - * - * Throws [AssertionError] if the text min lines is not equal to `minLines`. - * Throws [IllegalStateException] if the compose view does not contain the [MinLinesSemanticKey] modifier. - */ - fun assertMinLinesEquals(minLines: Int) { - assertHasProperty( - minLines, - MinLinesSemanticKey, - "min lines", - ) - } -} diff --git a/compose-ui/.gitignore b/compose-ui/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/compose-ui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/compose-ui/build.gradle.kts b/compose-ui/build.gradle.kts deleted file mode 100644 index a762efed..00000000 --- a/compose-ui/build.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id("convention.library") - id("convention.publishing") - alias(libs.plugins.compose.compiler) -} - -android { - namespace = "io.github.kakaocup.compose.ui" -} - -dependencies { - implementation(project(":compose-semantics")) - implementation(libs.androidx.compose.material) -} diff --git a/compose-ui/proguard-rules.pro b/compose-ui/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/compose-ui/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/compose-ui/src/main/AndroidManifest.xml b/compose-ui/src/main/AndroidManifest.xml deleted file mode 100644 index 8072ee00..00000000 --- a/compose-ui/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/BackgroundKt.kt b/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/BackgroundKt.kt deleted file mode 100644 index 8b162338..00000000 --- a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/BackgroundKt.kt +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.annotation.FloatRange -import androidx.compose.foundation.background -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.semantics.semantics -import io.github.kakaocup.compose.semantics.backgroundAlpha -import io.github.kakaocup.compose.semantics.backgroundBrush -import io.github.kakaocup.compose.semantics.backgroundColor -import io.github.kakaocup.compose.semantics.backgroundShape - -fun Modifier.background( - color: Color, - shape: Shape = RectangleShape -): Modifier { - return this then - background(color, shape) then - semantics { this.backgroundColor = color } then - semantics { this.backgroundShape = shape } -} - -fun Modifier.background( - brush: Brush, - shape: Shape = RectangleShape, - @FloatRange(from = 0.0, to = 1.0) - alpha: Float = 1.0f -): Modifier { - return this then - background(brush, shape, alpha) then - semantics { this.backgroundBrush = brush } then - semantics { this.backgroundShape = shape } then - semantics { this.backgroundAlpha = alpha } -} diff --git a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt b/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt deleted file mode 100644 index a429968b..00000000 --- a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Button.kt +++ /dev/null @@ -1,174 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.interaction.Interaction -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.RowScope -import androidx.compose.material.Button -import androidx.compose.material.ButtonColors -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.ButtonElevation -import androidx.compose.material.MaterialTheme -import androidx.compose.material.OutlinedButton -import androidx.compose.material.Text -import androidx.compose.material.TextButton -import androidx.compose.material.Typography -import androidx.compose.runtime.Composable -import androidx.compose.runtime.NonRestartableComposable -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.semantics.semantics -import io.github.kakaocup.compose.semantics.border -import io.github.kakaocup.compose.semantics.contentPadding -import io.github.kakaocup.compose.semantics.shape - -@Composable -fun Button( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - elevation: ButtonElevation? = ButtonDefaults.elevation(), - shape: Shape = MaterialTheme.shapes.small, - border: BorderStroke? = null, - colors: ButtonColors = ButtonDefaults.buttonColors(), - contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit -) = Button( - onClick = onClick, - modifier = modifier - .semantics { - this.shape = shape - this.border = border - this.contentPadding = contentPadding - }, - enabled = enabled, - interactionSource = interactionSource, - elevation = elevation, - shape = shape, - border = border, - colors = colors, - contentPadding = contentPadding, - content = content, -) - -/** - * Material Design outlined button. - * - * Outlined buttons are medium-emphasis buttons. They contain actions that are important, but aren't - * the primary action in an app. - * - * ![Outlined button image](https://developer.android.com/images/reference/androidx/compose/material/outlined-button.png) - * - * The default text style for internal [Text] components will be set to [Typography.button]. - * - * @sample androidx.compose.material.samples.OutlinedButtonSample - * - * @param onClick Will be called when the user clicks the button - * @param modifier Modifier to be applied to the button - * @param enabled Controls the enabled state of the button. When `false`, this button will not - * be clickable - * @param interactionSource the [MutableInteractionSource] representing the stream of - * [Interaction]s for this Button. You can create and pass in your own remembered - * [MutableInteractionSource] if you want to observe [Interaction]s and customize the - * appearance / behavior of this Button in different [Interaction]s. - * @param elevation [ButtonElevation] used to resolve the elevation for this button in different - * states. An OutlinedButton typically has no elevation, see [Button] for a button with elevation. - * @param shape Defines the button's shape as well as its shadow - * @param border Border to draw around the button - * @param colors [ButtonColors] that will be used to resolve the background and content color for - * this button in different states. See [ButtonDefaults.outlinedButtonColors]. - * @param contentPadding The spacing values to apply internally between the container and the content - */ -@Composable -@NonRestartableComposable -fun OutlinedButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - elevation: ButtonElevation? = null, - shape: Shape = MaterialTheme.shapes.small, - border: BorderStroke? = ButtonDefaults.outlinedBorder, - colors: ButtonColors = ButtonDefaults.outlinedButtonColors(), - contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit -) = OutlinedButton( - onClick = onClick, - modifier = modifier - .semantics { - this.shape = shape - this.border = border - this.contentPadding = contentPadding - }, - enabled = enabled, - interactionSource = interactionSource, - elevation = elevation, - shape = shape, - border = border, - colors = colors, - contentPadding = contentPadding, - content = content, -) - -/** - * Material Design text button. - * - * Text buttons are typically used for less-pronounced actions, including those located in dialogs - * and cards. In cards, text buttons help maintain an emphasis on card content. - * - * ![Text button image](https://developer.android.com/images/reference/androidx/compose/material/text-button.png) - * - * The default text style for internal [Text] components will be set to [Typography.button]. - * - * @sample androidx.compose.material.samples.TextButtonSample - * - * @param onClick Will be called when the user clicks the button - * @param modifier Modifier to be applied to the button - * @param enabled Controls the enabled state of the button. When `false`, this button will not - * be clickable - * @param interactionSource the [MutableInteractionSource] representing the stream of - * [Interaction]s for this Button. You can create and pass in your own remembered - * [MutableInteractionSource] if you want to observe [Interaction]s and customize the - * appearance / behavior of this Button in different [Interaction]s. - * @param elevation [ButtonElevation] used to resolve the elevation for this button in different - * states. A TextButton typically has no elevation, see [Button] for a button with elevation. - * @param shape Defines the button's shape as well as its shadow - * @param border Border to draw around the button - * @param colors [ButtonColors] that will be used to resolve the background and content color for - * this button in different states. See [ButtonDefaults.textButtonColors]. - * @param contentPadding The spacing values to apply internally between the container and the content - */ -@Composable -@NonRestartableComposable -fun TextButton( - onClick: () -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - elevation: ButtonElevation? = null, - shape: Shape = MaterialTheme.shapes.small, - border: BorderStroke? = null, - colors: ButtonColors = ButtonDefaults.textButtonColors(), - contentPadding: PaddingValues = ButtonDefaults.TextButtonContentPadding, - content: @Composable RowScope.() -> Unit -) = TextButton( - onClick = onClick, - modifier = modifier - .semantics { - this.shape = shape - this.border = border - this.contentPadding = contentPadding - }, - enabled = enabled, - interactionSource = interactionSource, - elevation = elevation, - shape = shape, - border = border, - colors = colors, - contentPadding = contentPadding, - content = content, -) - diff --git a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt b/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt deleted file mode 100644 index 233960e1..00000000 --- a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Icon.kt +++ /dev/null @@ -1,160 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.annotation.DrawableRes -import androidx.compose.material.IconButton -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.LocalContentColor -import androidx.compose.runtime.Composable -import androidx.compose.runtime.NonRestartableComposable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.semantics.semantics -import io.github.kakaocup.compose.semantics.imageContent -import io.github.kakaocup.compose.semantics.tintColor - -/** - * A Material Design icon component that draws [imageVector] using [tint], with a default value - * of [LocalContentColor]. If [imageVector] has no intrinsic size, this component will use the - * recommended default size. Icon is an opinionated component designed to be used with single-color - * icons so that they can be tinted correctly for the component they are placed in. For multicolored - * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images - * that should not be tinted, and do not follow the recommended icon size, use the generic - * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton]. - * - * @param imageVector [ImageVector] to draw inside this Icon - * @param contentDescription text used by accessibility services to describe what this icon - * represents. This should always be provided unless this icon is used for decorative purposes, - * and does not represent a meaningful action that a user can take. This text should be - * localized, such as by using [androidx.compose.ui.res.stringResource] or similar - * @param modifier optional [Modifier] for this Icon - * @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint - * is applied - */ -@Composable -@NonRestartableComposable -fun Icon( - imageVector: ImageVector, - contentDescription: String?, - modifier: Modifier = Modifier, - tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current) -) { - androidx.compose.material.Icon( - imageVector = imageVector, - contentDescription = contentDescription, - modifier = modifier - .semantics { this.tintColor = tint } - .semantics { this.imageContent = imageVector }, - tint = tint - ) -} - -/** - * A Material Design icon component that draws [bitmap] using [tint], with a default value - * of [LocalContentColor]. If [bitmap] has no intrinsic size, this component will use the - * recommended default size. Icon is an opinionated component designed to be used with single-color - * icons so that they can be tinted correctly for the component they are placed in. For multicolored - * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images - * that should not be tinted, and do not follow the recommended icon size, use the generic - * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton]. - * - * @param bitmap [ImageBitmap] to draw inside this Icon - * @param contentDescription text used by accessibility services to describe what this icon - * represents. This should always be provided unless this icon is used for decorative purposes, - * and does not represent a meaningful action that a user can take. This text should be - * localized, such as by using [androidx.compose.ui.res.stringResource] or similar - * @param modifier optional [Modifier] for this Icon - * @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is - * applied - */ -@Composable -@NonRestartableComposable -fun Icon( - bitmap: ImageBitmap, - contentDescription: String?, - modifier: Modifier = Modifier, - tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current) -) { - androidx.compose.material.Icon( - bitmap = bitmap, - contentDescription = contentDescription, - modifier = modifier - .semantics { this.tintColor = tint } - .semantics { this.imageContent = bitmap }, - tint = tint - ) -} - -/** - * A Material Design icon component that draws [painter] using [tint], with a default value - * of [LocalContentColor]. If [painter] has no intrinsic size, this component will use the - * recommended default size. Icon is an opinionated component designed to be used with single-color - * icons so that they can be tinted correctly for the component they are placed in. For multicolored - * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images - * that should not be tinted, and do not follow the recommended icon size, use the generic - * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton]. - * - * @param painter [Painter] to draw inside this Icon - * @param contentDescription text used by accessibility services to describe what this icon - * represents. This should always be provided unless this icon is used for decorative purposes, - * and does not represent a meaningful action that a user can take. This text should be - * localized, such as by using [androidx.compose.ui.res.stringResource] or similar - * @param modifier optional [Modifier] for this Icon - * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no tint is - * applied - */ -@Composable -fun Icon( - painter: Painter, - contentDescription: String?, - modifier: Modifier = Modifier, - tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current) -) { - androidx.compose.material.Icon( - painter = painter, - contentDescription = contentDescription, - modifier = modifier - .semantics { this.tintColor = tint } - .semantics { this.imageContent = painter }, - tint = tint - ) -} - -/** - * A Material Design icon component that draws [painter] using [tint], with a default value - * of [LocalContentColor]. If [painter] has no intrinsic size, this component will use the - * recommended default size. Icon is an opinionated component designed to be used with single-color - * icons so that they can be tinted correctly for the component they are placed in. For multicolored - * icons and icons that should not be tinted, use [Color.Unspecified] for [tint]. For generic images - * that should not be tinted, and do not follow the recommended icon size, use the generic - * [androidx.compose.foundation.Image] instead. For a clickable icon, see [IconButton]. - * - * @param painter [Painter] to draw inside this Icon - * @param contentDescription text used by accessibility services to describe what this icon - * represents. This should always be provided unless this icon is used for decorative purposes, - * and does not represent a meaningful action that a user can take. This text should be - * localized, such as by using [androidx.compose.ui.res.stringResource] or similar - * @param modifier optional [Modifier] for this Icon - * @param tint tint to be applied to [painter]. If [Color.Unspecified] is provided, then no tint is - * applied - */ -@Composable -fun Icon( - @DrawableRes - resId: Int, - contentDescription: String?, - modifier: Modifier = Modifier, - tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current) -) { - androidx.compose.material.Icon( - painter = painterResource(resId), - contentDescription = contentDescription, - modifier = modifier - .semantics { this.tintColor = tint } - .semantics { this.imageContent = resId }, - tint = tint - ) -} diff --git a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt b/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt deleted file mode 100644 index 0596c6c5..00000000 --- a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/ProgressIndicator.kt +++ /dev/null @@ -1,173 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.annotation.FloatRange -import androidx.compose.material.MaterialTheme -import androidx.compose.material.ProgressIndicatorDefaults -import androidx.compose.material.ProgressIndicatorDefaults.IndicatorBackgroundOpacity -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.unit.Dp -import io.github.kakaocup.compose.semantics.backgroundColor -import io.github.kakaocup.compose.semantics.color -import io.github.kakaocup.compose.semantics.progress -import io.github.kakaocup.compose.semantics.strokeCap -import io.github.kakaocup.compose.semantics.strokeWidth - -/** - * Determinate Material Design linear progress indicator. - * - * Progress indicators express an unspecified wait time or display the length of a process. - * - * ![Linear progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png) - * - * By default there is no animation between [progress] values. You can use - * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended - * [AnimationSpec] when animating progress, such as in the following example: - * - * @sample androidx.compose.material.samples.LinearProgressIndicatorSample - * - * @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0 - * represents full progress. Values outside of this range are coerced into the range. - * @param modifier the [Modifier] to be applied to this progress indicator - * @param color The color of the progress indicator. - * @param backgroundColor The color of the background behind the indicator, visible when the - * progress has not reached that area of the overall indicator yet. - * @param strokeCap stroke cap to use for the ends of this progress indicator - */ -@Composable -fun LinearProgressIndicator( - @FloatRange(from = 0.0, to = 1.0) - progress: Float, - modifier: Modifier = Modifier, - color: Color = MaterialTheme.colors.primary, - backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity), - strokeCap: StrokeCap = StrokeCap.Butt, -) = androidx.compose.material.LinearProgressIndicator( - progress = progress, - modifier = modifier - .semantics { - this.progress = progress - this.color = color - this.backgroundColor = backgroundColor - this.strokeCap = strokeCap - }, - color = color, - backgroundColor = backgroundColor, - strokeCap = strokeCap -) - -/** - * Indeterminate Material Design linear progress indicator. - * - * Progress indicators express an unspecified wait time or display the length of a process. - * - * ![Linear progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/linear-progress-indicator.png) - * - * @param modifier the [Modifier] to be applied to this progress indicator - * @param color The color of the progress indicator. - * @param backgroundColor The color of the background behind the indicator, visible when the - * progress has not reached that area of the overall indicator yet. - * @param strokeCap stroke cap to use for the ends of this progress indicator - */ -@Composable -fun LinearProgressIndicator( - modifier: Modifier = Modifier, - color: Color = MaterialTheme.colors.primary, - backgroundColor: Color = color.copy(alpha = IndicatorBackgroundOpacity), - strokeCap: StrokeCap = StrokeCap.Butt, -) = androidx.compose.material.LinearProgressIndicator( - modifier = modifier - .semantics { - this.color = color - this.backgroundColor = backgroundColor - this.strokeCap = strokeCap - }, - color = color, - backgroundColor = backgroundColor, - strokeCap = strokeCap -) - -/** - * Determinate Material Design circular progress indicator. - * - * Progress indicators express an unspecified wait time or display the length of a process. - * - * ![Circular progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png) - * - * By default there is no animation between [progress] values. You can use - * [ProgressIndicatorDefaults.ProgressAnimationSpec] as the default recommended - * [AnimationSpec] when animating progress, such as in the following example: - * - * @sample androidx.compose.material.samples.CircularProgressIndicatorSample - * - * @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0 - * represents full progress. Values outside of this range are coerced into the range. - * @param modifier the [Modifier] to be applied to this progress indicator - * @param color The color of the progress indicator. - * @param strokeWidth The stroke width for the progress indicator. - * @param backgroundColor The color of the background behind the indicator, visible when the - * progress has not reached that area of the overall indicator yet. - * @param strokeCap stroke cap to use for the ends of this progress indicator - */ -@Composable -fun CircularProgressIndicator( - @FloatRange(from = 0.0, to = 1.0) - progress: Float, - modifier: Modifier = Modifier, - color: Color = MaterialTheme.colors.primary, - strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth, - backgroundColor: Color = Color.Transparent, - strokeCap: StrokeCap = StrokeCap.Butt, -) = androidx.compose.material.CircularProgressIndicator( - progress = progress, - modifier = modifier - .semantics { - this.progress = progress - this.color = color - this.strokeWidth = strokeWidth - this.backgroundColor = backgroundColor - this.strokeCap = strokeCap - }, - color = color, - strokeWidth = strokeWidth, - backgroundColor = backgroundColor, - strokeCap = strokeCap -) - -/** - * Indeterminate Material Design circular progress indicator. - * - * Progress indicators express an unspecified wait time or display the length of a process. - * - * ![Circular progress indicator image](https://developer.android.com/images/reference/androidx/compose/material/circular-progress-indicator.png) - * - * @param modifier the [Modifier] to be applied to this progress indicator - * @param color The color of the progress indicator. - * @param strokeWidth The stroke width for the progress indicator. - * @param backgroundColor The color of the background behind the indicator, visible when the - * progress has not reached that area of the overall indicator yet. - * @param strokeCap stroke cap to use for the ends of this progress indicator - */ -@Composable -fun CircularProgressIndicator( - modifier: Modifier = Modifier, - color: Color = MaterialTheme.colors.primary, - strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth, - backgroundColor: Color = Color.Transparent, - strokeCap: StrokeCap = StrokeCap.Square, -) = androidx.compose.material.CircularProgressIndicator( - modifier = modifier - .semantics { - this.color = color - this.strokeWidth = strokeWidth - this.backgroundColor = backgroundColor - this.strokeCap = strokeCap - }, - color = color, - strokeWidth = strokeWidth, - backgroundColor = backgroundColor, - strokeCap = strokeCap -) diff --git a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt b/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt deleted file mode 100644 index 1b2f105f..00000000 --- a/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation/Text.kt +++ /dev/null @@ -1,265 +0,0 @@ -package io.github.kakaocup.compose.foundation - -import androidx.compose.foundation.text.InlineTextContent -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.LocalContentColor -import androidx.compose.material.LocalTextStyle -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.isSpecified -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.Paragraph -import androidx.compose.ui.text.TextLayoutResult -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.TextUnit -import io.github.kakaocup.compose.semantics.fontFamily -import io.github.kakaocup.compose.semantics.fontSize -import io.github.kakaocup.compose.semantics.fontStyle -import io.github.kakaocup.compose.semantics.fontWeight -import io.github.kakaocup.compose.semantics.letterSpacing -import io.github.kakaocup.compose.semantics.lineHeight -import io.github.kakaocup.compose.semantics.maxLines -import io.github.kakaocup.compose.semantics.minLines -import io.github.kakaocup.compose.semantics.overflow -import io.github.kakaocup.compose.semantics.softWrap -import io.github.kakaocup.compose.semantics.textAlign -import io.github.kakaocup.compose.semantics.textColor -import io.github.kakaocup.compose.semantics.textDecoration - -/** - * High level element that displays text and provides semantics / accessibility information. - * - * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If - * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], - * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific - * attributes you want to override. - * - * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of - * precedence is as follows: - * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), - * then this parameter will always be used. - * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value - * from [style] will be used instead. - * - * Additionally, for [color], if [color] is not set, and [style] does not have a color, then - * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this - * [Text] or element containing this [Text] to adapt to different background colors and still - * maintain contrast and accessibility. - * - * @param text The text to be displayed. - * @param modifier [Modifier] to apply to this layout node. - * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set, - * this will be [LocalContentColor]. - * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize]. - * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic). - * See [TextStyle.fontStyle]. - * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]). - * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily]. - * @param letterSpacing The amount of space to add between each letter. - * See [TextStyle.letterSpacing]. - * @param textDecoration The decorations to paint on the text (e.g., an underline). - * See [TextStyle.textDecoration]. - * @param textAlign The alignment of the text within the lines of the paragraph. - * See [TextStyle.textAlign]. - * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. - * See [TextStyle.lineHeight]. - * @param overflow How visual overflow should be handled. - * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the - * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false, - * [overflow] and TextAlign may have unexpected effects. - * @param maxLines An optional maximum number of lines for the text to span, wrapping if - * necessary. If the text exceeds the given number of lines, it will be truncated according to - * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines]. - * @param minLines The minimum height in terms of minimum number of visible lines. It is required - * that 1 <= [minLines] <= [maxLines]. - * @param onTextLayout Callback that is executed when a new text layout is calculated. A - * [TextLayoutResult] object that callback provides contains paragraph information, size of the - * text, baselines and other details. The callback can be used to add additional decoration or - * functionality to the text. For example, to draw selection around the text. - * @param style Style configuration for the text such as color, font, line height etc. - */ -@Composable -fun Text( - text: String, - modifier: Modifier = Modifier, - color: Color = Color.Unspecified, - fontSize: TextUnit = TextUnit.Unspecified, - fontStyle: FontStyle? = null, - fontWeight: FontWeight? = null, - fontFamily: FontFamily? = null, - letterSpacing: TextUnit = TextUnit.Unspecified, - textDecoration: TextDecoration? = null, - textAlign: TextAlign? = null, - lineHeight: TextUnit = TextUnit.Unspecified, - overflow: TextOverflow = TextOverflow.Clip, - softWrap: Boolean = true, - maxLines: Int = Int.MAX_VALUE, - minLines: Int = 1, - onTextLayout: ((TextLayoutResult) -> Unit)? = null, - style: TextStyle = LocalTextStyle.current -) { - Text( - text = text, - modifier = modifier - .semantics { - this.textColor = when { - color.isSpecified -> color - style.color.isSpecified -> style.color - else -> Color.Black - } - this.fontSize = fontSize - this.fontStyle = fontStyle - this.fontWeight = fontWeight - this.fontFamily = fontFamily - this.letterSpacing = letterSpacing - this.textDecoration = textDecoration - this.textAlign = textAlign - this.lineHeight = lineHeight - this.overflow = overflow - this.softWrap = softWrap - this.maxLines = maxLines - this.minLines = minLines - }, - color = color, - fontSize = fontSize, - fontStyle = fontStyle, - fontWeight = fontWeight, - fontFamily = fontFamily, - letterSpacing = letterSpacing, - textDecoration = textDecoration, - textAlign = textAlign, - lineHeight = lineHeight, - overflow = overflow, - softWrap = softWrap, - maxLines = maxLines, - minLines = minLines, - onTextLayout = onTextLayout, - style = style, - ) -} - -/** - * High level element that displays text and provides semantics / accessibility information. - * - * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If - * you are setting your own style, you may want to consider first retrieving [LocalTextStyle], - * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific - * attributes you want to override. - * - * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of - * precedence is as follows: - * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]), - * then this parameter will always be used. - * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value - * from [style] will be used instead. - * - * Additionally, for [color], if [color] is not set, and [style] does not have a color, then - * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this - * [Text] or element containing this [Text] to adapt to different background colors and still - * maintain contrast and accessibility. - * - * @param text The text to be displayed. - * @param modifier [Modifier] to apply to this layout node. - * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set, - * this will be [LocalContentColor]. - * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize]. - * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic). - * See [TextStyle.fontStyle]. - * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]). - * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily]. - * @param letterSpacing The amount of space to add between each letter. - * See [TextStyle.letterSpacing]. - * @param textDecoration The decorations to paint on the text (e.g., an underline). - * See [TextStyle.textDecoration]. - * @param textAlign The alignment of the text within the lines of the paragraph. - * See [TextStyle.textAlign]. - * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM. - * See [TextStyle.lineHeight]. - * @param overflow How visual overflow should be handled. - * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the - * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false, - * [overflow] and TextAlign may have unexpected effects. - * @param maxLines An optional maximum number of lines for the text to span, wrapping if - * necessary. If the text exceeds the given number of lines, it will be truncated according to - * [overflow] and [softWrap]. It is required that 1 <= [minLines] <= [maxLines]. - * @param minLines The minimum height in terms of minimum number of visible lines. It is required - * that 1 <= [minLines] <= [maxLines]. - * @param inlineContent A map store composables that replaces certain ranges of the text. It's - * used to insert composables into text layout. Check [InlineTextContent] for more information. - * @param onTextLayout Callback that is executed when a new text layout is calculated. A - * [TextLayoutResult] object that callback provides contains paragraph information, size of the - * text, baselines and other details. The callback can be used to add additional decoration or - * functionality to the text. For example, to draw selection around the text. - * @param style Style configuration for the text such as color, font, line height etc. - */ -@Composable -fun Text( - text: AnnotatedString, - modifier: Modifier = Modifier, - color: Color = Color.Unspecified, - fontSize: TextUnit = TextUnit.Unspecified, - fontStyle: FontStyle? = null, - fontWeight: FontWeight? = null, - fontFamily: FontFamily? = null, - letterSpacing: TextUnit = TextUnit.Unspecified, - textDecoration: TextDecoration? = null, - textAlign: TextAlign? = null, - lineHeight: TextUnit = TextUnit.Unspecified, - overflow: TextOverflow = TextOverflow.Clip, - softWrap: Boolean = true, - maxLines: Int = Int.MAX_VALUE, - minLines: Int = 1, - inlineContent: Map = mapOf(), - onTextLayout: (TextLayoutResult) -> Unit = {}, - style: TextStyle = LocalTextStyle.current -) { - Text( - text = text, - modifier = modifier - .semantics { - this.textColor = when { - color.isSpecified -> color - style.color.isSpecified -> style.color - else -> Color.Black - } - this.fontSize = fontSize - this.fontStyle = fontStyle - this.fontWeight = fontWeight - this.fontFamily = fontFamily - this.letterSpacing = letterSpacing - this.textDecoration = textDecoration - this.textAlign = textAlign - this.lineHeight = lineHeight - this.overflow = overflow - this.softWrap = softWrap - this.maxLines = maxLines - this.minLines = minLines - }, - color = color, - fontSize = fontSize, - fontStyle = fontStyle, - fontWeight = fontWeight, - fontFamily = fontFamily, - letterSpacing = letterSpacing, - textDecoration = textDecoration, - textAlign = textAlign, - lineHeight = lineHeight, - overflow = overflow, - softWrap = softWrap, - maxLines = maxLines, - minLines = minLines, - inlineContent = inlineContent, - onTextLayout = onTextLayout, - style = style, - ) -} diff --git a/compose/.gitignore b/compose/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/compose/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts deleted file mode 100644 index c9863d73..00000000 --- a/compose/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id("convention.library") - id("convention.publishing") -} - -android { - namespace = "io.github.kakaocup.compose" -} - -dependencies { - implementation(libs.androidx.test.espresso.espressoCore) - implementation(libs.androidx.test.ext.junit) - - implementation(libs.androidx.compose.ui.uiTestJunit4) -} diff --git a/compose/proguard-rules.pro b/compose/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/compose/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/compose/src/main/AndroidManifest.xml b/compose/src/main/AndroidManifest.xml deleted file mode 100644 index 8072ee00..00000000 --- a/compose/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/KakaoCompose.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/KakaoCompose.kt deleted file mode 100644 index 75bcaf88..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/KakaoCompose.kt +++ /dev/null @@ -1,67 +0,0 @@ -package io.github.kakaocup.compose - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.intercept.base.Interceptor -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction -import io.github.kakaocup.compose.intercept.operation.ComposeAction -import io.github.kakaocup.compose.intercept.operation.ComposeAssertion - -object KakaoCompose { - internal var composeInterceptor: Interceptor? = - null - - /** - * Operator that allows usage of DSL style - * - * @param function Tail lambda with receiver which is your Kakao-Compose runtime - */ - operator fun invoke(function: KakaoCompose.() -> Unit) { - function(this) - } - - /** - * Sets the interceptors for the whole Kakao-Compose runtime. - * Interceptors will be invoked on all of the interactions with the BaseNode instances. - * - * @param configurator Configuration of the interceptors - * - * @see Interceptor - */ - fun intercept(configurator: Interceptor.Configurator.() -> Unit) { - Interceptor.Configurator().apply(configurator).configure().also { (composeInterceptor) -> - this.composeInterceptor = composeInterceptor - } - } - - /** - * Removes the interceptors from the Kakao-Compose runtime. - * - * @see intercept - * @see Interceptor - */ - - /** - * Global overrides for default Espresso behaviour - */ - object Override { - var useUnmergedTree: Boolean? = null - } - - /** - * Global parameters - */ - - object Global { - /** - * Global SemanticsNodeInteractionsProvider can be set via KakaoComposeTestRule - * to avoid injection boilerplate into each ComposeScreen - * @see KakaoComposeTestRule - */ - var semanticsProvider: SemanticsNodeInteractionsProvider? = null - } - - fun reset() { - composeInterceptor = null - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/exception/KakaoComposeException.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/exception/KakaoComposeException.kt deleted file mode 100644 index 5b2d0295..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/exception/KakaoComposeException.kt +++ /dev/null @@ -1,3 +0,0 @@ -package io.github.kakaocup.compose.exception - -class KakaoComposeException(message: String) : Exception(message) \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeDelegate.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeDelegate.kt deleted file mode 100644 index f6c6930d..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeDelegate.kt +++ /dev/null @@ -1,43 +0,0 @@ -package io.github.kakaocup.compose.intercept.delegate - -import androidx.compose.ui.test.SemanticsNodeInteraction -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.intercept.base.Interceptor -import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction -import io.github.kakaocup.compose.intercept.operation.* -import io.github.kakaocup.compose.node.builder.NodeProvider - -/** - * Compose implementation of Base delegate interface for Kakao-Compose - */ -class ComposeDelegate( - nodeProvider: NodeProvider, - private val parentDelegate: ComposeDelegate?, -) : Delegate { - - var currentInterceptor: Interceptor? = null - - override val interaction = ComposeInteraction(nodeProvider) - - override val nodeInterceptors: () -> Iterable> = { - val currentList = currentInterceptor?.let { listOf(it) } ?: emptyList() - val parentList = parentDelegate?.nodeInterceptors?.invoke() ?: emptyList() - currentList + parentList - } - - override val globalInterceptor: () -> Interceptor? = { KakaoCompose.composeInterceptor } - - fun check(type: ComposeOperationType, - description: String? = null, - action: SemanticsNodeInteraction.() -> Unit) { - val composeAssertion = produceComposeAssertion(type, description, action) - check(composeAssertion) - } - - fun perform(type: ComposeOperationType, - description: String? = null, - action: SemanticsNodeInteraction.() -> Unit) { - val composeAction = produceComposeAction(type, description, action) - perform(composeAction) - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeInterceptable.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeInterceptable.kt deleted file mode 100644 index c7e95cdb..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/delegate/ComposeInterceptable.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.kakaocup.compose.intercept.delegate - -import io.github.kakaocup.compose.intercept.base.Interceptor -import io.github.kakaocup.compose.intercept.interaction.ComposeInteraction -import io.github.kakaocup.compose.intercept.operation.ComposeAction -import io.github.kakaocup.compose.intercept.operation.ComposeAssertion - -interface ComposeInterceptable { - - val delegate: ComposeDelegate - - /** - * Sets the interceptors for the instance. - * Interceptors will be invoked on the interaction with the BaseNode. - * - * @param builder Builder of the interceptors - * - * @see Interceptor - */ - fun intercept(builder: Interceptor.Builder.() -> Unit) { - delegate.currentInterceptor = Interceptor.Builder() - .apply(builder).build() - } - - /** - * Removes the interceptors from the instance. - */ - fun reset() { - delegate.currentInterceptor = null - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/ComposeInteraction.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/ComposeInteraction.kt deleted file mode 100644 index bff2c170..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/interaction/ComposeInteraction.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.kakaocup.compose.intercept.interaction - -import androidx.compose.ui.test.SemanticsNodeInteraction -import io.github.kakaocup.compose.intercept.operation.ComposeAction -import io.github.kakaocup.compose.intercept.operation.ComposeAssertion -import io.github.kakaocup.compose.node.builder.NodeProvider - -class ComposeInteraction( - val nodeProvider: NodeProvider, -) : Interaction { - - var semanticsNodeInteraction: SemanticsNodeInteraction = nodeProvider.provideSemanticsNodeInteraction() - private set - - override fun check(assertion: ComposeAssertion) { - assertion.execute(semanticsNodeInteraction) - } - - override fun perform(action: ComposeAction) { - action.execute(semanticsNodeInteraction) - } - - fun reFindNode() { - semanticsNodeInteraction = nodeProvider.provideSemanticsNodeInteraction() - } - - override fun toString(): String { - val nodeMatcher = nodeProvider.nodeMatcher - return "matcher: ${nodeMatcher.matcher.description}; " + - "position: ${nodeMatcher.position}; " + - "useUnmergedTree: ${nodeMatcher.useUnmergedTree}" - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationImpls.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationImpls.kt deleted file mode 100644 index f2f9682c..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationImpls.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.kakaocup.compose.intercept.operation - -import androidx.compose.ui.test.SemanticsNodeInteraction - -interface ComposeAction : ComposeOperation - -interface ComposeAssertion : ComposeOperation - -fun produceComposeAction( - type: ComposeOperationType, - description: String?, - action: SemanticsNodeInteraction.() -> Unit -): ComposeAction = object : ComposeAction { - override val type: ComposeOperationType = type - override val description: String? = description - override fun execute(innerView: SemanticsNodeInteraction) = action.invoke(innerView) - override fun toString(): String { - return "ComposeAction (type=$type, description=$description)" - } -} - -fun produceComposeAssertion( - type: ComposeOperationType, - description: String?, - action: SemanticsNodeInteraction.() -> Unit -): ComposeAssertion = object : ComposeAssertion { - override val type: ComposeOperationType = type - override val description: String? = description - override fun execute(innerView: SemanticsNodeInteraction) = action.invoke(innerView) - override fun toString(): String { - return "ComposeAssertion (type=$type, description=$description)" - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationType.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationType.kt deleted file mode 100644 index 96a8542e..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/intercept/operation/ComposeOperationType.kt +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.kakaocup.compose.intercept.operation - -/** - * Type of the concrete action executing on the given element of Jetpack Compose - */ -interface ComposeOperationType { - val name: String -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/NodeActions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/NodeActions.kt deleted file mode 100644 index 18d30279..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/NodeActions.kt +++ /dev/null @@ -1,265 +0,0 @@ -package io.github.kakaocup.compose.node.action - -import androidx.compose.ui.semantics.AccessibilityAction -import androidx.compose.ui.semantics.SemanticsActions -import androidx.compose.ui.semantics.SemanticsActions.ScrollBy -import androidx.compose.ui.semantics.SemanticsActions.ScrollToIndex -import androidx.compose.ui.semantics.SemanticsProperties.HorizontalScrollAxisRange -import androidx.compose.ui.semantics.SemanticsProperties.IndexForKey -import androidx.compose.ui.semantics.SemanticsProperties.VerticalScrollAxisRange -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.test.* -import io.github.kakaocup.compose.intercept.delegate.ComposeDelegate -import io.github.kakaocup.compose.intercept.operation.ComposeOperationType - -interface NodeActions { - val delegate: ComposeDelegate - - /** - * Performs a click action on the element represented by the given semantics node. - */ - fun performClick() { - delegate.perform(ComposeBaseActionType.PERFORM_CLICK) { performClick() } - } - - /** - * Scrolls the closest enclosing scroll parent by the smallest amount such that this node is fully - * visible in its viewport. If this node is larger than the viewport, scrolls the scroll parent - * by the smallest amount such that this node fills the entire viewport. A scroll parent is a - * parent node that has the semantics action [SemanticsActions.ScrollBy] (usually implemented by - * defining [scrollBy][androidx.compose.ui.semantics.scrollBy]). - * - * This action should be performed on the [node][SemanticsNodeInteraction] that is part of the - * scrollable content, not on the scrollable container. - * - * Throws an [AssertionError] if there is no scroll parent. - */ - fun performScrollTo() { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO) { performScrollTo() } - } - - /** - * Scrolls a scrollable container with items to the item with the given [index]. - * - * Note that not all scrollable containers have item indices. For example, a - * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an - * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does. - * - * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable - * container, not on a node that is part of the content of that container. - * - * Throws an [AssertionError] if the node doesn't have [ScrollToIndex] defined. - * - * @param index The index of the item to scroll to - * @see hasScrollToIndexAction - */ - @ExperimentalTestApi - fun performScrollToIndex(index: Int) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_INDEX) { performScrollToIndex(index) } - } - - /** - * Scrolls a scrollable container with keyed items to the item with the given [key], such as - * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] or - * [LazyRow][androidx.compose.foundation.lazy.LazyRow]. - * - * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable - * container, not on a node that is part of the content of that container. - * - * Throws an [AssertionError] if the node doesn't have [IndexForKey] or [ScrollToIndex] defined. - * - * @param key The key of the item to scroll to - * @see hasScrollToKeyAction - */ - @ExperimentalTestApi - fun performScrollToKey(key: Any) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_KEY) { performScrollToKey(key) } - } - - /** - * Scrolls a scrollable container to the content that matches the given [matcher]. If the content - * isn't yet visible, the scrollable container will be scrolled from the start till the end till - * it finds the content we're looking for. It is not defined where in the viewport the content - * will be on success of this function, but it will be either fully within the viewport if it is - * smaller than the viewport, or it will cover the whole viewport if it is larger than the - * viewport. If it doesn't find the content, the scrollable will be left at the end of the - * content and an [AssertionError] is thrown. - * - * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable - * container, not on a node that is part of the content of that container. If the container is a - * lazy container, it must support the semantics actions [ScrollToIndex], [ScrollBy], and either - * [HorizontalScrollAxisRange] or [VerticalScrollAxisRange], for example - * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] and - * [LazyRow][androidx.compose.foundation.lazy.LazyRow]. If the container is not lazy, it must - * support the semantics action [ScrollBy], for example, - * [Row][androidx.compose.foundation.layout.Row] or - * [Column][androidx.compose.foundation.layout.Column]. - * - * Throws an [AssertionError] if the scrollable node doesn't support the necessary semantics - * actions. - * - * @param matcher A matcher that identifies the content where the scrollable container needs to - * scroll to - * @return The [SemanticsNodeInteraction] that is the receiver of this method. Note that this is - * _not_ an interaction for the node that is identified by the [matcher]. - * - * @see hasScrollToNodeAction - */ - @ExperimentalTestApi - fun performScrollToNode(matcher: SemanticsMatcher) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_NODE) { performScrollToNode(matcher) } - } - - /** - * Executes the (partial) gesture specified in the given [block]. The gesture doesn't need to be - * complete and can be resumed in a later invocation of [performGesture]. It is the - * responsibility of the caller to make sure partial gestures don't leave the test in an - * inconsistent state. - * - * All events that are injected from the [block] are batched together and sent after [block] is - * complete. This method blocks until all those events have been injected, which normally takes - * as long as the duration of the gesture. If an error occurs during execution of [block] or - * injection of the events, all (subsequent) events are dropped and the error is thrown here. - * - * This method must not be called from the main thread. The block will be executed on the same - * thread as the caller. - * - * Example usage: - * ``` - * onNodeWithTag("myWidget") - * .performGesture { swipeUp() } - * - * onNodeWithTag("myWidget") - * .performGesture { click(center) } - * - * onNodeWithTag("myWidget") - * .performGesture { down(topLeft) } - * .assertHasClickAction() - * .performGesture { up(topLeft) } - * ``` - */ - @Deprecated( - message = "Replaced by performTouchInput", - replaceWith = ReplaceWith( - "performTouchInput(block)", - "import io.github.kakaocup.compose.node.action.performTouchInput" - ) - ) - fun performGesture( - block: GestureScope.() -> Unit - ) { - delegate.perform(ComposeBaseActionType.PERFORM_GESTURE) { performGesture(block) } - } - - /** - * Executes the touch gesture specified in the given [block]. The gesture doesn't need to be - * complete and can be resumed in a later invocation of one of the `perform.*Input` methods. The - * event time is initialized to the current time of the [MainTestClock]. - * - * Be aware that if you split a gesture over multiple invocations of `perform.*Input`, everything - * that happens in between will run as if the gesture is still ongoing (imagine a finger still - * touching the screen). - * - * All events that are injected from the [block] are batched together and sent after [block] is - * complete. This method blocks while the events are injected. If an error occurs during - * execution of [block] or injection of the events, all (subsequent) events are dropped and the - * error is thrown here. - * - * Due to the batching of events, all events in a block are sent together and no recomposition will - * take place in between events. Additionally all events will be generated before any of the events - * take effect. This means that the screen coordinates of all events are resolved before any of - * the events can cause the position of the node being injected into to change. This has certain - * advantages, for example, in the cases of nested scrolling or dragging an element around, it - * prevents the injection of events into a moving target since all events are enqueued before any - * of them has taken effect. - * - * Example of performing a swipe up: - * ``` - * onNodeWithTag("myComponent") - * .performTouchInput { swipeUp() } - * ``` - * Example of performing an off-center click: - * ``` - * onNodeWithTag("myComponent") - * .performTouchInput { click(percentOffset(.2f, .5f)) } - * ``` - * Example of doing an assertion during a click: - * ``` - * onNodeWithTag("myComponent") - * .performTouchInput { down(topLeft) } - * .assertHasClickAction() - * .performTouchInput { up() } - * ``` - * Example of performing a click-and-drag: - * ``` - * onNodeWithTag("myComponent").performTouchInput { - * click() - * advanceEventTime(100) - * swipeUp() - * } - * ``` - * - * @param block A lambda with [TouchInjectionScope] as receiver that describes the gesture by - * sending all touch events. - * @return The [SemanticsNodeInteraction] that is the receiver of this method - * - * @see TouchInjectionScope - */ - fun performTouchInput( - block: TouchInjectionScope.() -> Unit - ) { - delegate.perform(ComposeBaseActionType.PERFORM_TOUCH_INPUT) { performTouchInput(block) } - } - - /** - * Provides support to call custom semantics actions on this node. - * - * This method is supposed to be used for actions with parameters. - * - * This will properly verify that the actions exists and provide clear error message in case it - * does not. It also handle synchronization and performing the action on the UI thread. This call - * is blocking until the action is performed - * - * @param key Key of the action to be performed. - * @param invocation Place where you call your action. In the argument is provided the underlying - * action from the given Semantics action. - * - * @throws AssertionError If the semantics action is not defined on this node. - */ - fun > performSemanticsAction( - key: SemanticsPropertyKey>, - invocation: (T) -> Unit - ) { - delegate.perform(ComposeBaseActionType.PERFORM_SEMANTICS_ACTION) { performSemanticsAction(key, invocation) } - } - - /** - * Provides support to call custom semantics actions on this node. - * - * This method is for calling actions that have no parameters. - * - * This will properly verify that the actions exists and provide clear error message in case it - * does not. It also handle synchronization and performing the action on the UI thread. This call - * is blocking until the action is performed - * - * @param key Key of the action to be performed. - * - * @throws AssertionError If the semantics action is not defined on this node. - */ - fun performSemanticsAction( - key: SemanticsPropertyKey Boolean>> - ) { - delegate.perform(ComposeBaseActionType.PERFORM_SEMANTICS_ACTION) { performSemanticsAction(key) } - } - - enum class ComposeBaseActionType : ComposeOperationType { - PERFORM_CLICK, - PERFORM_SCROLL_TO, - PERFORM_SCROLL_TO_INDEX, - PERFORM_SCROLL_TO_KEY, - PERFORM_SCROLL_TO_NODE, - PERFORM_GESTURE, - PERFORM_TOUCH_INPUT, - PERFORM_SEMANTICS_ACTION, - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/TextActions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/TextActions.kt deleted file mode 100644 index 7b65b627..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/action/TextActions.kt +++ /dev/null @@ -1,68 +0,0 @@ -package io.github.kakaocup.compose.node.action - -import androidx.compose.ui.test.* -import androidx.compose.ui.text.TextRange -import io.github.kakaocup.compose.intercept.delegate.ComposeDelegate -import io.github.kakaocup.compose.intercept.operation.ComposeOperationType - -interface TextActions { - val delegate: ComposeDelegate - - /** - * Clears the text in this node in similar way to IME. - */ - fun performTextClearance() { - delegate.perform(ComposeTextActionType.PERFORM_TEXT_CLEARANCE) { performTextClearance() } - } - - /** - * Sends the given text to this node in similar way to IME. - * - * @param text Text to send. - */ - fun performTextInput(text: String) { - delegate.perform(ComposeTextActionType.PERFORM_TEXT_INPUT) { performTextInput(text) } - } - - /** - * Sends the given selection to this node in similar way to IME. - * - * @param selection selection to send - */ - @ExperimentalTestApi - fun performTextInputSelection(selection: TextRange) { - delegate.perform(ComposeTextActionType.PERFORM_TEXT_INPUT_SELECTION) { performTextInputSelection(selection) } - } - - /** - * Replaces existing text with the given text in this node in similar way to IME. - * - * This does not reflect text selection. All the text gets cleared out and new inserted. - * - * @param text Text to send. - */ - fun performTextReplacement(text: String) { - delegate.perform(ComposeTextActionType.PERFORM_TEXT_REPLACEMENT) { performTextReplacement(text) } - } - - /** - * Sends to this node the IME action associated with it in similar way to IME. - * - * The node needs to define its IME action in semantics. - * - * @throws AssertionError if the node does not support input or does not define IME action. - * @throws IllegalStateException if tne node did not establish input connection (e.g. is not - * focused) - */ - fun performImeAction() { - delegate.perform(ComposeTextActionType.PERFORM_IME_ACTION) { performImeAction() } - } - - enum class ComposeTextActionType : ComposeOperationType { - PERFORM_TEXT_CLEARANCE, - PERFORM_TEXT_INPUT, - PERFORM_TEXT_INPUT_SELECTION, - PERFORM_TEXT_REPLACEMENT, - PERFORM_IME_ACTION, - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/LazyListNodeAssertions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/LazyListNodeAssertions.kt deleted file mode 100644 index d0b70328..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/LazyListNodeAssertions.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.kakaocup.compose.node.assertion - -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.getOrNull -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.assert -import io.github.kakaocup.compose.exception.KakaoComposeException - -interface LazyListNodeAssertions : NodeAssertions { - val lengthSemanticsPropertyKey: SemanticsPropertyKey? - - /** - * Asserts that the lazy list length contains the given [length]. - * - * Throws [AssertionError] if the lazy list's length value is not equal to `length`. - * Throws [IllegalStateException] if the lazy list does not contain the [lengthSemanticsPropertyKey] modifier. - */ - fun assertLengthEquals(length: Int) { - delegate.check(NodeAssertions.ComposeBaseAssertionType.ASSERT_VALUE_EQUALS) { assert(hasLazyListLength(length)) } - } - - private fun hasLazyListLength(length: Int): SemanticsMatcher = SemanticsMatcher( - "The length of the lazy list is expected to be ${length}, but the actual size is different" - ) { node -> - val actualLength = node.config.getOrNull( - lengthSemanticsPropertyKey ?: throw KakaoComposeException("lengthSemanticsPropertyKey not provided to `KLazyListNode` constructor") - ) ?: error("Lazy list does not contain $lengthSemanticsPropertyKey modifier") - return@SemanticsMatcher actualLength == length - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/ListNodeAssertions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/ListNodeAssertions.kt deleted file mode 100644 index 40be9f7e..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/ListNodeAssertions.kt +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.kakaocup.compose.node.assertion -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.getOrNull -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.assert - -/** - * Basic assertions for working with lists. - */ -interface ListNodeAssertions : NodeAssertions { - - /** - * Semantic property for the list length. - */ - val lengthSemanticsPropertyKey: SemanticsPropertyKey - - /** - * Checks that the length of the list is equal to [length]. - * - * @throws [AssertionError] if the list length is not equal to [length]. - * @throws [IllegalStateException] if the list does not provide the [lengthSemanticsPropertyKey] property. - */ - fun assertLengthEquals(length: Int) { - delegate.check(NodeAssertions.ComposeBaseAssertionType.ASSERT_VALUE_EQUALS) { - assert(hasListLength(length)) - } - } - - private fun hasListLength(length: Int): SemanticsMatcher { - return SemanticsMatcher( - "The length of the list is expected to be $length, but the actual size is different" - ) { node -> - val actualLength = node.config.getOrNull(lengthSemanticsPropertyKey) - ?: error("List does not contain $lengthSemanticsPropertyKey modifier") - - actualLength == length - } - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/NodeAssertions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/NodeAssertions.kt deleted file mode 100644 index 2201c458..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/NodeAssertions.kt +++ /dev/null @@ -1,336 +0,0 @@ -package io.github.kakaocup.compose.node.assertion - -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.semantics.ProgressBarRangeInfo -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.getOrNull -import androidx.compose.ui.test.* -import io.github.kakaocup.compose.intercept.delegate.ComposeDelegate -import io.github.kakaocup.compose.intercept.operation.ComposeOperationType - -interface NodeAssertions { - val delegate: ComposeDelegate - - fun assertIsDisplayed() { - delegate.check(ComposeBaseAssertionType.IS_DISPLAYED) { assertIsDisplayed() } - } - - /** - * Asserts that the current semantics node is not displayed on screen. - * - * Throws [AssertionError] if the node is displayed. - */ - fun assertIsNotDisplayed() { - delegate.check(ComposeBaseAssertionType.IS_NOT_DISPLAYED) { assertIsNotDisplayed() } - } - - /** - * Asserts that the current semantics node is enabled. - * - * Throws [AssertionError] if the node is not enabled or does not define the property at all. - */ - fun assertIsEnabled() { - delegate.check(ComposeBaseAssertionType.IS_ENABLED) { assertIsEnabled() } - } - - /** - * Asserts that the current semantics node is not enabled. - * - * Throws [AssertionError] if the node is enabled or does not defined the property at all. - */ - fun assertIsNotEnabled() { - delegate.check(ComposeBaseAssertionType.IS_NOT_ENABLED) { assertIsNotEnabled() } - } - - /** - * Asserts that the current semantics node is checked. - * - * Throws [AssertionError] if the node is not unchecked, indeterminate, or not toggleable. - */ - fun assertIsOn() { - delegate.check(ComposeBaseAssertionType.IS_ON) { assertIsOn() } - } - - /** - * Asserts that the current semantics node is unchecked. - * - * Throws [AssertionError] if the node is checked, indeterminate, or not toggleable. - */ - fun assertIsOff() { - delegate.check(ComposeBaseAssertionType.IS_OFF) { assertIsOff() } - } - - /** - * Asserts that the current semantics node is selected. - * - * Throws [AssertionError] if the node is unselected or not selectable. - */ - fun assertIsSelected() { - delegate.check(ComposeBaseAssertionType.IS_SELECTED) { assertIsSelected() } - } - - /** - * Asserts that the current semantics node is not selected. - * - * Throws [AssertionError] if the node is selected or not selectable. - */ - fun assertIsNotSelected() { - delegate.check(ComposeBaseAssertionType.IS_NOT_SELECTED) { assertIsNotSelected() } - } - /** - * Asserts that the current semantics node is toggleable. - * - * Throws [AssertionError] if the node is not toggleable. - */ - fun assertIsToggleable() { - delegate.check(ComposeBaseAssertionType.IS_TOGGLEABLE) { assertIsToggleable() } - } - - /** - * Asserts that the current semantics node is selectable. - * - * Throws [AssertionError] if the node is not selectable. - */ - fun assertIsSelectable() { - delegate.check(ComposeBaseAssertionType.IS_SELECTABLE) { assertIsSelectable() } - } - /** - * Asserts that the current semantics node has a focus. - * - * Throws [AssertionError] if the node is not in the focus or does not defined the property at all. - */ - fun assertIsFocused() { - delegate.check(ComposeBaseAssertionType.IS_FOCUSED) { assertIsFocused() } - } - - /** - * Asserts that the current semantics node does not have a focus. - * - * Throws [AssertionError] if the node is in the focus or does not defined the property at all. - */ - fun assertIsNotFocused() { - delegate.check(ComposeBaseAssertionType.IS_NOT_FOCUSED) { assertIsNotFocused() } - } - - /** - * Asserts that the node's content description contains exactly the given [values] and nothing else. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * Throws [AssertionError] if the node's descriptions don't contain all items from [values], or - * if the descriptions contain extra items that are not in [values]. - * - * @param values List of values to match (the order does not matter) - * @see SemanticsProperties.ContentDescription - */ - fun assertContentDescriptionEquals( - vararg values: String - ) { - delegate.check(ComposeBaseAssertionType.ASSERT_CONTENT_DESCRIPTION_EQUALS) { assertContentDescriptionEquals(values = values) } - } - - /** - * Asserts that the node's content description contains the given [value]. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value - * - * @param value Value to match as one of the items in the list of content descriptions. - * @param substring Whether this can be satisfied as a substring match of an item in the list of - * descriptions. - * @param ignoreCase Whether case should be ignored. - * @see SemanticsProperties.ContentDescription - */ - fun assertContentDescriptionContains( - value: String, - substring: Boolean = false, - ignoreCase: Boolean = false - ) { - delegate.check(ComposeBaseAssertionType.ASSERT_CONTENT_DESCRIPTION_CONTAINS) { assertContentDescriptionContains(value, substring, ignoreCase) } - } - - /** - * Asserts that the node's text contains exactly the given [values] and nothing else. - * - * This will also search in [SemanticsProperties.EditableText] by default. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * Throws [AssertionError] if the node's text values don't contain all items from [values], or - * if the text values contain extra items that are not in [values]. - * - * @param values List of values to match (the order does not matter) - * @param includeEditableText Whether to also assert against the editable text. - * @see SemanticsProperties.ContentDescription - */ - fun assertTextEquals( - vararg values: String, - includeEditableText: Boolean = true - ) { - delegate.check(ComposeBaseAssertionType.ASSERT_TEXT_EQUALS) { assertTextEquals(values = values, includeEditableText = includeEditableText) } - } - - /** - * Asserts that the node's text contains the given [value]. - * - * This will also search in [SemanticsProperties.EditableText]. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value - * - * @param value Value to match as one of the items in the list of text values. - * @param substring Whether this can be satisfied as a substring match of an item in the list of - * text. - * @param ignoreCase Whether case should be ignored. - * @see SemanticsProperties.Text - */ - fun assertTextContains( - value: String, - substring: Boolean = false, - ignoreCase: Boolean = false - ) { - delegate.check(ComposeBaseAssertionType.ASSERT_TEXT_CONTAINS) { assertTextContains(value, substring, ignoreCase) } - } - - /** - * Asserts the node's value equals the given value. - * - * For further details please check [SemanticsProperties.StateDescription]. - * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value - */ - fun assertValueEquals(value: String) { - delegate.check(ComposeBaseAssertionType.ASSERT_VALUE_EQUALS) { assertValueEquals(value) } - } - - /** - * Asserts the node's range info equals the given value. - * - * For further details please check [SemanticsProperties.ProgressBarRangeInfo]. - * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value - */ - fun assertRangeInfoEquals(value: ProgressBarRangeInfo) { - delegate.check(ComposeBaseAssertionType.ASSERT_RANGE_INFO_EQUALS) { assertRangeInfoEquals(value) } - } - - /** - * Asserts that the current semantics node has a click action. - * - * Throws [AssertionError] if the node is doesn't have a click action. - */ - fun assertHasClickAction() { - delegate.check(ComposeBaseAssertionType.ASSERT_HAS_CLICK_ACTION) { assertHasClickAction() } - } - - /** - * Asserts that the current semantics node has doesn't have a click action. - * - * Throws [AssertionError] if the node has a click action. - */ - fun assertHasNoClickAction() { - delegate.check(ComposeBaseAssertionType.ASSERT_HAS_NO_CLICK_ACTION) { assertHasNoClickAction() } - } - - /** - * Asserts that no item was found or that the item is no longer in the hierarchy. - * - * This will synchronize with the UI and fetch all the nodes again to ensure it has latest data. - * - * @throws [AssertionError] if the assert fails. - */ - fun assertDoesNotExist() { - delegate.check(ComposeBaseAssertionType.ASSERT_DOES_NOT_EXIST) { assertDoesNotExist() } - } - - /** - * Asserts that the component was found and is part of the component tree. - * - * This will synchronize with the UI and fetch all the nodes again to ensure it has latest data. - * If you are using [fetchSemanticsNode] you don't need to call this. In fact you would just - * introduce additional overhead. - * - * @param errorMessageOnFail Error message prefix to be added to the message in case this - * asserts fails. This is typically used by operations that rely on this assert. Example prefix - * could be: "Failed to perform doOnClick.". - * - * @throws [AssertionError] if the assert fails. - */ - fun assertExists(errorMessageOnFail: String? = null) { - delegate.check(ComposeBaseAssertionType.ASSERT_EXISTS) { assertExists(errorMessageOnFail) } - } - - /** - * Asserts that the provided matcher is satisfied for this node. - * @param matcher Matcher to verify. - * @param messagePrefixOnError Prefix to be put in front of an error that gets thrown in case this assert fails. - * This can be helpful in situations where this assert fails as part of a bigger operation that used this assert as a precondition check. - * @throws [AssertionError] if the matcher does not match or the node can no longer be found. - */ - fun assert( - matcher: SemanticsMatcher, - messagePrefixOnError: (() -> String)? = null - ) { - delegate.check(ComposeBaseAssertionType.ASSERT) { assert(matcher, messagePrefixOnError) } - } - - /** - * Asserts that the provided `expected` is satisfied for this node. - * @param expected expected value. - * @param semanticsPropertyKey semantics Property key - * @param property free text about the field (Displayed in case of [AssertionError]) - * @throws [AssertionError] if the matcher does not match or the node can no longer be found. - */ - fun assertHasProperty(expected: T, - semanticsPropertyKey: SemanticsPropertyKey<*>, - property: String? = null, - ) { - delegate.check(ComposeBaseAssertionType.ASSERT_VALUE_EQUALS) { - assert( - SemanticsMatcher( - property?.let { "The $it is expected to be $expected, but the actual $it is different" }.orEmpty() - ) { node -> - val actual = node.config.getOrNull(semanticsPropertyKey) - ?: error("Compose view does not contain $semanticsPropertyKey modifier") - - return@SemanticsMatcher actual == expected - } - ) - } - } - - enum class ComposeBaseAssertionType : ComposeOperationType { - IS_DISPLAYED, - IS_NOT_DISPLAYED, - IS_ENABLED, - IS_NOT_ENABLED, - IS_ON, - IS_OFF, - IS_SELECTED, - IS_NOT_SELECTED, - IS_TOGGLEABLE, - IS_SELECTABLE, - IS_FOCUSED, - IS_NOT_FOCUSED, - ASSERT_CONTENT_DESCRIPTION_EQUALS, - ASSERT_CONTENT_DESCRIPTION_CONTAINS, - ASSERT_TEXT_EQUALS, - ASSERT_TEXT_CONTAINS, - ASSERT_VALUE_EQUALS, - ASSERT_RANGE_INFO_EQUALS, - ASSERT_HAS_CLICK_ACTION, - ASSERT_HAS_NO_CLICK_ACTION, - ASSERT_DOES_NOT_EXIST, - ASSERT_EXISTS, - ASSERT, - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/TextResourcesNodeAssertions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/TextResourcesNodeAssertions.kt deleted file mode 100644 index 7fb87a68..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/assertion/TextResourcesNodeAssertions.kt +++ /dev/null @@ -1,111 +0,0 @@ -package io.github.kakaocup.compose.node.assertion - -import androidx.annotation.StringRes -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.test.* -import io.github.kakaocup.compose.utilities.getResourceString - -interface TextResourcesNodeAssertions : NodeAssertions { - /** - * Asserts that the node's content description contains exactly the given [values] and nothing else. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * Throws [AssertionError] if the node's descriptions don't contain all items from [values], or - * if the descriptions contain extra items that are not in [values]. - * - * @param values List of string resources id's values to match (the order does not matter) - * @see SemanticsProperties.ContentDescription - */ - fun assertContentDescriptionEquals( - @StringRes vararg values: Int - ) { - assertContentDescriptionEquals(values = values.map(::getResourceString).toTypedArray()) - } - - /** - * Asserts that the node's content description contains the given [value]. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value - * - * @param value String resource id value to match as one of the items in the list of content descriptions. - * @param substring Whether this can be satisfied as a substring match of an item in the list of - * descriptions. - * @param ignoreCase Whether case should be ignored. - * @see SemanticsProperties.ContentDescription - */ - fun assertContentDescriptionContains( - @StringRes value: Int, - substring: Boolean = false, - ignoreCase: Boolean = false - ) { - assertContentDescriptionContains(getResourceString(value), substring, ignoreCase) - } - - /** - * Asserts that the node's text contains exactly the given [values] and nothing else. - * - * This will also search in [SemanticsProperties.EditableText] by default. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * Throws [AssertionError] if the node's text values don't contain all items from [values], or - * if the text values contain extra items that are not in [values]. - * - * @param values List of string resources id's to match (the order does not matter) - * @param includeEditableText Whether to also assert against the editable text. - * @see SemanticsProperties.ContentDescription - */ - fun assertTextEquals( - @StringRes vararg values: Int, - includeEditableText: Boolean = true - ) { - assertTextEquals( - values = values.map(::getResourceString).toTypedArray(), - includeEditableText = includeEditableText - ) - } - - /** - * Asserts that the node's text contains the given [value]. - * - * This will also search in [SemanticsProperties.EditableText]. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value - * - * @param value String resource id value to match as one of the items in the list of text values. - * @param substring Whether this can be satisfied as a substring match of an item in the list of - * text. - * @param ignoreCase Whether case should be ignored. - * @see SemanticsProperties.Text - */ - fun assertTextContains( - @StringRes value: Int, - substring: Boolean = false, - ignoreCase: Boolean = false - ) { - assertTextContains(getResourceString(value), substring, ignoreCase) - } - - /** - * Asserts the node's value equals the given value. - * - * For further details please check [SemanticsProperties.StateDescription]. - * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value - */ - fun assertValueEquals(@StringRes value: Int) { - delegate.check(NodeAssertions.ComposeBaseAssertionType.ASSERT_VALUE_EQUALS) { assertValueEquals(getResourceString(value)) } - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeMatcher.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeMatcher.kt deleted file mode 100644 index ae1f157a..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeMatcher.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.github.kakaocup.compose.node.builder - -import androidx.compose.ui.test.SemanticsMatcher -import io.github.kakaocup.compose.KakaoCompose - -data class NodeMatcher( - val matcher: SemanticsMatcher, - val position: Int = 0, - val useUnmergedTree: Boolean = KakaoCompose.Override.useUnmergedTree ?: false, -) \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeProvider.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeProvider.kt deleted file mode 100644 index 2350e772..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/NodeProvider.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.kakaocup.compose.node.builder - -import androidx.compose.ui.test.SemanticsNodeInteraction -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider - -class NodeProvider( - val nodeMatcher: NodeMatcher, - private val semanticsProvider: SemanticsNodeInteractionsProvider, -) { - - fun provideSemanticsNodeInteraction(): SemanticsNodeInteraction { - return semanticsProvider.onAllNodes( - nodeMatcher.matcher, - nodeMatcher.useUnmergedTree - )[nodeMatcher.position] - } -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/ViewBuilder.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/ViewBuilder.kt deleted file mode 100644 index 4987a494..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/builder/ViewBuilder.kt +++ /dev/null @@ -1,465 +0,0 @@ -package io.github.kakaocup.compose.node.builder - -import androidx.annotation.StringRes -import androidx.compose.ui.semantics.* -import androidx.compose.ui.test.* -import androidx.compose.ui.text.input.ImeAction -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.node.core.ComposeMarker -import io.github.kakaocup.compose.utilities.getResourceString - -@ComposeMarker -class ViewBuilder { - - private val semanticsMatcherList = mutableListOf() - - private var position = 0 - - var useUnmergedTree: Boolean = KakaoCompose.Override.useUnmergedTree ?: false - - fun isEnabled() = addFilter(androidx.compose.ui.test.isEnabled()) - - /** - * Returns whether the node is not enabled. - * - * @see SemanticsProperties.Disabled - */ - fun isNotEnabled() = addFilter(androidx.compose.ui.test.isNotEnabled()) - - /** - * Return whether the node is checkable. - * - * @see SemanticsProperties.ToggleableState - */ - fun isToggleable() = addFilter(androidx.compose.ui.test.isToggleable()) - - /** - * Returns whether the node is toggled. - * - * @see SemanticsProperties.ToggleableState - */ - fun isOn() = addFilter(androidx.compose.ui.test.isOn()) - /** - * Returns whether the node is not toggled. - * - * @see SemanticsProperties.ToggleableState - */ - fun isOff() = addFilter(androidx.compose.ui.test.isOff()) - - /** - * Return whether the node is selectable. - * - * @see SemanticsProperties.Selected - */ - fun isSelectable() = addFilter(androidx.compose.ui.test.isSelectable()) - - /** - * Returns whether the node is selected. - * - * @see SemanticsProperties.Selected - */ - fun isSelected() = addFilter(androidx.compose.ui.test.isSelected()) - - /** - * Returns whether the node is not selected. - * - * @see SemanticsProperties.Selected - */ - fun isNotSelected() = addFilter(androidx.compose.ui.test.isNotSelected()) - - /** - * Return whether the node is able to receive focus - * - * @see SemanticsProperties.Focused - */ - fun isFocusable() = addFilter(androidx.compose.ui.test.isFocusable()) - - /** - * Return whether the node is not able to receive focus. - * - * @see SemanticsProperties.Focused - */ - fun isNotFocusable() = addFilter(androidx.compose.ui.test.isNotFocusable()) - - /** - * Returns whether the node is focused. - * - * @see SemanticsProperties.Focused - */ - fun isFocused() = addFilter(androidx.compose.ui.test.isFocused()) - - /** - * Returns whether the node is not focused. - * - * @see SemanticsProperties.Focused - */ - fun isNotFocused() = addFilter(androidx.compose.ui.test.isNotFocused()) - - /** - * Return whether the node has a semantics click action defined. - * - * @see SemanticsActions.OnClick - */ - fun hasClickAction() = addFilter(androidx.compose.ui.test.hasClickAction()) - /** - * Return whether the node has no semantics click action defined. - * - * @see SemanticsActions.OnClick - */ - fun hasNoClickAction() = addFilter(androidx.compose.ui.test.hasNoClickAction()) - - /** - * Return whether the node has a semantics scrollable action defined. - * - * @see SemanticsActions.ScrollBy - */ - fun hasScrollAction() = addFilter(androidx.compose.ui.test.hasScrollAction()) - - /** - * Return whether the node has no semantics scrollable action defined. - * - * @see SemanticsActions.ScrollBy - */ - fun hasNoScrollAction() = addFilter(androidx.compose.ui.test.hasNoScrollAction()) - - /** - * Returns whether the node's content description contains the given [value]. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * @param value Value to match as one of the items in the list of content descriptions. - * @param substring Whether to use substring matching. - * @param ignoreCase Whether case should be ignored. - * - * @see SemanticsProperties.ContentDescription - */ - fun hasContentDescription( - value: String, - substring: Boolean = false, - ignoreCase: Boolean = false - ) = addFilter(androidx.compose.ui.test.hasContentDescription(value, substring, ignoreCase)) - - /** - * Returns whether the node's content description contains the given [value]. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * @param resId String resource id to match as one of the items in the list of content descriptions. - * @param substring Whether to use substring matching. - * @param ignoreCase Whether case should be ignored. - * - * @see SemanticsProperties.ContentDescription - */ - fun hasContentDescription( - @StringRes resId: Int, - substring: Boolean = false, - ignoreCase: Boolean = false - ) = hasContentDescription(getResourceString(resId), substring, ignoreCase) - - /** - * Returns whether the node's content description contains exactly the given [values] and nothing - * else. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * @param values List of values to match (the order does not matter) - * - * @see SemanticsProperties.ContentDescription - */ - fun hasContentDescriptionExactly( - vararg values: String - ) = addFilter(androidx.compose.ui.test.hasContentDescriptionExactly(values = values)) - - /** - * Returns whether the node's content description contains exactly the given [values] and nothing - * else. - * - * Note that in merged semantics tree there can be a list of content descriptions that got merged - * from the child nodes. Typically an accessibility tooling will decide based on its heuristics - * which ones to announce. - * - * @param resIds List of string resources id's values to match (the order does not matter) - * - * @see SemanticsProperties.ContentDescription - */ - fun hasContentDescriptionExactly( - @StringRes vararg resIds: Int - ) = hasContentDescriptionExactly(values = resIds.map(::getResourceString).toTypedArray()) - - /** - * Returns whether the node's text contains the given [text]. - * - * This will also search in [SemanticsProperties.EditableText]. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * @param text Value to match as one of the items in the list of text values. - * @param substring Whether to use substring matching. - * @param ignoreCase Whether case should be ignored. - * - * @see SemanticsProperties.Text - * @see SemanticsProperties.EditableText - */ - fun hasText( - text: String, - substring: Boolean = false, - ignoreCase: Boolean = false - ) = addFilter(androidx.compose.ui.test.hasText(text, substring, ignoreCase)) - - /** - * Returns whether the node's text contains the given [text]. - * - * This will also search in [SemanticsProperties.EditableText]. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * @param resId String resource id value to match as one of the items in the list of text values. - * @param substring Whether to use substring matching. - * @param ignoreCase Whether case should be ignored. - * - * @see SemanticsProperties.Text - * @see SemanticsProperties.EditableText - */ - fun hasText( - @StringRes resId: Int, - substring: Boolean = false, - ignoreCase: Boolean = false - ) = hasText(getResourceString(resId), substring, ignoreCase) - - /** - * Returns whether the node's text contains exactly the given [values] and nothing else. - * - * This will also search in [SemanticsProperties.EditableText] by default. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * @param textValues List of values to match (the order does not matter) - * @param includeEditableText Whether to also assert against the editable text. - * - * @see SemanticsProperties.Text - * @see SemanticsProperties.EditableText - */ - fun hasTextExactly( - vararg textValues: String, - includeEditableText: Boolean = true - ) = addFilter(androidx.compose.ui.test.hasTextExactly( - textValues = textValues, - includeEditableText = includeEditableText)) - - /** - * Returns whether the node's text contains exactly the given [values] and nothing else. - * - * This will also search in [SemanticsProperties.EditableText] by default. - * - * Note that in merged semantics tree there can be a list of text items that got merged from - * the child nodes. Typically an accessibility tooling will decide based on its heuristics which - * ones to use. - * - * @param resIds Values List of string resources id's to match (the order does not matter) - * @param includeEditableText Whether to also assert against the editable text. - * - * @see SemanticsProperties.Text - * @see SemanticsProperties.EditableText - */ - fun hasTextExactly( - @StringRes vararg resIds: Int, - includeEditableText: Boolean = true - ) = hasTextExactly( - textValues = resIds.map(::getResourceString).toTypedArray(), - includeEditableText = includeEditableText - ) - - /** - * Returns whether the node's value matches exactly to the given accessibility value. - * - * @param value Value to match. - * - * @see SemanticsProperties.StateDescription - */ - fun hasStateDescription(value: String) = - addFilter(androidx.compose.ui.test.hasStateDescription(value)) - - /** - * Returns whether the node's value matches exactly to the given accessibility value. - * - * @param resId String resource id value to match. - * - * @see SemanticsProperties.StateDescription - */ - fun hasStateDescription(@StringRes resId: Int) = hasStateDescription(getResourceString(resId)) - - /** - * Returns whether the node is marked as an accessibility header. - * - * @see SemanticsProperties.Heading - */ - fun isHeading() = addFilter(androidx.compose.ui.test.isHeading()) - - /** - * Returns whether the node's range info matches exactly to the given accessibility range info. - * - * @param rangeInfo range info to match. - * - * @see SemanticsProperties.ProgressBarRangeInfo - */ - fun hasProgressBarRangeInfo(rangeInfo: ProgressBarRangeInfo) = - addFilter(androidx.compose.ui.test.hasProgressBarRangeInfo(rangeInfo)) - - /** - * Returns whether the node is annotated by the given test tag. - * - * @param testTag Value to match. - * - * @see SemanticsProperties.TestTag - */ - fun hasTestTag(testTag: String) = addFilter(androidx.compose.ui.test.hasTestTag(testTag)) - - /** - * Returns whether the node is annotated by the given test tag. - * - * @param resId String resource id to match. - * - * @see SemanticsProperties.TestTag - */ - fun hasTestTag(@StringRes resId: Int) = hasTestTag(getResourceString(resId)) - - /** - * Returns whether the node is a dialog. - * - * This only checks if the node itself is a dialog, not if it is _part of_ a dialog. Use - * `hasAnyAncestorThat(isDialog())` for that. - * - * @see SemanticsProperties.IsDialog - */ - fun isDialog() = addFilter(androidx.compose.ui.test.isDialog()) - - /** - * Returns whether the node is a popup. - * - * This only checks if the node itself is a popup, not if it is _part of_ a popup. Use - * `hasAnyAncestorThat(isPopup())` for that. - * - * @see SemanticsProperties.IsPopup - */ - fun isPopup() = addFilter(androidx.compose.ui.test.isPopup()) - - /** - * Returns whether the node defines the given IME action. - * - * @param actionType the action to match. - */ - fun hasImeAction(actionType: ImeAction) = addFilter(androidx.compose.ui.test.hasImeAction(actionType)) - - /** - * Returns whether the node defines semantics action to set text to it. - * - * This can be used to for instance filter out text fields. - * - * @see SemanticsActions.SetText - */ - fun hasSetTextAction() = addFilter(androidx.compose.ui.test.hasSetTextAction()) - - /** - * Returns whether the node defines the ability to scroll to an item index. - * - * Note that not all scrollable containers have item indices. For example, a - * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an - * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does. - */ - @ExperimentalTestApi - fun hasScrollToIndexAction() = addFilter(androidx.compose.ui.test.hasScrollToIndexAction()) - - /** - * Returns whether the node defines the ability to scroll to an item identified by a key, such as - * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] or - * [LazyRow][androidx.compose.foundation.lazy.LazyRow]. - */ - @ExperimentalTestApi - fun hasScrollToKeyAction() = addFilter(androidx.compose.ui.test.hasScrollToKeyAction()) - - - /** - * Return whether the node is the root semantics node. - * - * There is always one root in every node tree, added implicitly by Compose. - */ - fun isRoot() = addFilter(androidx.compose.ui.test.isRoot()) - - /** - * Returns whether the node's parent satisfies the given matcher. - * - * Returns false if no parent exists. - */ - fun hasParent(matcher: SemanticsMatcher) = addFilter(androidx.compose.ui.test.hasParent(matcher)) - - /** - * Returns whether the node has at least one child that satisfies the given matcher. - */ - fun hasAnyChild(matcher: SemanticsMatcher) = addFilter(androidx.compose.ui.test.hasAnyChild(matcher)) - - /** - * Returns whether the node has at least one sibling that satisfies the given matcher. - * - * Sibling is defined as a any other node that shares the same parent. - */ - fun hasAnySibling(matcher: SemanticsMatcher) = addFilter(androidx.compose.ui.test.hasAnySibling(matcher)) - - /** - * Returns whether the node has at least one ancestor that satisfies the given matcher. - * - * Example: For the following tree - * |-X - * |-A - * |-B - * |-C1 - * |-C2 - * In case of C1, we would check the matcher against A and B - */ - fun hasAnyAncestor(matcher: SemanticsMatcher) = addFilter(androidx.compose.ui.test.hasAnyAncestor(matcher)) - - /** - * Returns whether the node has at least one descendant that satisfies the given matcher. - * - * Example: For the following tree - * |-X - * |-A - * |-B - * |-C1 - * |-C2 - * In case of A, we would check the matcher against B,C1 and C2 - */ - fun hasAnyDescendant(matcher: SemanticsMatcher) = addFilter(androidx.compose.ui.test.hasAnyDescendant(matcher)) - - /** - * Returns whether the node matches exactly to the given custom matcher. - */ - fun addSemanticsMatcher(matcher: SemanticsMatcher) = addFilter(matcher) - - fun hasPosition(position: Int) { - this.position = position - } - - private fun addFilter(semanticsMatcher: SemanticsMatcher) { - semanticsMatcherList.add(semanticsMatcher) - } - - fun build(): NodeMatcher { - if (semanticsMatcherList.isEmpty()) throw ViewBuilderException("Please set matchers for your Element!") - val matcher = semanticsMatcherList.reduce { finalMatcher, matcher -> finalMatcher and matcher } - return NodeMatcher(matcher, position, useUnmergedTree) - } -} - -private class ViewBuilderException(message: String) : RuntimeException(message) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/BaseNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/BaseNode.kt deleted file mode 100644 index 67824b25..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/BaseNode.kt +++ /dev/null @@ -1,122 +0,0 @@ -package io.github.kakaocup.compose.node.core - -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteraction -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.isDisplayed -import androidx.compose.ui.test.junit4.ComposeTestRule -import io.github.kakaocup.compose.intercept.delegate.ComposeDelegate -import io.github.kakaocup.compose.intercept.delegate.ComposeInterceptable -import io.github.kakaocup.compose.node.action.NodeActions -import io.github.kakaocup.compose.node.action.TextActions -import io.github.kakaocup.compose.node.assertion.NodeAssertions -import io.github.kakaocup.compose.node.assertion.TextResourcesNodeAssertions -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.NodeProvider -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.utilities.checkNotNull -import io.github.kakaocup.compose.utilities.orGlobal - -@ComposeMarker -abstract class BaseNode> constructor( - var semanticsProvider: SemanticsNodeInteractionsProvider? = null, - private var nodeMatcher: NodeMatcher? = null, - private var parentNode: BaseNode<*>? = null, -) : KDSL, - NodeAssertions, - TextResourcesNodeAssertions, - NodeActions, - TextActions, - ComposeInterceptable { - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : this( - semanticsProvider = semanticsProvider, - nodeMatcher = ViewBuilder().apply(viewBuilderAction).build(), - parentNode = null - ) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : this( - semanticsProvider = semanticsProvider, - nodeMatcher = nodeMatcher, - parentNode = null - ) - - override val delegate: ComposeDelegate by lazy(LazyThreadSafetyMode.NONE) { - ComposeDelegate( - nodeProvider = NodeProvider( - nodeMatcher = NodeMatcher( - matcher = combineSemanticMatchers(), - position = nodeMatcher.checkNotNull().position, - useUnmergedTree = nodeMatcher.checkNotNull().useUnmergedTree - ), - semanticsProvider = semanticsProvider.orGlobal().checkNotNull() - ), - parentDelegate = parentNode?.delegate - ) - } - - inline fun child(function: ViewBuilder.() -> Unit): N { - return N::class.java.getConstructor( - SemanticsNodeInteractionsProvider::class.java, - NodeMatcher::class.java, - BaseNode::class.java, - ).newInstance( - semanticsProvider.orGlobal().checkNotNull(), - ViewBuilder().apply(function).build(), - this, - ) - } - - /** - * Method for deferred initialization of [BaseNode] constructor parameters. - * Simplifies the description of child nodes in list nodes. - */ - fun initSemantics( - semanticsProvider: SemanticsNodeInteractionsProvider, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) { - this.semanticsProvider = semanticsProvider - this.nodeMatcher = nodeMatcher - this.parentNode = parentNode - } - - /*** - * Combines semantic matchers from all ancestor nodes - */ - private fun combineSemanticMatchers(): SemanticsMatcher { - val semanticsMatcherList = mutableListOf() - var parent = this.parentNode - - while (parent != null) { - semanticsMatcherList.add(hasAnyAncestor(parent.nodeMatcher.checkNotNull().matcher)) - parent = parent.parentNode - } - semanticsMatcherList.add(this.nodeMatcher.checkNotNull().matcher) - - return semanticsMatcherList.reduce { finalMatcher, matcher -> finalMatcher and matcher } - } - - fun waitUntil( - composeTestRule: ComposeTestRule = semanticsProvider as ComposeTestRule, - timeoutMillis: Long = 1_000, - condition: SemanticsNodeInteraction.() -> Unit - ) { - composeTestRule.waitUntil(timeoutMillis) { - try { - condition.invoke(this.delegate.interaction.semanticsNodeInteraction) - true - } catch (e: AssertionError) { - false - } - } - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/ComposeMarker.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/ComposeMarker.kt deleted file mode 100644 index 1a0754f6..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/core/ComposeMarker.kt +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.kakaocup.compose.node.core - -@DslMarker -annotation class ComposeMarker \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/ComposeScreen.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/ComposeScreen.kt deleted file mode 100644 index c9f7136f..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/ComposeScreen.kt +++ /dev/null @@ -1,61 +0,0 @@ -package io.github.kakaocup.compose.node.element - -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.core.ComposeMarker -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.utilities.checkNotNull -import io.github.kakaocup.compose.utilities.orGlobal - -@Suppress("UNCHECKED_CAST") -@ComposeMarker -open class ComposeScreen> : BaseNode { - - internal constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: ComposeScreen? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher = NodeMatcher( - matcher = SemanticsMatcher( - description = "Empty matcher", - matcher = { true } - ) - ), - ) : super(semanticsProvider, nodeMatcher) - - fun onNode(viewBuilderAction: ViewBuilder.() -> Unit) = KNode( - semanticsProvider.orGlobal().checkNotNull(), - viewBuilderAction, - ) - - companion object { - inline fun > onComposeScreen( - semanticsProvider: SemanticsNodeInteractionsProvider, - noinline function: T.() -> Unit, - ): T = T::class.java - .getDeclaredConstructor( - SemanticsNodeInteractionsProvider::class.java - ) - .newInstance(semanticsProvider) - .apply { this(function) } - - inline fun > onComposeScreen( - noinline function: T.() -> Unit, - ): T = - T::class.java.getDeclaredConstructor() - .newInstance() - .apply { this(function) } - - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/KNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/KNode.kt deleted file mode 100644 index df041f45..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/KNode.kt +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.kakaocup.compose.node.element - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode - -open class KNode : BaseNode { - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null, - ) : super(semanticsProvider, nodeMatcher, parentNode) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - ) : super(semanticsProvider, viewBuilderAction) - - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - ) : super(semanticsProvider, nodeMatcher) -} \ No newline at end of file diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemBuilder.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemBuilder.kt deleted file mode 100644 index 669d8091..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemBuilder.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.kakaocup.compose.node.element.lazylist - -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import kotlin.reflect.KClass - -/** - * Class that maps types to providing functions - * - * To be able to support different item types in KLazyListNode, this class - * adds support for mapping item type classes to functions that provide them. - * - * @see itemType - */ -class KLazyListItemBuilder { - val itemTypes = mutableMapOf>, KListItemType>>() - - /** - * Adds entry that helps KLazyListNode to automatically build child nodes - * - * @param provideItem Function that takes params and returns instance of item node - */ - inline fun > itemType(noinline provideItem: (SemanticsNode, SemanticsNodeInteractionsProvider) -> T) { - itemTypes[T::class] = KListItemType(provideItem) - } -} - -class KListItemType>(val provideItem: (SemanticsNode, SemanticsNodeInteractionsProvider) -> T) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemNode.kt deleted file mode 100644 index 84efbbc7..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListItemNode.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.kakaocup.compose.node.element.lazylist - -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.core.BaseNode - -/** - * Base class for KLazyListNode items - * - * Matches LazyList children by given semantics node id - * - * @param semanticNode A list of key/value pairs associated with a layout node or its subtree - * @param semanticsProvider Provides main entry point into testing - */ -abstract class KLazyListItemNode>( - semanticNode: SemanticsNode, - semanticsProvider: SemanticsNodeInteractionsProvider? = null, -) : BaseNode( - semanticsProvider, - NodeMatcher( - matcher = SemanticsMatcher( - description = "Semantics node id = ${semanticNode.id}", - matcher = { it.id == semanticNode.id }, - ) - ), -) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListNode.kt deleted file mode 100644 index c4fa694d..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/KLazyListNode.kt +++ /dev/null @@ -1,161 +0,0 @@ -package io.github.kakaocup.compose.node.element.lazylist - -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.test.filter -import androidx.compose.ui.test.filterToOne -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.onChildren -import io.github.kakaocup.compose.node.assertion.LazyListNodeAssertions -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.utilities.checkNotNull -import io.github.kakaocup.compose.utilities.orGlobal - -/** - * Node class with special api to test Lazy List (LazyColumn or LazyRow) - */ -class KLazyListNode( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - nodeMatcher: NodeMatcher, - itemTypeBuilder: KLazyListItemBuilder.() -> Unit, - val positionMatcher: (position: Int) -> SemanticsMatcher, - override val lengthSemanticsPropertyKey: SemanticsPropertyKey? = null, -) : BaseNode(semanticsProvider, nodeMatcher), - LazyListNodeAssertions { - val semanticsMatcher = nodeMatcher.matcher - val itemTypes = KLazyListItemBuilder().apply(itemTypeBuilder).itemTypes - - /** - * Constructs node class with node interaction from given ViewBuilder - * - * @param semanticsProvider Provides main entry point into testing - * @param viewBuilderAction ViewBuilder which will result in view's interaction - * @param itemTypeBuilder Lambda with receiver where you pass your item providers - * @param positionMatcher Lambda which finds node by given position - * @param lengthSemanticsPropertyKey SemanticsPropertyKey with length list size - * - * @see ViewBuilder - */ - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider? = null, - viewBuilderAction: ViewBuilder.() -> Unit, - itemTypeBuilder: KLazyListItemBuilder.() -> Unit, - positionMatcher: (position: Int) -> SemanticsMatcher, - lengthSemanticsPropertyKey: SemanticsPropertyKey? = null - ) : this( - semanticsProvider = semanticsProvider, - nodeMatcher = ViewBuilder().apply(viewBuilderAction).build(), - itemTypeBuilder = itemTypeBuilder, - positionMatcher = positionMatcher, - lengthSemanticsPropertyKey = lengthSemanticsPropertyKey - ) - - /** - * Performs given actions/assertion on child at given position - * - * @param T Type of item at given position. Must be registered via constructor. - * @param position Position of item in lazy list - * @param function Tail lambda which receiver will be matched item with given type T - */ - @ExperimentalTestApi - inline fun > childAt( - position: Int, - function: T.() -> Unit - ) { - val provideItem = itemTypes.getOrElse(T::class) { - throw LazyListItemProvisionException(T::class) - }.provideItem - - performScrollToIndex(position) - val semanticsNode = semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(semanticsMatcher) - .onChildren() - .filterToOne(positionMatcher(position)) - .fetchSemanticsNode() - - function(provideItem( - semanticsNode, - semanticsProvider.orGlobal().checkNotNull() - ) as T) - } - - /** - * Performs given actions/assertion on descendant at given position - * - * @param T Type of item at given position. Must be registered via constructor. - * @param position Position of item in lazy list - * @param function Tail lambda which receiver will be matched item with given type T - */ - @ExperimentalTestApi - inline fun > descendantAt( - position: Int, - function: T.() -> Unit - ) { - val provideItem = itemTypes.getOrElse(T::class) { - throw LazyListItemProvisionException(T::class) - }.provideItem - - performScrollToIndex(position) - - val semanticsNode = semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(positionMatcher(position) and - hasAnyAncestor(semanticsMatcher) - ) - .fetchSemanticsNode() - - function(provideItem( - semanticsNode, - semanticsProvider.orGlobal().checkNotNull() - ) as T) - } - - /** - * Performs given actions/assertion on child that matches given matcher - * - * @param T Type of item at given position. Must be registered via constructor. - * @param childMatcher Matcher for item in lazy list - * @return Item with type T. To make actions/assertions on it immediately, use perform() infix function. - */ - @ExperimentalTestApi - inline fun > childWith(noinline childMatcher: ViewBuilder.() -> Unit): T { - val provideItem = itemTypes.getOrElse(T::class) { - throw LazyListItemProvisionException(T::class) - }.provideItem - - val nodeMatcher = ViewBuilder().apply(childMatcher).build() - - performScrollToNode(nodeMatcher.matcher) - - val semanticsNode = semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(semanticsMatcher) - .onChildren() - .filter(nodeMatcher.matcher)[nodeMatcher.position] - .fetchSemanticsNode() - - return provideItem( - semanticsNode, - semanticsProvider.orGlobal().checkNotNull() - ) as T - } - - /** - * Performs given actions/assertion on first child in lazy list - * - * @param T Type of item at first position. Must be registered via constructor. - * @param function Tail lambda which receiver will be matched item with given type T - */ - @ExperimentalTestApi - inline fun > firstChild(function: T.() -> Unit) { - childAt(0, function) - } -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/LazyListItemProvidedException.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/LazyListItemProvidedException.kt deleted file mode 100644 index 991e7aca..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/lazylist/LazyListItemProvidedException.kt +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.kakaocup.compose.node.element.lazylist - -import kotlin.reflect.KClass - -class LazyListItemProvisionException( - itemNodeClazz: KClass<*> -) : Exception( - """${itemNodeClazz.java.simpleName} did not provided to KLazyListNode. - You should provide KLazyListItemNode through itemTypeBuilder function - """.trimIndent() -) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListItemNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListItemNode.kt deleted file mode 100644 index 5d68902e..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListItemNode.kt +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.kakaocup.compose.node.element.list - -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.test.SemanticsMatcher -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.utilities.checkNotNull -import io.github.kakaocup.compose.utilities.orGlobal - -/** - * Base class for all child nodes within [KListNode]. - * - * The constructor is declared as `protected` so that only inheritors have the right to call this constructor. - * - * Warning! Manually creating list items is **not necessary**. - */ -open class KListItemNode> protected constructor() : BaseNode() { - - companion object { - - /** - * Method for correctly initializing the necessary parameters of [BaseNode]. - * This method allows us to keep the main constructor of the element empty, which greatly - * simplifies the description of subclass elements. - * - * @param listNode The root node of the list within which we need to interact with the list item. - * @param semanticsNode A list of key/value pairs associated with the layout node or its subtree. - * @param useUnmergedTree If true, the unmerged semantic tree will be used to work with the node. - */ - inline fun > newInstance( - listNode: KListNode, - semanticsNode: SemanticsNode, - useUnmergedTree: Boolean, - ): T { - val instance = T::class.java.getDeclaredConstructor().newInstance() - - instance.initSemantics( - semanticsProvider = listNode.semanticsProvider.orGlobal().checkNotNull(), - nodeMatcher = NodeMatcher( - matcher = SemanticsMatcher( - description = "Semantics node id = ${semanticsNode.id}", - matcher = { it.id == semanticsNode.id }, - ), - useUnmergedTree = useUnmergedTree, - ), - parentNode = listNode, - ) - - return instance - } - - } - -} diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListNode.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListNode.kt deleted file mode 100644 index 98f5df11..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/node/element/list/KListNode.kt +++ /dev/null @@ -1,554 +0,0 @@ -package io.github.kakaocup.compose.node.element.list - -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.filter -import androidx.compose.ui.test.onChildren -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.node.action.NodeActions.ComposeBaseActionType -import io.github.kakaocup.compose.node.assertion.ListNodeAssertions -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.builder.ViewBuilder -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.utilities.checkNotNull -import io.github.kakaocup.compose.utilities.orGlobal - -/** - * A slightly modified copy of [io.github.kakaocup.compose.node.element.lazylist.KLazyListNode]. - * - * [KListNode] is intended for testing any lists. - * - * It can be used with both lazy and non-lazy containers containing any elements. - * - * - [androidx.compose.foundation.lazy.LazyColumn]. - * - [androidx.compose.foundation.lazy.LazyRow]. - * - [androidx.compose.foundation.layout.Row] + Modifier.[androidx.compose.foundation.horizontalScroll] (or without it). - * - [androidx.compose.foundation.layout.Column] + Modifier.[androidx.compose.foundation.verticalScroll] (or without it). - * - * @param semanticsProvider ComposeRule for finding and interacting with semantic tree nodes. - * @param nodeMatcher Node matcher. - * @param parentNode Parent node (if any). - * @param useUnmergedTree If true, use the unmerged semantic tree; otherwise, use the merged tree. - * @param isScrollable If true, the [KListNode] is considered scrollable and allows scrolling by default - * when searching for individual items. If false, no scrolling will occur. By default, it is assumed that the list can - * scroll itself. - * @param itemIndexSemanticsPropertyKey Semantic property key for the list item index. - * @param lengthSemanticsPropertyKey Semantic property key for the list length. - */ -class KListNode( - semanticsProvider: SemanticsNodeInteractionsProvider, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>?, - val useUnmergedTree: Boolean = KakaoCompose.Override.useUnmergedTree ?: false, - val isScrollable: Boolean = true, - val itemIndexSemanticsPropertyKey: SemanticsPropertyKey?, - override val lengthSemanticsPropertyKey: SemanticsPropertyKey, -) : BaseNode(semanticsProvider, nodeMatcher, parentNode), - ListNodeAssertions { - - companion object { - val itemIndexPropertyErrorMessage = """ - |[itemIndexSemanticsPropertyKey] parameter is not specified for KListNode - |Configure it by using [KListNode(.., itemIndexSemanticsPropertyKey = ListItemIndexPropertyKey)]""" - .trimMargin() - } - - val rootNodeMatcher = nodeMatcher.matcher - - /** - * Constructor for creating [KListNode] using a convenient [ViewBuilder]. - * - * @param semanticsProvider ComposeRule for finding and interacting with semantic tree nodes. - * @param viewBuilderAction Lambda for building the node matcher using [ViewBuilder]. - * @param parentNode Parent node (if any). - * @param useUnmergedTree If true, use the unmerged semantic tree; otherwise, use the merged tree. - * @param isScrollable If true, the [KListNode] is considered scrollable and allows scrolling by default - * when searching for individual items. If false, no scrolling will occur. By default, it is assumed that the list can - * scroll itself. - * @param itemIndexSemanticsPropertyKey Semantic property key for the list item index. - * @param lengthSemanticsPropertyKey Semantic property key for the list length. - */ - constructor( - semanticsProvider: SemanticsNodeInteractionsProvider, - viewBuilderAction: ViewBuilder.() -> Unit, - parentNode: BaseNode<*>?, - useUnmergedTree: Boolean, - isScrollable: Boolean, - itemIndexSemanticsPropertyKey: SemanticsPropertyKey?, - lengthSemanticsPropertyKey: SemanticsPropertyKey, - ) : this( - semanticsProvider = semanticsProvider, - nodeMatcher = ViewBuilder().apply(viewBuilderAction).build(), - parentNode = parentNode, - useUnmergedTree = useUnmergedTree, - isScrollable = isScrollable, - itemIndexSemanticsPropertyKey = itemIndexSemanticsPropertyKey, - lengthSemanticsPropertyKey = lengthSemanticsPropertyKey, - ) - - // region Overriding base node actions - - /** - * Performs scroll to position with [index]. - * - * We have to override this action from [io.github.kakaocup.compose.node.action.NodeActions], because not every - * scrollable container has [androidx.compose.ui.semantics.SemanticsActions.ScrollToIndex] action. - * Using [androidx.compose.ui.semantics.SemanticsActions.ScrollBy] action is a more reliable solution - * with child Matcher on item index. - * - * @throws NullPointerException if [itemIndexSemanticsPropertyKey] is `null`. - * @throws [IllegalStateException] if this node marked as not scrollable (see [isScrollable]). - * @throws [AssertionError] if node doesn't have [androidx.compose.ui.semantics.SemanticsActions.ScrollBy] action. - */ - @OptIn(ExperimentalTestApi::class) - override fun performScrollToIndex(index: Int) { - check(isScrollable) - getItemAt(index) - } - - // endregion - - // region Methods for checking the existence / non-existence of items in the list - - /** - * Checks that the item at the specified position is displayed. - * - * @param index Position of the item. - * - * @throws NullPointerException if [itemIndexSemanticsPropertyKey] is `null`. - * @throws [AssertionError] if the node cannot be found in the list. - */ - @OptIn(ExperimentalTestApi::class) - fun assertItemIsDisplayedAt(index: Int) { - val childMatcher = buildChildMatcher(index) - - if (isScrollable) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_NODE) { - performScrollToNode(childMatcher.matcher) - } - } else { - semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(rootNodeMatcher, this.useUnmergedTree) - .onChildren() - .filter(childMatcher.matcher)[childMatcher.position] - .assertIsDisplayed() - } - } - - /** - * Checks that the item at the specified position is not displayed. - * - * @param index Position of the item. - * - * @throws NullPointerException if [itemIndexSemanticsPropertyKey] is `null`. - * @throws [AssertionError] if the node can be found in the list. - */ - @OptIn(ExperimentalTestApi::class) - fun assertItemIsNotDisplayedAt(index: Int) { - val childMatcher = buildChildMatcher(index) - - if (isScrollable) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_NODE) { - try { - performScrollToNode(childMatcher.matcher) - error("Found node that matches ${childMatcher.matcher.description}") - } catch (ex: IllegalStateException) { - // If we are at this point, it means we found a node that should not exist. - throw ex - } catch (ignored: Throwable) { - // If we are at this point -> everything is fine. - } - } - } else { - semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(rootNodeMatcher, this.useUnmergedTree) - .onChildren() - .filter(childMatcher.matcher)[childMatcher.position] - .assertIsNotDisplayed() - } - } - - /** - * Checks that the item found using the Matcher exists in the list. - * - * @param viewBuilderAction Builder for creating the search matcher. - * - * @throws [AssertionError] if the node cannot be found in the list. - */ - @OptIn(ExperimentalTestApi::class) - fun assertItemWithIsDisplayed(viewBuilderAction: ViewBuilder.() -> Unit) { - val childMatcher = buildChildMatcher(viewBuilderAction) - - if (isScrollable) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_NODE) { - performScrollToNode(childMatcher.matcher) - } - } else { - val childNode = this.child(viewBuilderAction) - childNode.assertIsDisplayed() - } - } - - /** - * Checks that the item found using the Matcher does not exist in the list. - * - * @param viewBuilderAction Builder for creating the search matcher. - * - * @throws [AssertionError] if the node can be found in the list. - */ - @OptIn(ExperimentalTestApi::class) - fun assertItemWithIsNotDisplayed(viewBuilderAction: ViewBuilder.() -> Unit) { - val childMatcher = buildChildMatcher(viewBuilderAction) - - if (isScrollable) { - delegate.perform(ComposeBaseActionType.PERFORM_SCROLL_TO_NODE) { - try { - performScrollToNode(childMatcher.matcher) - error("Found node that matches ${childMatcher.matcher.description}") - } catch (ex: IllegalStateException) { - // If we are at this point, it means we found a node that should not exist. - throw ex - } catch (ignored: Throwable) { - // If we are at this point -> everything is fine. - } - } - } else { - val childNode = this.child(viewBuilderAction) - childNode.assertIsNotDisplayed() - } - } - - // endregion - - // region Methods for working with items at a position - - /** - * Performs the specified actions / checks on the list item at the specified position. - * - * This method should be used if you DO NOT NEED a specific type of list item node. - * - * @param index Index of the item in the list node. - * @param needPerformScroll If true, additional scrolling will be performed to the specified position. - * By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - * - * @throws NullPointerException if [itemIndexSemanticsPropertyKey] is `null`. - */ - fun itemAt( - index: Int, - needPerformScroll: Boolean = isScrollable, - function: KListItemNode<*>.() -> Unit, - ) { - childAt>(index, needPerformScroll, function) - } - - /** - * Performs the specified actions / checks on the list item at the specified position. - * - * This method should be used if you NEED a specific type of list item node. - * - * @param T Specific type of list item. - * @param index Index of the item in the list node. - * @param needPerformScroll If true, additional scrolling will be performed to the specified position. - * By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - * - * @throws NullPointerException if [itemIndexSemanticsPropertyKey] is `null`. - */ - inline fun > childAt( - index: Int, - needPerformScroll: Boolean = isScrollable, - function: T.() -> Unit, - ) { - val childItem = getChildAt(index, needPerformScroll = needPerformScroll) - function.invoke(childItem) - } - - /** - * Performs the specified actions / checks on the list item at the first position. - * - * This method should be used if you DO NOT NEED a specific type of list item node. - * - * @param needPerformScroll If true, additional scrolling will be performed to the first position. - * By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - */ - fun firstItem( - needPerformScroll: Boolean = isScrollable, - function: KListItemNode<*>.() -> Unit, - ) { - firstChild(needPerformScroll, function) - } - - /** - * Performs the specified actions / checks on the list item at the first position. - * - * This method should be used if you NEED a specific type of list item node. - * - * @param T Specific type of list item. - * @param needPerformScroll If true, additional scrolling will be performed to the first position. - * By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - */ - inline fun > firstChild( - needPerformScroll: Boolean = isScrollable, - function: T.() -> Unit, - ) { - childAt(0, needPerformScroll, function) - } - - // endregion - - // region Methods for working with items by Matcher - - /** - * Finds a child element of the list node using [ViewBuilder] and performs [function]. - * - * This method should be used if you DO NOT NEED a specific type of list item node. - * - * @param viewBuilderAction Builder for creating the search matcher. - * @param needPerformScroll If true, additional scrolling will be performed to the element with - * the built [SemanticsMatcher]. By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - */ - fun itemWith( - viewBuilderAction: ViewBuilder.() -> Unit, - needPerformScroll: Boolean = isScrollable, - function: KListItemNode<*>.() -> Unit, - ) { - val item = getItemWith(viewBuilderAction, needPerformScroll) - function.invoke(item) - } - - /** - * Finds a child element of the list node using [ViewBuilder] and performs [function]. - * - * This method should be used if you NEED a specific type of list item node. - * - * @param T Specific type of list item. - * @param viewBuilderAction Builder for creating the search matcher. - * @param needPerformScroll If true, additional scrolling will be performed to the element with - * the built [SemanticsMatcher]. By default, scrolling depends on the [isScrollable] flag. - * @param function Function for processing the item. - */ - inline fun > childWith( - noinline viewBuilderAction: ViewBuilder.() -> Unit, - needPerformScroll: Boolean = isScrollable, - function: T.() -> Unit, - ) { - val item = getChildWith(viewBuilderAction, needPerformScroll) - function.invoke(item) - } - - // endregion - - // region Getters for list items - - /** - * Returns a child element of the list node found using [ViewBuilder]. - * - * This method should be used if you DO NOT NEED a specific type of list item node. - * - * @param viewBuilderAction Builder for creating the search matcher. - * @param needPerformScroll If true, additional scrolling will be performed to the element with - * the built [SemanticsMatcher]. By default, scrolling depends on the [isScrollable] flag. - */ - fun getItemWith( - viewBuilderAction: ViewBuilder.() -> Unit, - needPerformScroll: Boolean = isScrollable, - ): KListItemNode<*> = - getChildWith(viewBuilderAction, needPerformScroll) - - /** - * Returns a child element of the list node found using [ViewBuilder]. - * - * This method should be used if you NEED a specific type of list item node. - * - * @param T Specific type of list item. - * @param viewBuilderAction Builder for creating the search matcher. - * @param needPerformScroll If true, additional scrolling will be performed to the element with - * the built [SemanticsMatcher]. By default, scrolling depends on the [isScrollable] flag. - */ - @OptIn(ExperimentalTestApi::class) - inline fun > getChildWith( - noinline viewBuilderAction: ViewBuilder.() -> Unit, - needPerformScroll: Boolean = isScrollable, - ): T { - val childMatcher = buildChildMatcher(viewBuilderAction) - - if (needPerformScroll) { - performScrollToNode(childMatcher.matcher) - } - - val semanticsNode = semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(rootNodeMatcher, this.useUnmergedTree) - .onChildren() - .filter(childMatcher.matcher)[childMatcher.position] - .fetchSemanticsNode() - - return createListItemNode(semanticsNode) - } - - /** - * Returns a child element of the list node at the specified position. - * Depending on the [needPerformScroll] parameter, additional scrolling may be performed to the element at - * the specified position. - * - * This method should be used if you DO NOT NEED a specific type of list item node. - * - * @param index Index of the item in the list node. - * @param needPerformScroll If true, we will try to scroll to the specified position. - * - * @throws NullPointerException if [needPerformScroll] is true and [itemIndexSemanticsPropertyKey] is `null`. - */ - fun getItemAt(index: Int, needPerformScroll: Boolean = isScrollable): KListItemNode<*> = - getChildAt(index, needPerformScroll) - - /** - * Returns a child element of the list node at the specified position. - * Depending on the [needPerformScroll] parameter, additional scrolling may be performed to the element at - * the specified position. - * - * This method should be used if you NEED a specific type of list item node. - * - * @param T Specific type of element. - * @param index Index of the item in the list node. - * @param needPerformScroll If true, we will try to scroll to the specified position. - * - * @throws NullPointerException if [needPerformScroll] is true and [itemIndexSemanticsPropertyKey] is `null`. - */ - @OptIn(ExperimentalTestApi::class) - inline fun > getChildAt(index: Int, needPerformScroll: Boolean = isScrollable): T { - val childMatcher = buildChildMatcher(index) - - if (needPerformScroll) { - performScrollToNode(childMatcher.matcher) - } - - // Warning! - // Within lazy collections, `filterToOne` cannot be used on child nodes. - // In Compose version 1.5.5, the semantic tree of lazy collections MAY CONTAIN DUPLICATES. - val semanticsNode = semanticsProvider - .orGlobal() - .checkNotNull() - .onNode(rootNodeMatcher, this.useUnmergedTree) - .onChildren() - .filter(childMatcher.matcher)[childMatcher.position] - .fetchSemanticsNode() - - return createListItemNode(semanticsNode) - } - - // endregion - - inline fun > createListItemNode(semanticsNode: SemanticsNode): T { - return KListItemNode.newInstance( - listNode = this, - semanticsNode = semanticsNode, - useUnmergedTree = useUnmergedTree, - ) - } - - fun buildChildMatcher(viewBuilderAction: ViewBuilder.() -> Unit): NodeMatcher { - return ViewBuilder() - .apply { - this.useUnmergedTree = this@KListNode.useUnmergedTree - } - .apply(viewBuilderAction) - .build() - } - - fun buildChildMatcher(index: Int): NodeMatcher { - requireNotNull(itemIndexSemanticsPropertyKey) { itemIndexPropertyErrorMessage } - - return ViewBuilder() - .apply { - this.useUnmergedTree = this@KListNode.useUnmergedTree - hasParent(this@KListNode.rootNodeMatcher) - addSemanticsMatcher( - SemanticsMatcher.expectValue(this@KListNode.itemIndexSemanticsPropertyKey, index) - ) - } - .build() - } - -} - -// region Additional factory methods - -/** - * Simplified builder for creating [KListNode]. - * - * @param useUnmergedTree If true, the unmerged semantic tree is used; otherwise, the merged tree is used. - * @param isScrollable If true, the [KListNode] is considered scrollable and allows scrolling by default - * when searching for individual items. If false, no scrolling will occur. By default, it is assumed that the list can - * scroll itself. - * @param itemIndexSemanticsPropertyKey Semantic property key for the list item index. - * @param lengthSemanticsPropertyKey Semantic property key for the list length. - * @param viewBuilderAction Lambda for building the node matcher using [ViewBuilder]. - */ -fun BaseNode<*>.KListNode( - useUnmergedTree: Boolean = KakaoCompose.Override.useUnmergedTree ?: false, - isScrollable: Boolean = true, - itemIndexSemanticsPropertyKey: SemanticsPropertyKey? = null, - lengthSemanticsPropertyKey: SemanticsPropertyKey, - viewBuilderAction: ViewBuilder.() -> Unit, -): KListNode { - val nodeMatcher = ViewBuilder() - .apply { - this.useUnmergedTree = useUnmergedTree - } - .apply(viewBuilderAction) - .build() - - return KListNode( - semanticsProvider = this.semanticsProvider.orGlobal().checkNotNull(), - nodeMatcher = nodeMatcher, - parentNode = this, - useUnmergedTree = useUnmergedTree, - isScrollable = isScrollable, - itemIndexSemanticsPropertyKey = itemIndexSemanticsPropertyKey, - lengthSemanticsPropertyKey = lengthSemanticsPropertyKey, - ) -} - -/** - * Simplified builder for creating [KListNode] with tesgTag. - * - * @param testTag Tag for searching the node. - * @param useUnmergedTree If true, the unmerged semantic tree is used; otherwise, the merged tree is used. - * @param isScrollable If true, the [KListNode] is considered scrollable and allows scrolling by default - * when searching for individual items. If false, no scrolling will occur. By default, it is assumed that the list can - * scroll itself. - * @param itemIndexSemanticsPropertyKey Semantic property key for the list item index. - * @param lengthSemanticsPropertyKey Semantic property key for the list length. - */ -fun BaseNode<*>.KListNode( - testTag: String, - useUnmergedTree: Boolean = KakaoCompose.Override.useUnmergedTree ?: false, - isScrollable: Boolean = true, - itemIndexSemanticsPropertyKey: SemanticsPropertyKey? = null, - lengthSemanticsPropertyKey: SemanticsPropertyKey, -): KListNode = KListNode( - useUnmergedTree = useUnmergedTree, - isScrollable = isScrollable, - itemIndexSemanticsPropertyKey = itemIndexSemanticsPropertyKey, - lengthSemanticsPropertyKey = lengthSemanticsPropertyKey, -) { - hasTestTag(testTag) - this.useUnmergedTree = useUnmergedTree -} - -// endregion diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/rule/KakaoComposeTestRule.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/rule/KakaoComposeTestRule.kt deleted file mode 100644 index 31bb241d..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/rule/KakaoComposeTestRule.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.kakaocup.compose.rule - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.KakaoCompose -import org.junit.rules.TestRule -import org.junit.runner.Description -import org.junit.runners.model.Statement - -class KakaoComposeTestRule( - val semanticsProvider: SemanticsNodeInteractionsProvider? = null, - val useUnmergedTree: Boolean? = null -) : TestRule { - override fun apply(base: Statement, description: Description): Statement = - object : Statement() { - override fun evaluate() { - val preEvaluatedSemanticsProvided = KakaoCompose.Global.semanticsProvider - semanticsProvider?.let { KakaoCompose.Global.semanticsProvider = it } - val preUseUnmergedTree = KakaoCompose.Override.useUnmergedTree - useUnmergedTree?.let { KakaoCompose.Override.useUnmergedTree = it } - - base.evaluate() - - KakaoCompose.Global.semanticsProvider = preEvaluatedSemanticsProvided - KakaoCompose.Override.useUnmergedTree = preUseUnmergedTree - } - } -} - diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/ContextUtils.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/ContextUtils.kt deleted file mode 100644 index 0be1a3d8..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/ContextUtils.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.github.kakaocup.compose.utilities - -import androidx.annotation.StringRes -import androidx.test.platform.app.InstrumentationRegistry - -fun getResourceString(@StringRes resId: Int) = InstrumentationRegistry.getInstrumentation().targetContext.resources.getString(resId) diff --git a/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/Extensions.kt b/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/Extensions.kt deleted file mode 100644 index 938c947b..00000000 --- a/compose/src/main/kotlin/io/github/kakaocup/compose/utilities/Extensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.kakaocup.compose.utilities - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.exception.KakaoComposeException -import io.github.kakaocup.compose.node.builder.NodeMatcher - -fun SemanticsNodeInteractionsProvider?.orGlobal(): SemanticsNodeInteractionsProvider? = - this ?: KakaoCompose.Global.semanticsProvider - -fun SemanticsNodeInteractionsProvider?.checkNotNull(): SemanticsNodeInteractionsProvider = - this ?: throw KakaoComposeException("SemanticsProvider is null: Provide via constructor or use KakaoComposeTestRule") - -fun NodeMatcher?.checkNotNull(): NodeMatcher = - this ?: throw KakaoComposeException("NodeMatcher is null: Provide via constructor or use 'initSemantics' method") \ No newline at end of file diff --git a/documentation/.gitignore b/documentation/.gitignore deleted file mode 100644 index b2d6de30..00000000 --- a/documentation/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Dependencies -/node_modules - -# Production -/build - -# Generated files -.docusaurus -.cache-loader - -# Misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/documentation/README.md b/documentation/README.md deleted file mode 100644 index b93d52d0..00000000 --- a/documentation/README.md +++ /dev/null @@ -1 +0,0 @@ -# Kakao Compose Documentation Web Site diff --git a/documentation/babel.config.js b/documentation/babel.config.js deleted file mode 100644 index e00595da..00000000 --- a/documentation/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/documentation/blog/2024-09-01-compose-release-1-0-0.md b/documentation/blog/2024-09-01-compose-release-1-0-0.md deleted file mode 100644 index 1057b137..00000000 --- a/documentation/blog/2024-09-01-compose-release-1-0-0.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -slug: first-blog-post -title: Kakao Compose 1.0.0 -tags: [news, release] ---- - diff --git a/documentation/blog/tags.yml b/documentation/blog/tags.yml deleted file mode 100644 index 75e4d717..00000000 --- a/documentation/blog/tags.yml +++ /dev/null @@ -1,4 +0,0 @@ -compose: - label: Kakao Compose - permalink: /kakao-compose - description: Kakao Compose diff --git a/documentation/docs/advance/_category_.json b/documentation/docs/advance/_category_.json deleted file mode 100644 index 501df628..00000000 --- a/documentation/docs/advance/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Advance", - "position": 5, - "link": { - "type": "generated-index", - "description": "Become a Pro with UI testing" - } -} diff --git a/documentation/docs/advance/reusable_components.md b/documentation/docs/advance/reusable_components.md deleted file mode 100644 index 8772dfc9..00000000 --- a/documentation/docs/advance/reusable_components.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Reusable components diff --git a/documentation/docs/basics/_category_.json b/documentation/docs/basics/_category_.json deleted file mode 100644 index 255d1925..00000000 --- a/documentation/docs/basics/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Basic", - "position": 3, - "link": { - "type": "generated-index", - "description": "How to cook your UI tests better" - } -} diff --git a/documentation/docs/basics/kakao_compose_structure.md b/documentation/docs/basics/kakao_compose_structure.md deleted file mode 100644 index 86db39fd..00000000 --- a/documentation/docs/basics/kakao_compose_structure.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Structure - -### **Overview** - -Starting with version `1.0.0`, Kakao Compose is organized into four primary modules, with the following dependency structure: - -```mermaid -flowchart TD -%% Nodes - KTest("compose-test") - KCompose("compose") - KUI("compose-ui") - KSemantics("compose-semantics") - AEspresso("Espresso") - ACompose("Android Compose") - -%% Connections - KTest --> KCompose - KUI --> KSemantics - KTest --> KSemantics - KSemantics --> ACompose - KCompose --> ACompose - KCompose --> AEspresso - -%% Style - style AEspresso color:#FFFFFF, fill:#AA00FF, stroke:#AA00FF - style ACompose color:#FFFFFF, fill:#AA00FF, stroke:#AA00FF -``` - -### **Core** -#### `compose` -The foundational module that provides a DSL wrapper for Espresso methods, `ComposeScreen` page objects, and support for `KNode` and lists. Version 1+ maintains broad compatibility with version 0+, requiring minimal effort to upgrade. - -Add it with: `implementation("io.github.kakaocup:compose:1.0.0")` - -### **Optional** - -UI testing differs significantly between XML and Compose approaches. A key aspect of Compose is its reliance on Nodes, which lack type specificity. This creates challenges in UI test creation, such as the inability to perform type-based checks on views. View states can only be accessed via `Semantic` providers. In earlier versions of Kakao Compose, developers often tried to embed custom semantics in the core library, which undermined its purpose as a simple Espresso wrapper. To resolve this, we shifted to an extension-based library model. - -#### `compose-semantics` -A collection of default semantic keys utilized by the `compose-ui` and `compose-test` modules. This lightweight module includes only the semantics necessary for `compose-test` to determine view states. It should be added explicitly only if you’re using a design system and wish to avoid depending directly on `compose-ui`. - -Add it with: `implementation("io.github.kakaocup:compose-semantics:1.0.0")` - -:::tip For projects with a design system - -You can integrate all necessary parameters into your design system by referencing the mappings in [compose-ui](https://github.com/KakaoCup/Compose/tree/master/compose-ui/src/main/kotlin/io/github/kakaocup/compose/foundation), avoiding a transitive dependency on Compose through Kakao. - -::: - -#### `compose-ui` -A wrapper around Compose’s foundational components, mirroring their constructor signatures. These wrappers apply all applicable semantics from the `compose-semantics` module, enabling the `compose-test` module to leverage them. This module simplifies adding type-specific checks to your app. - -:::warning Transitive Compose dependency - -Including this module introduces an indirect dependency on your project’s Compose version. This could lead to outdated components, though we aim to release updates aligned with new Compose versions. - -::: - -To bypass transitive dependencies via Kakao Compose, you can copy the `compose-ui` source code into your project and depend solely on `compose-semantics`. - -Add it with: `implementation("io.github.kakaocup:compose-ui:1.0.0")` - -#### `compose-test` -Offers nodes for validating typed components, such as `KButtonNode`, `KIconNode`, `KProgressBar`, and more. - -Add it with: `testImplementation("io.github.kakaocup:compose-test:1.0.0")` - -Usage examples are available in the [Sample project](https://github.com/KakaoCup/Compose/tree/master/sample/src/androidTest/java/io/github/kakaocup/compose/test/node). diff --git a/documentation/docs/basics/kakao_test_rule.md b/documentation/docs/basics/kakao_test_rule.md deleted file mode 100644 index 50290068..00000000 --- a/documentation/docs/basics/kakao_test_rule.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Kakao Compose Test Rule - -### **How to reduce boilerplate** - -When we writing UI test for compose we need to inject `composeTestRule` in to each `onComposeScreen` call. - -```kotlin - @Test - fun simpleTest() { - onComposeScreen(composeTestRule) { - myButton { - assertIsDisplayed() - assertTextContains("Button 1") - } - } - } -``` - -That's creating a lot of boilerplate in the code. But you can avoid it with `KakaoComposeTestRule` [Example](https://github.com/KakaoCup/Compose/blob/master/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt) - -```kotlin -class SimpleTestGlobalSemantic { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule - ) - - @Test - fun simpleTest() { - onComposeScreen { - myText1 { - assertIsDisplayed() - assertTextContains("Simple text 1") - } - } - } -} -``` - -This rule will create a wrapper around `composeTestRule` and provide it into `ComposeScreen` or `KNode` implicitly, what will reduce boilerplate in the tests. - ---- - -### **Global override `useUnmergedTree`** - -Compose framework always will try to optimise view tree and squash views if it acceptable. For example two `Text` view will be squashed into one, what can create misleading in tests. -By default in Espresso `useUnmergedTree` set as `false`, but on practice for UI test we want to have it as `true` in many cases. With `KakaoComposeTestRule` we can override it globally. - -```kotlin - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) -``` diff --git a/documentation/docs/basics/screens.md b/documentation/docs/basics/screens.md deleted file mode 100644 index 49f3c1f5..00000000 --- a/documentation/docs/basics/screens.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Page Object Pattern - -The **Page Object pattern** is a design pattern used in UI testing to improve test maintenance, readability, and reusability. It abstracts the UI structure and interactions into reusable components, making tests more modular and less brittle. - ---- - -### **Key Concepts of the Page Object Pattern** -1. **Page Object**: - - Represents a single page or component of a application. - - Encapsulates all the elements (e.g., buttons, input fields) and actions (e.g., clicking, typing) related to that page. - - Acts as an interface between the test scripts and the UI. - -2. **Separation of Concerns**: - - Test logic (e.g., assertions, test flow) is separated from the UI interaction logic. - - Tests focus on "what to test," while Page Objects handle "how to interact with the UI." - -3. **Reusability**: - - Page Objects can be reused across multiple tests, reducing code duplication. - - Changes to the UI only require updates in the Page Object, not in every test. - -4. **Readability**: - - Tests become more readable and expressive, as they use high-level methods provided by Page Objects. - ---- - -### **How It Works** -1. **Create a Page Object for Each Screen/Component**: - - Define a class for each page or reusable component in the application. - - Include locators (e.g., test tags, ancestors and etc.) for the elements on the page. - -:::warning Don't use content locators - -Try to avoid using locators based on view content like - -```kotlin -val button: KNode = child { hasText("Button 1") } -``` - -That's can create an issue with wrong matching. For example you have fields with First and Last name of user, if you finding it by content. When your codebase will be updated (changing view content) than test will still pass -::: - - [Example](https://github.com/KakaoCup/Compose/blob/master/sample/src/androidTest/java/io/github/kakaocup/compose/screen/MainActivityScreen.kt): -```kotlin -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") }) - { - val myText1: KNode = child { - hasTestTag("mySimpleText") - } - - val clickCounter: KNode = child { - hasTestTag("clickCounter") - } -} -``` - -2. **Use Page Objects in Tests**: - - Tests interact with the application through the methods provided by the Page Objects. - - Tests are concise and focus on the test scenario. - - Example: -```kotlin -class SimpleTest { - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun simpleTest() { - onComposeScreen(composeTestRule) { - myText1 { - assertIsDisplayed() - assertTextContains("Simple text 1") - } - } - } -} -``` - -3. **Handle Complex Flows with Page Objects**: - - For multi-step workflows, chain methods from different Page Objects (Screens or KNodes). - - Example: Logging in, navigating to a dashboard, and performing an action. - ---- - -### **Benefits of the Page Object Pattern** -1. **Maintainability**: - - Changes to the UI (e.g., updated element locators) only need to be made in the Page Object, not in every test. -2. **Reusability**: - - Page Objects can be reused across multiple tests and test suites. -3. **Readability**: - - Tests are easier to read and understand, as they use descriptive methods. -4. **Reduced Duplication**: - - Common interactions are centralized in Page Objects, avoiding repetitive code. -5. **Improved Collaboration**: - - Testers and developers can work independently, with testers focusing on test logic and developers maintaining Page Objects. - ---- - -### **Best Practices** -1. **Single Responsibility**: - - Each Page Object should represent a single page or component. -2. **Avoid Assertions in Page Objects**: - - Keep assertions in the test scripts, not in the Page Objects. -3. **Handle Dynamic Elements**: - - Use techniques like waiting for elements to load before interacting with them. -4. **Layered Architecture**: - - For complex applications, consider breaking Page Objects into smaller components (e.g., headers, footers). - ---- - -### **Example in Action** -#### Screen Object: -```kotlin -class LoginScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("LoginScreen") } - ) { - - val loginField: KNode = child { - hasTestTag("loginField") - } - - val passwordField: KNode = child { - hasTestTag("passwordField") - } - - val loginButton: KNode = child { - hasTestTag("loginButton") - } -} -``` - -#### Test Script: -```kotlin -class LoginTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun simpleTest() { - onComposeScreen(composeTestRule) { - loginField { - performTextInput("test@test.test") - assertIsDisplayed() - } - - passwordField { - performTextInput("dummypass") - } - - loginButton { - performTouchInput { - click() - } - } - } - - onComposeScreen(composeTestRule) { - assertIsDisplayed() - } - } -} -``` - ---- - -By using the Page Object pattern, UI tests become more robust, maintainable, and scalable, especially in large and complex applications. \ No newline at end of file diff --git a/documentation/docs/intermediate/_category_.json b/documentation/docs/intermediate/_category_.json deleted file mode 100644 index d1688835..00000000 --- a/documentation/docs/intermediate/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Intermediate", - "position": 4, - "link": { - "type": "generated-index", - "description": "How to start UI testing" - } -} diff --git a/documentation/docs/intermediate/async_code.md b/documentation/docs/intermediate/async_code.md deleted file mode 100644 index 57be7120..00000000 --- a/documentation/docs/intermediate/async_code.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Async Code and Idling Resource - -When using Kotlin Coroutines (or any other async frameworks) in your Android app, you can still leverage `IdlingResource` to synchronize your UI tests with asynchronous tasks. However, with coroutines, you can use `IdlingResource` in combination with `Dispatchers` to control when your app is considered "idle." - -Here’s how you can use `IdlingResource` with coroutines in Android UI tests: - ---- - -### 1. **Add Dependencies** -Ensure you have the necessary dependencies for coroutines and Espresso in your `build.gradle` file: - -```koltin -dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") - - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation("androidx.test:runner:1.5.2") - androidTestImplementation("androidx.test:rules:1.5.2") -} -``` - ---- - -### 2. **Create a CoroutineIdlingResource** -Implement an `IdlingResource` that monitors coroutine execution. You can use a `CoroutineDispatcher` to track whether coroutines are active. - -```kotlin -import androidx.test.espresso.IdlingResource -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.asCoroutineDispatcher -import java.util.concurrent.Executors -import java.util.concurrent.atomic.AtomicInteger - -class CoroutineIdlingResource : IdlingResource { - - private val counter = AtomicInteger(0) - private var resourceCallback: IdlingResource.ResourceCallback? = null - - override fun getName(): String { - return CoroutineIdlingResource::class.java.name - } - - override fun isIdleNow(): Boolean { - return counter.get() == 0 - } - - override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) { - this.resourceCallback = callback - } - - fun increment() { - counter.getAndIncrement() - } - - fun decrement() { - val counterVal = counter.decrementAndGet() - if (counterVal == 0) { - resourceCallback?.onTransitionToIdle() - } - } -} -``` - ---- - -### 3. **Wrap CoroutineDispatcher with IdlingResource** -Create a custom `CoroutineDispatcher` that updates the `CoroutineIdlingResource` when coroutines start and finish. - -```kotlin -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.asCoroutineDispatcher -import java.util.concurrent.Executors - -class IdlingDispatcher(private val idlingResource: CoroutineIdlingResource) : CoroutineDispatcher() { - - private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher() - - override fun dispatch(context: kotlin.coroutines.CoroutineContext, block: Runnable) { - idlingResource.increment() - dispatcher.dispatch(context, Runnable { - try { - block.run() - } finally { - idlingResource.decrement() - } - }) - } -} -``` - ---- - -### 4. **Use the IdlingDispatcher in Your App** -Replace your default `Dispatchers` (e.g., `Dispatchers.IO` or `Dispatchers.Main`) with the `IdlingDispatcher` in your app code during tests. - -```kotlin -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -class MyViewModel : ViewModel() { - - private val idlingResource = CoroutineIdlingResource() - private val idlingDispatcher = IdlingDispatcher(idlingResource) - - fun fetchData() { - CoroutineScope(idlingDispatcher).launch { - // Simulate a network request or long-running task - kotlinx.coroutines.delay(2000) - // Update UI or state - } - } - - fun getIdlingResource(): CoroutineIdlingResource { - return idlingResource - } -} -``` - ---- - -### 5. **Register IdlingResource in Your Test** -In your UI test, register the `CoroutineIdlingResource` before running the test and unregister it afterward. - -```kotlin -import androidx.test.espresso.Espresso -import androidx.test.ext.junit.rules.ActivityScenarioRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class MyUITest { - - @get:Rule - val activityRule = ActivityScenarioRule(MainActivity::class.java) - - private lateinit var idlingResource: CoroutineIdlingResource - - @Before - fun registerIdlingResource() { - activityRule.scenario.onActivity { activity -> - val viewModel = (activity as MainActivity).viewModel - idlingResource = viewModel.getIdlingResource() - Espresso.registerIdlingResources(idlingResource) - } - } - - @Test - fun testFetchData() { - // Perform UI actions that trigger coroutines - onView(withId(R.id.fetchDataButton)).perform(click()) - - // Espresso will wait until the coroutine finishes - onView(withId(R.id.resultTextView)).check(matches(withText("Data Loaded"))) - } - - @After - fun unregisterIdlingResource() { - Espresso.unregisterIdlingResources(idlingResource) - } -} -``` - ---- - -### 6. **Alternative: Use `IdlingRegistry` for Global Coroutine Tracking** -If you want to track all coroutines globally, you can use `IdlingRegistry` to wrap the `Dispatchers.Main` or `Dispatchers.IO`. This approach is more advanced but ensures all coroutines are tracked. - -```kotlin -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.asCoroutineDispatcher -import java.util.concurrent.Executors - -object IdlingDispatcher { - private val idlingResource = CoroutineIdlingResource() - - fun register() { - Dispatchers.Main = IdlingDispatcherWrapper(Dispatchers.Main, idlingResource) - Espresso.registerIdlingResources(idlingResource) - } - - fun unregister() { - Espresso.unregisterIdlingResources(idlingResource) - } -} -``` - ---- - -### Summary -By using `IdlingResource` with coroutines, you can ensure your UI tests wait for asynchronous tasks to complete. The key steps are: -1. Create a custom `IdlingResource` to track coroutine execution. -2. Wrap your `CoroutineDispatcher` to update the `IdlingResource`. -3. Register and unregister the `IdlingResource` in your tests. - -This approach ensures your tests are reliable and synchronized with coroutine-based asynchronous operations. - ---- - -### **Using `waitUntil` from Kakao** - -As an alternative option you can use `waitUntil` function from Kakao Compose library -[Example](https://github.com/KakaoCup/Compose/blob/master/sample/src/androidTest/java/io/github/kakaocup/compose/test/WaitForTest.kt): - -```kotlin -mySimpleText { - assertIsNotDisplayed() - waitUntil { - assertIsDisplayed() - } - assertIsDisplayed() -} -``` - -But we strongly recommending you to setup proper IdleResource for your UI tests \ No newline at end of file diff --git a/documentation/docs/introduction.md b/documentation/docs/introduction.md deleted file mode 100644 index d282e06a..00000000 --- a/documentation/docs/introduction.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Introduction - -Welcome to **Kakao Compose** tutorial. Let's make UI testing easies and simple. In this documentation we will try to explain functionality of Kakao Compose and -fundamental concepts of implementation, modules and responsibility of each, how to add this library to your project and -how to start works on UI test step by step. - -But before we started, don't forget that `KakaoCup` is fully Open Source and supported by community. -Please don't hesitate to contribute to this documentation or fix any bugs. -We always welcome to new contributors with any level of codding skills. - -### Overview - -From version `1.0.0` Kakao Compose contains four main modules, with following dependencies - -```mermaid -flowchart TD -%% Nodes - KTest("compose-test") - KCompose("compose") - KUI("compose-ui") - KSemantics("compose-semantics") - AEspresso("Espresso") - ACompose("Android Compose") - -%% Connections - KTest --> KCompose - KUI --> KSemantics - KTest --> KSemantics - KSemantics --> ACompose - KCompose --> ACompose - KCompose --> AEspresso - -%% Style - style AEspresso color:#FFFFFF, fill:#AA00FF, stroke:#AA00FF - style ACompose color:#FFFFFF, fill:#AA00FF, stroke:#AA00FF - -``` -* Core - * `compose` - Core module, which providing DSL wrapping for Espresso methods, `ComposeScreen` page objects and `KNode` - -* Optional - * `compose-semantics` - Set of default semantics keys, what can be used by `compose-ui` and `compose-test` modules - * `compose-ui` - Wrapped over Compose base components, with the same constructors signatures. - Those wrappers will set all possible semantics from `compose-semantics` module, which can be used by `compose-test` module - * `compose-test` - Providing nodes for typed component validation diff --git a/documentation/docs/setup.md b/documentation/docs/setup.md deleted file mode 100644 index 7cd60c13..00000000 --- a/documentation/docs/setup.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Setup - -### Setup project dependencies -Add those dependencies into your `build.gradle` or `build.gradle.kts` file - -:::tip Version - -`` can be found on project [GitHub](https://github.com/KakaoCup/compose) - -::: - -```kotlin -dependencies { - androidTestImplementation("io.github.kakaocup:compose:") -} -``` diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts deleted file mode 100644 index 77f13f73..00000000 --- a/documentation/docusaurus.config.ts +++ /dev/null @@ -1,130 +0,0 @@ -import {themes as prismThemes} from 'prism-react-renderer'; -import type {Config} from '@docusaurus/types'; -import type * as Preset from '@docusaurus/preset-classic'; - -const config: Config = { - title: 'Kakao', - tagline: 'Nice and simple DSL for Espresso Compose in Kotlin', - favicon: 'img/favicon.ico', - - // Set the production url of your site here - url: 'https://your-docusaurus-site.example.com', - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' - baseUrl: '/Compose/', - - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: 'kakaocup', // Usually your GitHub org/user name. - projectName: 'compose', // Usually your repo name. - - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - - // Even if you don't use internationalization, you can use this field to set - // useful metadata like html lang. For example, if your site is Chinese, you - // may want to replace "en" with "zh-Hans". - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - markdown: { - mermaid: true, - }, - - themes: ['@docusaurus/theme-mermaid'], - - presets: [ - [ - 'classic', - { - docs: { - sidebarPath: './sidebars.ts', - }, - blog: { - showReadingTime: true, - feedOptions: { - type: ['rss', 'atom'], - xslt: true, - }, - }, - theme: { - customCss: './src/css/custom.css', - }, - } satisfies Preset.Options, - ], - ], - - themeConfig: { - // Replace with your project's social card - image: 'img/docusaurus-social-card.jpg', - navbar: { - title: 'Kakao Compose', - logo: { - alt: 'My Site Logo', - src: 'img/logo.png', - }, - items: [ - { - type: 'docSidebar', - sidebarId: 'tutorialSidebar', - position: 'left', - label: 'Tutorial', - }, - {to: '/blog', label: 'Blog', position: 'left'}, - { - href: 'https://github.com/kakaocup/compose', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Tutorial', - to: '/docs/introduction', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Telegram [Russian]', - href: 'https://t.me/kaspresso', - }, - { - label: 'Telegram [English]', - href: 'https://t.me/kaspresso_en', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'Blog', - to: '/blog', - }, - { - label: 'GitHub', - href: 'https://github.com/kakaocup/compose', - }, - ], - }, - ], - }, - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - }, - } satisfies Preset.ThemeConfig, -}; - -export default config; diff --git a/documentation/package-lock.json b/documentation/package-lock.json deleted file mode 100644 index a15a93ff..00000000 --- a/documentation/package-lock.json +++ /dev/null @@ -1,15919 +0,0 @@ -{ - "name": "documentation", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "documentation", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/preset-classic": "3.5.2", - "@docusaurus/theme-mermaid": "3.5.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.5.1", - "@docusaurus/tsconfig": "3.5.1", - "@docusaurus/types": "3.5.1", - "typescript": "~5.5.2" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.8.1.tgz", - "integrity": "sha512-MLX/gipPFEhJPCExsxXf9tnt+kLfWCe9JWRp1adcoVySkhzPxpIeSiWaQaOqyy0TYIgIpdeVx/emlBT9Ni8GFw==", - "peer": true, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.8.1.tgz", - "integrity": "sha512-zy3P4fI28GfzKihUw5+L76pEedQxyLDiMsdDYEWghIz8yAnELDatPNEThyWuUk8fD0PeVoCi1M4tr1iz00fOtQ==", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.8.1", - "@algolia/requester-browser-xhr": "5.8.1", - "@algolia/requester-fetch": "5.8.1", - "@algolia/requester-node-http": "5.8.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "dependencies": { - "@algolia/logger-common": "4.24.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.8.1.tgz", - "integrity": "sha512-x0iULVrx5PocaYBqH+G6jyEsEHf7m5FDiZW7CP8AaJdzdCzoUyx7YH6e6TSCNlkFEjwmn8uj05coN8uljCHXTg==", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.8.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.8.1.tgz", - "integrity": "sha512-SRWGrNsKSLNYIDNlVKVkf4wxsm6h57xI+0b8JPm0wUe0ly0jymAgQU2yW2GDzNuXyiPiS7U1oWwaVGs71IT5Pw==", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.8.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.8.1.tgz", - "integrity": "sha512-pYylr2gBsV68E88bltaVoJHIc3YNIllVmA12d+jefAcutR9ytQM7iP6dXbCYuRqF4CHF32YvZuwvqNI3J4kowA==", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.8.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", - "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/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "dependencies": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", - "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", - "dependencies": { - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", - "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", - "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", - "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/traverse": "^7.25.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", - "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "regexpu-core": "^6.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", - "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", - "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", - "dependencies": { - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", - "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-wrap-function": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", - "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", - "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", - "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "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", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", - "dependencies": { - "@babel/types": "^7.25.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", - "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", - "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", - "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", - "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", - "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", - "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", - "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", - "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", - "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", - "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", - "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", - "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", - "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", - "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/traverse": "^7.25.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", - "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/template": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", - "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", - "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", - "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", - "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", - "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", - "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", - "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", - "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", - "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", - "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", - "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", - "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", - "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", - "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", - "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", - "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", - "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", - "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", - "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", - "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-transform-parameters": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", - "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", - "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", - "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", - "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", - "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", - "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", - "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.7.tgz", - "integrity": "sha512-/qXt69Em8HgsjCLu7G3zdIQn7A2QwmYND7Wa0LTp09Na+Zn8L5d0A7wSXrKi18TJRc/Q5S1i1De/SU1LzVkSvA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", - "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", - "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-jsx": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", - "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", - "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", - "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", - "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", - "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", - "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", - "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", - "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", - "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-typescript": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", - "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", - "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", - "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", - "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", - "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", - "dependencies": { - "@babel/compat-data": "^7.25.8", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.7", - "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.8", - "@babel/plugin-transform-async-to-generator": "^7.25.7", - "@babel/plugin-transform-block-scoped-functions": "^7.25.7", - "@babel/plugin-transform-block-scoping": "^7.25.7", - "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.8", - "@babel/plugin-transform-classes": "^7.25.7", - "@babel/plugin-transform-computed-properties": "^7.25.7", - "@babel/plugin-transform-destructuring": "^7.25.7", - "@babel/plugin-transform-dotall-regex": "^7.25.7", - "@babel/plugin-transform-duplicate-keys": "^7.25.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.8", - "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.8", - "@babel/plugin-transform-for-of": "^7.25.7", - "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.8", - "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", - "@babel/plugin-transform-member-expression-literals": "^7.25.7", - "@babel/plugin-transform-modules-amd": "^7.25.7", - "@babel/plugin-transform-modules-commonjs": "^7.25.7", - "@babel/plugin-transform-modules-systemjs": "^7.25.7", - "@babel/plugin-transform-modules-umd": "^7.25.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", - "@babel/plugin-transform-numeric-separator": "^7.25.8", - "@babel/plugin-transform-object-rest-spread": "^7.25.8", - "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.8", - "@babel/plugin-transform-optional-chaining": "^7.25.8", - "@babel/plugin-transform-parameters": "^7.25.7", - "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.8", - "@babel/plugin-transform-property-literals": "^7.25.7", - "@babel/plugin-transform-regenerator": "^7.25.7", - "@babel/plugin-transform-reserved-words": "^7.25.7", - "@babel/plugin-transform-shorthand-properties": "^7.25.7", - "@babel/plugin-transform-spread": "^7.25.7", - "@babel/plugin-transform-sticky-regex": "^7.25.7", - "@babel/plugin-transform-template-literals": "^7.25.7", - "@babel/plugin-transform-typeof-symbol": "^7.25.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.7", - "@babel/plugin-transform-unicode-property-regex": "^7.25.7", - "@babel/plugin-transform-unicode-regex": "^7.25.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", - "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-transform-react-display-name": "^7.25.7", - "@babel/plugin-transform-react-jsx": "^7.25.7", - "@babel/plugin-transform-react-jsx-development": "^7.25.7", - "@babel/plugin-transform-react-pure-annotations": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", - "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-syntax-jsx": "^7.25.7", - "@babel/plugin-transform-modules-commonjs": "^7.25.7", - "@babel/plugin-transform-typescript": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.7.tgz", - "integrity": "sha512-gMmIEhg35sXk9Te5qbGp3W9YKrvLt3HV658/d3odWrHSqT0JeG5OzsJWFHRLiOohRyjRsJc/x03DhJm3i8VJxg==", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.2.tgz", - "integrity": "sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==" - }, - "node_modules/@docsearch/react": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.2.tgz", - "integrity": "sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==", - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.2", - "algoliasearch": "^4.19.1" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", - "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", - "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", - "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", - "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", - "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", - "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^1.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.1.tgz", - "integrity": "sha512-SKKdA5RnvZr3pvFXkxtfsBVNgflRGa/bN1HbNi+1s0HNVYPuhB9DFC/CrKe2OoOfUXx7F7k2gg0Jg9gJYDy4rA==", - "dev": true, - "dependencies": { - "@docusaurus/types": "3.5.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", - "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", - "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", - "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", - "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", - "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", - "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", - "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", - "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", - "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", - "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/plugin-debug": "3.5.2", - "@docusaurus/plugin-google-analytics": "3.5.2", - "@docusaurus/plugin-google-gtag": "3.5.2", - "@docusaurus/plugin-google-tag-manager": "3.5.2", - "@docusaurus/plugin-sitemap": "3.5.2", - "@docusaurus/theme-classic": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-search-algolia": "3.5.2", - "@docusaurus/types": "3.5.2" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", - "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.44", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.26", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", - "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", - "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", - "dependencies": { - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", - "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-mermaid": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.5.2.tgz", - "integrity": "sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg==", - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "mermaid": "^10.4.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-mermaid/node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", - "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-mermaid/node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", - "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", - "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", - "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.5.1.tgz", - "integrity": "sha512-6OO63/xQ11Tu4reCRuB4zfjqdZYmQwkOTVI8zxxEHCLma4pplsx4HTCB2lVgztEL+Qr6hcHY952ZrpmoAt5rUA==", - "dev": true - }, - "node_modules/@docusaurus/types": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.1.tgz", - "integrity": "sha512-IXTGQBoXAGFliGF5Cn3F+gSGskgzAL8+4y6dDY1gcePA0r8WngHj8oovS1YPv+b9JOff32nv8YGGZITHOMXJsA==", - "devOptional": true, - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", - "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@svgr/webpack": "^8.1.0", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", - "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", - "dependencies": { - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", - "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", - "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "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.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "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==", - "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==", - "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==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", - "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" - }, - "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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "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==" - }, - "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==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prismjs": { - "version": "1.26.4", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", - "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" - }, - "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "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==" - }, - "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "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==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "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==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", - "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "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", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "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==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "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==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "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" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", - "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" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "engines": { - "node": ">=10" - } - }, - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/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==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", - "dependencies": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "engines": { - "node": ">=0.3.1" - } - }, - "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==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.35", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz", - "integrity": "sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==" - }, - "node_modules/elkjs": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", - "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.2.tgz", - "integrity": "sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.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==" - }, - "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==", - "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-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/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==" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "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==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "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==", - "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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "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==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "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==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.44", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", - "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "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-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "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", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/katex": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", - "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "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==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "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==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.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/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/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==", - "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/mdast-util-gfm-autolink-literal/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", - "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "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==", - "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/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.2.tgz", - "integrity": "sha512-UkZyMSuIYcI1Q0H+2pv/5CiY84sOwQ2XlKoDZMl9Y/MtrLEtxQtyA6LWGkMxnZxj0dJqI+7nw51bYjNnrbdFsQ==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.1", - "@types/d3-scale": "^4.0.3", - "@types/d3-scale-chromatic": "^3.0.0", - "cytoscape": "^3.28.1", - "cytoscape-cose-bilkent": "^4.1.0", - "d3": "^7.4.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "^3.0.5 <3.1.7", - "elkjs": "^0.9.0", - "katex": "^0.16.9", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "mdast-util-from-markdown": "^1.3.0", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.3", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/mermaid/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/mermaid/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/mermaid/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mermaid/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mermaid/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/mermaid/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/mermaid/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/mermaid/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mermaid/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mermaid/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/mermaid/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mermaid/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/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==", - "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-core-commonmark/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/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==", - "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-extension-directive/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/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==", - "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-extension-frontmatter/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/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==", - "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-extension-gfm-autolink-literal/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/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==", - "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-extension-gfm-footnote/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/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==", - "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-extension-gfm-table/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/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==", - "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-extension-gfm-task-list-item/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/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==", - "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-extension-mdx-expression/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", - "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/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==", - "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-extension-mdx-jsx/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/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==", - "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-extension-mdxjs-esm/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "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-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/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==", - "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-factory-destination/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/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==", - "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-factory-label/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", - "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/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==", - "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-factory-mdx-expression/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-space/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/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==", - "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-factory-title/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/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==", - "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-factory-whitespace/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "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-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/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==", - "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-classify-character/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/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==", - "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-decode-string/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-normalize-identifier/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "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==", - "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-sanitize-uri/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==", - "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-sanitize-uri/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "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-types": "^2.0.0" - } - }, - "node_modules/micromark/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==", - "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/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==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", - "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "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/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz", - "integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "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==", - "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/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/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==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/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==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/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==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-json-view-lite": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", - "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" - }, - "node_modules/regjsparser": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", - "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", - "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "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-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "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==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" - }, - "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "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==", - "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/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/search-insights": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", - "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", - "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/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==" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "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==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "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==", - "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==", - "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==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "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" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/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==" - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uvu/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.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==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" - }, - "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/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==" - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "engines": { - "node": ">=12.20" - }, - "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==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/documentation/package.json b/documentation/package.json deleted file mode 100644 index b1cbcadd..00000000 --- a/documentation/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "documentation", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc" - }, - "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/preset-classic": "3.5.2", - "@docusaurus/theme-mermaid": "3.5.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.5.1", - "@docusaurus/tsconfig": "3.5.1", - "@docusaurus/types": "3.5.1", - "typescript": "~5.5.2" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 3 chrome version", - "last 3 firefox version", - "last 5 safari version" - ] - }, - "engines": { - "node": ">=18.0" - } -} diff --git a/documentation/sidebars.ts b/documentation/sidebars.ts deleted file mode 100644 index acc7685a..00000000 --- a/documentation/sidebars.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; - -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ -const sidebars: SidebarsConfig = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], - */ -}; - -export default sidebars; diff --git a/documentation/src/components/HomepageFeatures/index.tsx b/documentation/src/components/HomepageFeatures/index.tsx deleted file mode 100644 index a3547be8..00000000 --- a/documentation/src/components/HomepageFeatures/index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import clsx from 'clsx'; -import Heading from '@theme/Heading'; -import styles from './styles.module.css'; - -type FeatureItem = { - title: string; - description: JSX.Element; -}; - -const FeatureList: FeatureItem[] = [ - { - title: 'Based on Espresso', - description: ( - <> - Framework for writing Android Native UI test. Provided and maintained by Google. - - ), - }, - { - title: 'Nice and simple DSL', - description: ( - <> - Kakao Compose wrapping Espresso to provide nice and simple DSL to improve readability - and reusability with Page Object pattern - - ), - }, - { - title: 'Many custom Assertions', - description: ( - <> - Kakao can automatically setup all required semantics and provide type-based view for - easiest assertions. - - ), - }, -]; - -function Feature({title, description}: FeatureItem) { - return ( -
-
- {title} -

{description}

-
-
- ); -} - -export default function HomepageFeatures(): JSX.Element { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/documentation/src/components/HomepageFeatures/styles.module.css b/documentation/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e..00000000 --- a/documentation/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/documentation/src/css/custom.css b/documentation/src/css/custom.css deleted file mode 100644 index 81586fd6..00000000 --- a/documentation/src/css/custom.css +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #d59464; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: #fde4d7; - --ifm-color-primary-dark: #21af90; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} diff --git a/documentation/src/pages/index.module.css b/documentation/src/pages/index.module.css deleted file mode 100644 index 9f71a5da..00000000 --- a/documentation/src/pages/index.module.css +++ /dev/null @@ -1,23 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} diff --git a/documentation/src/pages/index.tsx b/documentation/src/pages/index.tsx deleted file mode 100644 index 3143cd33..00000000 --- a/documentation/src/pages/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import clsx from 'clsx'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; -import Heading from '@theme/Heading'; - -import styles from './index.module.css'; - -function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); - return ( -
-
- - {siteConfig.title} - -

{siteConfig.tagline}

-
- - Quick start tutorial - -
-
-
- ); -} - -export default function Home(): JSX.Element { - const {siteConfig} = useDocusaurusContext(); - return ( - - -
- -
-
- ); -} diff --git a/documentation/src/pages/markdown-page.md b/documentation/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b6..00000000 --- a/documentation/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/documentation/static/.nojekyll b/documentation/static/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/documentation/static/img/docusaurus-social-card.jpg b/documentation/static/img/docusaurus-social-card.jpg deleted file mode 100644 index ffcb448210e1a456cb3588ae8b396a597501f187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55746 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 fgzs%Vr*-jYG(YMS<ttdtee# diff --git a/documentation/static/img/docusaurus.png b/documentation/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 zcma)=cTf{R(}xj7f`AaDml%oxrAm_`5IRVc-jPtHML-0kDIiip57LWD@4bW~(nB|) z34|^sbOZqj<;8ct`Tl-)=Jw`pZtiw=e$UR_Mn2b8rM$y@hlq%XQe90+?|Mf68-Ux_ zzTBiDn~3P%oVt>{f$z+YC7A)8ak`PktoIXDkpXod+*gQW4fxTWh!EyR9`L|fi4YlH z{IyM;2-~t3s~J-KF~r-Z)FWquQCfG*TQy6w*9#k2zUWV-+tCNvjrtl9(o}V>-)N!) ziZgEgV>EG+b(j@ex!dx5@@nGZim*UfFe<+e;(xL|j-Pxg(PCsTL~f^br)4{n5?OU@ z*pjt{4tG{qBcDSa3;yKlopENd6Yth=+h9)*lkjQ0NwgOOP+5Xf?SEh$x6@l@ZoHoYGc5~d2>pO43s3R|*yZw9yX^kEyUV2Zw1%J4o`X!BX>CwJ zI8rh1-NLH^x1LnaPGki_t#4PEz$ad+hO^$MZ2 ziwt&AR}7_yq-9Pfn}k3`k~dKCbOsHjvWjnLsP1{)rzE8ERxayy?~{Qz zHneZ2gWT3P|H)fmp>vA78a{0&2kk3H1j|n59y{z@$?jmk9yptqCO%* zD2!3GHNEgPX=&Ibw?oU1>RSxw3;hhbOV77-BiL%qQb1(4J|k=Y{dani#g>=Mr?Uyd z)1v~ZXO_LT-*RcG%;i|Wy)MvnBrshlQoPxoO*82pKnFSGNKWrb?$S$4x+24tUdpb= zr$c3K25wQNUku5VG@A=`$K7%?N*K+NUJ(%%)m0Vhwis*iokN#atyu(BbK?+J+=H z!kaHkFGk+qz`uVgAc600d#i}WSs|mtlkuwPvFp) z1{Z%nt|NwDEKj1(dhQ}GRvIj4W?ipD76jZI!PGjd&~AXwLK*98QMwN&+dQN1ML(6< z@+{1`=aIc z9Buqm97vy3RML|NsM@A>Nw2=sY_3Ckk|s;tdn>rf-@Ke1m!%F(9(3>V%L?w#O&>yn z(*VIm;%bgezYB;xRq4?rY})aTRm>+RL&*%2-B%m; zLtxLTBS=G!bC$q;FQ|K3{nrj1fUp`43Qs&V!b%rTVfxlDGsIt3}n4p;1%Llj5ePpI^R} zl$Jhx@E}aetLO!;q+JH@hmelqg-f}8U=XnQ+~$9RHGUDOoR*fR{io*)KtYig%OR|08ygwX%UqtW81b@z0*`csGluzh_lBP=ls#1bwW4^BTl)hd|IIfa zhg|*M%$yt@AP{JD8y!7kCtTmu{`YWw7T1}Xlr;YJTU1mOdaAMD172T8Mw#UaJa1>V zQ6CD0wy9NEwUsor-+y)yc|Vv|H^WENyoa^fWWX zwJz@xTHtfdhF5>*T70(VFGX#8DU<^Z4Gez7vn&4E<1=rdNb_pj@0?Qz?}k;I6qz@| zYdWfcA4tmI@bL5JcXuoOWp?ROVe*&o-T!><4Ie9@ypDc!^X&41u(dFc$K$;Tv$c*o zT1#8mGWI8xj|Hq+)#h5JToW#jXJ73cpG-UE^tsRf4gKw>&%Z9A>q8eFGC zG@Iv(?40^HFuC_-%@u`HLx@*ReU5KC9NZ)bkS|ZWVy|_{BOnlK)(Gc+eYiFpMX>!# zG08xle)tntYZ9b!J8|4H&jaV3oO(-iFqB=d}hGKk0 z%j)johTZhTBE|B-xdinS&8MD=XE2ktMUX8z#eaqyU?jL~PXEKv!^) zeJ~h#R{@O93#A4KC`8@k8N$T3H8EV^E2 z+FWxb6opZnX-av5ojt@`l3TvSZtYLQqjps{v;ig5fDo^}{VP=L0|uiRB@4ww$Eh!CC;75L%7|4}xN+E)3K&^qwJizphcnn=#f<&Np$`Ny%S)1*YJ`#@b_n4q zi%3iZw8(I)Dzp0yY}&?<-`CzYM5Rp+@AZg?cn00DGhf=4|dBF8BO~2`M_My>pGtJwNt4OuQm+dkEVP4 z_f*)ZaG6@t4-!}fViGNd%E|2%ylnzr#x@C!CrZSitkHQ}?_;BKAIk|uW4Zv?_npjk z*f)ztC$Cj6O<_{K=dPwO)Z{I=o9z*lp?~wmeTTP^DMP*=<-CS z2FjPA5KC!wh2A)UzD-^v95}^^tT<4DG17#wa^C^Q`@f@=jLL_c3y8@>vXDJd6~KP( zurtqU1^(rnc=f5s($#IxlkpnU=ATr0jW`)TBlF5$sEwHLR_5VPTGiO?rSW9*ND`bYN*OX&?=>!@61{Z4)@E;VI9 zvz%NmR*tl>p-`xSPx$}4YcdRc{_9k)>4Jh&*TSISYu+Y!so!0JaFENVY3l1n*Fe3_ zRyPJ(CaQ-cNP^!3u-X6j&W5|vC1KU!-*8qCcT_rQN^&yqJ{C(T*`(!A=))=n%*-zp_ewRvYQoJBS7b~ zQlpFPqZXKCXUY3RT{%UFB`I-nJcW0M>1^*+v)AxD13~5#kfSkpWys^#*hu)tcd|VW zEbVTi`dbaM&U485c)8QG#2I#E#h)4Dz8zy8CLaq^W#kXdo0LH=ALhK{m_8N@Bj=Um zTmQOO*ID(;Xm}0kk`5nCInvbW9rs0pEw>zlO`ZzIGkB7e1Afs9<0Z(uS2g*BUMhp> z?XdMh^k}k<72>}p`Gxal3y7-QX&L{&Gf6-TKsE35Pv%1 z;bJcxPO+A9rPGsUs=rX(9^vydg2q`rU~otOJ37zb{Z{|)bAS!v3PQ5?l$+LkpGNJq zzXDLcS$vMy|9sIidXq$NE6A-^v@)Gs_x_3wYxF%y*_e{B6FvN-enGst&nq0z8Hl0< z*p6ZXC*su`M{y|Fv(Vih_F|83=)A6ay-v_&ph1Fqqcro{oeu99Y0*FVvRFmbFa@gs zJ*g%Gik{Sb+_zNNf?Qy7PTf@S*dTGt#O%a9WN1KVNj`q$1Qoiwd|y&_v?}bR#>fdP zSlMy2#KzRq4%?ywXh1w;U&=gKH%L~*m-l%D4Cl?*riF2~r*}ic9_{JYMAwcczTE`!Z z^KfriRf|_YcQ4b8NKi?9N7<4;PvvQQ}*4YxemKK3U-7i}ap8{T7=7`e>PN7BG-Ej;Uti2$o=4T#VPb zm1kISgGzj*b?Q^MSiLxj26ypcLY#RmTPp+1>9zDth7O?w9)onA%xqpXoKA-`Jh8cZ zGE(7763S3qHTKNOtXAUA$H;uhGv75UuBkyyD;eZxzIn6;Ye7JpRQ{-6>)ioiXj4Mr zUzfB1KxvI{ZsNj&UA`+|)~n}96q%_xKV~rs?k=#*r*7%Xs^Hm*0~x>VhuOJh<2tcb zKbO9e-w3zbekha5!N@JhQm7;_X+J!|P?WhssrMv5fnQh$v*986uWGGtS}^szWaJ*W z6fLVt?OpPMD+-_(3x8Ra^sX~PT1t5S6bfk@Jb~f-V)jHRul#Hqu;0(+ER7Z(Z4MTR z+iG>bu+BW2SNh|RAGR2-mN5D1sTcb-rLTha*@1@>P~u;|#2N{^AC1hxMQ|(sp3gTa zDO-E8Yn@S7u=a?iZ!&&Qf2KKKk7IT`HjO`U*j1~Df9Uxz$~@otSCK;)lbLSmBuIj% zPl&YEoRwsk$8~Az>>djrdtp`PX z`Pu#IITS7lw07vx>YE<4pQ!&Z^7L?{Uox`CJnGjYLh1XN^tt#zY*0}tA*a=V)rf=&-kLgD|;t1D|ORVY}8 F{0H{b<4^zq diff --git a/documentation/static/img/espresso.png b/documentation/static/img/espresso.png deleted file mode 100644 index 6ae09ba2ced8a6b50861ecfa7deb5e75af80e38b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9621 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 yis=7cQ~4;(uISVSwd3`uf@JWo-2cABqA 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/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + which kotlin >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." @@ -109,7 +109,7 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java +# For Cygwin, switch paths to Windows format before running kotlin if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` @@ -161,7 +161,7 @@ save () { } APP_ARGS=$(save "$@") -# Collect all arguments for the java command, following the shell quoting and substitution rules +# Collect all arguments for the kotlin command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index ef7fbefe..69475597 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } android { - namespace = "io.github.kakaocup.compose.sample" + namespace = "io.github.kakaocup.appium.sample" defaultConfig.apply { versionCode = 1 @@ -24,9 +24,10 @@ android { } dependencies { - androidTestImplementation(project(":compose")) - implementation(project(":compose-ui")) - androidTestImplementation(project(":compose-test")) + testImplementation(project(":appium")) + + testImplementation(libs.java.client) + testImplementation(libs.selenium.java) implementation(libs.androidx.appcompat) implementation(libs.com.google.android.material) @@ -40,7 +41,6 @@ dependencies { debugImplementation(libs.androidx.compose.ui.uiTestManifest) implementation(libs.junit.junit) - implementation(libs.androidx.test.espresso.espressoCore) implementation(libs.androidx.compose.ui.uiTestJunit4) implementation(libs.androidx.test.ext.junit) diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/SampleNoActivityTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/SampleNoActivityTest.kt deleted file mode 100644 index 6f8574ed..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/SampleNoActivityTest.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.kakaocup.compose - -import androidx.compose.ui.test.junit4.createComposeRule -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import org.junit.Rule - -abstract class SampleNoActivityTest { - - init { - KakaoCompose.Override.useUnmergedTree = true - } - - @get:Rule - val composeTestRule = createComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule(composeTestRule) - -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/extensions/ComposeTestRuleExtensions.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/extensions/ComposeTestRuleExtensions.kt deleted file mode 100644 index 10812084..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/extensions/ComposeTestRuleExtensions.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.kakaocup.compose.extensions - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import androidx.compose.ui.test.junit4.ComposeTestRule -import io.github.kakaocup.compose.screen.MainActivityScreen - -class Screens(provider: SemanticsNodeInteractionsProvider) { - val main = MainActivityScreen(provider) -} - -val ComposeTestRule.screens: Screens - get() = Screens(this) diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/node/KAppListNode.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/node/KAppListNode.kt deleted file mode 100644 index bfed9d83..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/node/KAppListNode.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.github.kakaocup.compose.node - -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.node.element.list.KListNode -import io.github.kakaocup.compose.sample.semantics.ListItemIndexSemanticKey -import io.github.kakaocup.compose.sample.semantics.ListLengthSemanticKey - -fun BaseNode<*>.KAppListNode( - testTag: String, - isScrollable: Boolean = true, -) = KListNode( - useUnmergedTree = true, - itemIndexSemanticsPropertyKey = ListItemIndexSemanticKey, - lengthSemanticsPropertyKey = ListLengthSemanticKey, - isScrollable = isScrollable, -) { - hasTestTag(testTag) -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/BackgroundActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/BackgroundActivityScreen.kt deleted file mode 100644 index c8fdc9f0..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/BackgroundActivityScreen.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.sample.BackgroundSemanticsScreenTestTags - -class BackgroundActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(BackgroundSemanticsScreenTestTags.BackgroundScreen) } - ) { - - val backgroundColorAndShapeBox: KNode = child { - hasTestTag(BackgroundSemanticsScreenTestTags.BackgroundColorAndShapeBox) - } - - val backgroundBrushAndShapeBox: KNode = child { - hasTestTag(BackgroundSemanticsScreenTestTags.BackgroundBrushAndShapeBox) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ButtonActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ButtonActivityScreen.kt deleted file mode 100644 index 149623d8..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ButtonActivityScreen.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.foundation.KButtonNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.sample.ButtonActivity - -class ButtonActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(ButtonActivity.ButtonScreenTestTags.ButtonScreen) } - ) { - val button: KButtonNode = child { - hasTestTag(ButtonActivity.ButtonScreenTestTags.Button) - } - - val outlinedButton: KButtonNode = child { - hasTestTag(ButtonActivity.ButtonScreenTestTags.OutlinedButton) - } - - val textButton: KButtonNode = child { - hasTestTag(ButtonActivity.ButtonScreenTestTags.TextButton) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/CustomSemanticsPropertyKeyActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/CustomSemanticsPropertyKeyActivityScreen.kt deleted file mode 100644 index 6b29aac2..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/CustomSemanticsPropertyKeyActivityScreen.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.sample.CustomSemanticsScreenTestTags - -class CustomSemanticsPropertyKeyActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(CustomSemanticsScreenTestTags.Screen) } -) { - val view: KNode = child { - hasTestTag(CustomSemanticsScreenTestTags.view) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DelayDisplayActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DelayDisplayActivityScreen.kt deleted file mode 100644 index d49358ee..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DelayDisplayActivityScreen.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.sample.DelayDisplayActivityTestTags - -class DelayDisplayActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(DelayDisplayActivityTestTags.Screen) } -) { - - val mySimpleText: KNode = child { - hasTestTag(DelayDisplayActivityTestTags.mySimpleText) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DialogActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DialogActivityScreen.kt deleted file mode 100644 index 9d904746..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/DialogActivityScreen.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.sample.DialogActivity - -private typealias Tags = DialogActivity.TestTags - -class DialogActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(Tags.Screen) } - ) { - val showAlertDialogButton: KNode = child { - hasTestTag(Tags.ShowAlertDialogButton) - } - val alertDialog: KNode = KNode { - hasTestTag(Tags.AlertDialog) - hasAnyAncestor(androidx.compose.ui.test.isDialog()) - } - - val dismissAlertDialogButton: KNode = KNode { - hasTestTag(Tags.AlertDialogDismissButton) - hasAnyAncestor(androidx.compose.ui.test.isDialog()) - } - - val status: KNode = child { - hasTestTag(Tags.StatusText) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/GlobalSemanticScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/GlobalSemanticScreen.kt deleted file mode 100644 index 429e2206..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/GlobalSemanticScreen.kt +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode - -class GlobalSemanticScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") }, - ) { - - val myText1: KNode = child { - hasTestTag("mySimpleText") - hasPosition(0) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/IconActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/IconActivityScreen.kt deleted file mode 100644 index a71416f7..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/IconActivityScreen.kt +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.foundation.KIconNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.sample.BackgroundSemanticsScreenTestTags -import io.github.kakaocup.compose.sample.IconActivity - -class IconActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(IconActivity.IconScreenTestTags.IconScreen) } - ) { - - val iconDrawableRes: KIconNode = child { - hasTestTag(IconActivity.IconScreenTestTags.iconDrawableRes) - } - - val iconImageVector: KIconNode = child { - hasTestTag(IconActivity.IconScreenTestTags.iconImageVector) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/LazyListScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/LazyListScreen.kt deleted file mode 100644 index 6eb092f3..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/LazyListScreen.kt +++ /dev/null @@ -1,48 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.semantics.SemanticsNode -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.node.element.lazylist.KLazyListItemNode -import io.github.kakaocup.compose.node.element.lazylist.KLazyListNode -import io.github.kakaocup.compose.sample.LazyListItemPositionSemantics -import io.github.kakaocup.compose.sample.LazyListLengthSemantics - -class LazyListScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("LazyListScreen") } -) { - val list = KLazyListNode( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("LazyList") }, - itemTypeBuilder = { - itemType(::LazyListItemNode) - itemType(::LazyListHeaderNode) - }, - positionMatcher = { position -> - SemanticsMatcher.expectValue( - LazyListItemPositionSemantics, - position - ) - }, - lengthSemanticsPropertyKey = LazyListLengthSemantics - ) - - val pullToRefresh = KNode(semanticsProvider) { hasTestTag("PullToRefresh") } -} - -class LazyListItemNode( - semanticsNode: SemanticsNode, - semanticsProvider: SemanticsNodeInteractionsProvider, -) : KLazyListItemNode(semanticsNode, semanticsProvider) - -class LazyListHeaderNode( - semanticsNode: SemanticsNode, - semanticsProvider: SemanticsNodeInteractionsProvider, -) : KLazyListItemNode(semanticsNode, semanticsProvider) { - val title: KNode = child { - hasTestTag("LazyListHeaderTitle") - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/MainActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/MainActivityScreen.kt deleted file mode 100644 index 42fc7cc0..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/MainActivityScreen.kt +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.foundation.KIconNode -import io.github.kakaocup.compose.foundation.KTextNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode - -class MainActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("MainScreen") } -) { - - val myText1: KNode = child { - hasTestTag("mySimpleText") - hasPosition(0) - } - - val myText2: KNode = child { - hasTestTag("mySimpleText") - hasPosition(1) - } - - val myButton: KNode = child { - hasTestTag("myTestButton") - hasText("Button 1") - hasText(io.github.kakaocup.compose.sample.R.string.button_1) - } - - val clickCounter: KNode = child { - hasTestTag("clickCounter") - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ProgressIndicatorActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ProgressIndicatorActivityScreen.kt deleted file mode 100644 index 6a9401c9..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/ProgressIndicatorActivityScreen.kt +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.foundation.KProgressIndicatorNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity - -class ProgressIndicatorActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(ProgressIndicatorActivity.TextScreenTestTags.ProgressIndicatorScreen) } - ) { - val circularWithProgress: KProgressIndicatorNode = child { - hasTestTag(ProgressIndicatorActivity.TextScreenTestTags.CircularWithProgress) - } - - val circularWithoutProgress: KProgressIndicatorNode = child { - hasTestTag(ProgressIndicatorActivity.TextScreenTestTags.CircularWithoutProgress) - } - - val linearWithProgress: KProgressIndicatorNode = child { - hasTestTag(ProgressIndicatorActivity.TextScreenTestTags.LinearWithProgress) - } - val linearWithoutProgress: KProgressIndicatorNode = child { - hasTestTag(ProgressIndicatorActivity.TextScreenTestTags.LinearWithoutProgress) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/TextActivityScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/TextActivityScreen.kt deleted file mode 100644 index 4a2a763d..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/TextActivityScreen.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.kakaocup.compose.screen - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.foundation.KTextNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.sample.IconActivity -import io.github.kakaocup.compose.sample.TextActivity - -class TextActivityScreen(semanticsProvider: SemanticsNodeInteractionsProvider? = null) : - ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag(IconActivity.IconScreenTestTags.IconScreen) } - ) { - - val textWithAllFields: KTextNode = child { - hasTestTag(TextActivity.TextScreenTestTags.textWithAllFields) - } - - val textWithSemantic: KTextNode = child { - hasTestTag(TextActivity.TextScreenTestTags.textWithSemantic) - } - - val textWithoutStyle: KTextNode = child { - hasTestTag(TextActivity.TextScreenTestTags.textWithoutStyle) - } - - val textWithStyle: KTextNode = child { - hasTestTag(TextActivity.TextScreenTestTags.textWithStyle) - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/NotScrollableListComposeScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/NotScrollableListComposeScreen.kt deleted file mode 100644 index 9449ee27..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/NotScrollableListComposeScreen.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.kakaocup.compose.screen.list - -import io.github.kakaocup.compose.node.KAppListNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.node.element.list.KListItemNode - -class NotScrollableListComposeScreen : ComposeScreen() { - - val notScrollableListNode = KAppListNode( - testTag = "tabbar_container", - isScrollable = false, - ) - - class TabBarListItemNode : KListItemNode() { - - val text: KNode by lazy { - child { - hasTestTag("tabbar_item_text") - } - } - - val icon: KNode by lazy { - child { - hasTestTag("tabbar_item_icon") - } - } - - } - -} \ No newline at end of file diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableLazyListComposeScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableLazyListComposeScreen.kt deleted file mode 100644 index c0abfb05..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableLazyListComposeScreen.kt +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.kakaocup.compose.screen.list - -import io.github.kakaocup.compose.node.KAppListNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.node.element.list.KListItemNode - -class ScrollableLazyListComposeScreen : ComposeScreen() { - - val lazyList = KAppListNode("LazyList") - - val pullToRefresh = KNode() { hasTestTag("PullToRefresh") } - - class ListHeaderNode : KListItemNode() { - - val title: KNode by lazy { - child { - hasTestTag("LazyListHeaderTitle") - } - } - } - -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableListComposeScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableListComposeScreen.kt deleted file mode 100644 index e3b62067..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/list/ScrollableListComposeScreen.kt +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.kakaocup.compose.screen.list - -import io.github.kakaocup.compose.node.KAppListNode -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode -import io.github.kakaocup.compose.node.element.list.KListItemNode - -class ScrollableListComposeScreen : ComposeScreen() { - - val scrollableList = KAppListNode("ScrollableColumn") - - val pullToRefresh = KNode() { hasTestTag("PullToRefresh") } - - class ListHeaderNode : KListItemNode() { - - val title: KNode by lazy { - child { - hasTestTag("ListHeaderTitle") - } - } - } - -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/FirstNavigationScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/FirstNavigationScreen.kt deleted file mode 100644 index ccf52c78..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/FirstNavigationScreen.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.github.kakaocup.compose.screen.navigation - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen -import io.github.kakaocup.compose.node.element.KNode - -class FirstNavigationScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("FirstNavigationScreen") } -) { - val sharedWidget: SharedWidgetNode = child { - hasTestTag("SharedWidget") - } - - val navigationButton: KNode = child { - hasTestTag("NavigateSecondScreenButton") - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SecondNavigationScreen.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SecondNavigationScreen.kt deleted file mode 100644 index ee6e1f9f..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SecondNavigationScreen.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.github.kakaocup.compose.screen.navigation - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.element.ComposeScreen - -class SecondNavigationScreen(semanticsProvider: SemanticsNodeInteractionsProvider) : ComposeScreen( - semanticsProvider = semanticsProvider, - viewBuilderAction = { hasTestTag("SecondNavigationScreen") } -) { - val sharedWidget: SharedWidgetNode = child { - hasTestTag("SharedWidget") - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SharedWidgetNode.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SharedWidgetNode.kt deleted file mode 100644 index b402ae63..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/screen/navigation/SharedWidgetNode.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.kakaocup.compose.screen.navigation - -import androidx.compose.ui.test.SemanticsNodeInteractionsProvider -import io.github.kakaocup.compose.node.builder.NodeMatcher -import io.github.kakaocup.compose.node.core.BaseNode -import io.github.kakaocup.compose.node.element.KNode - -class SharedWidgetNode( - semanticsProvider: SemanticsNodeInteractionsProvider, - nodeMatcher: NodeMatcher, - parentNode: BaseNode<*>? = null -) : BaseNode(semanticsProvider, nodeMatcher, parentNode) { - val title: KNode = child { - hasTestTag("SharedWidgetTitle") - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/CustomSemanticsPropertyKeyTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/CustomSemanticsPropertyKeyTest.kt deleted file mode 100644 index 552e19fa..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/CustomSemanticsPropertyKeyTest.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.CustomSemanticKey -import io.github.kakaocup.compose.sample.CustomSemanticPropertyKeyActivity -import io.github.kakaocup.compose.screen.CustomSemanticsPropertyKeyActivityScreen -import org.junit.Rule -import org.junit.Test - -class CustomSemanticsPropertyKeyTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testCustomSemanticsPropertyKey() { - onComposeScreen { - view { - assertHasProperty("Any value", CustomSemanticKey, "custom semantic property key") - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/DialogTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/DialogTest.kt deleted file mode 100644 index 717e3aaf..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/DialogTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.DialogActivity -import io.github.kakaocup.compose.screen.DialogActivityScreen -import org.junit.Rule -import org.junit.Test - -class DialogTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun openAndDismissAlertDialogTest() { - onComposeScreen { - status.assertTextEquals("No Status") - alertDialog.assertIsNotDisplayed() - - showAlertDialogButton.performClick() - status.assertTextEquals("Dialog Opened") - alertDialog.assertIsDisplayed() - - dismissAlertDialogButton.performClick() - status.assertTextEquals("Dialog Dismissed") - alertDialog.assertIsNotDisplayed() - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/GestureTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/GestureTest.kt deleted file mode 100644 index 9718b653..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/GestureTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.click -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.sample.MainActivity -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.screen.MainActivityScreen -import org.junit.Rule -import org.junit.Test - -class GestureTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun gestureTest() { - onComposeScreen(composeTestRule) { - clickCounter { - assertTextEquals("0") - performGesture { - click() - } - assertTextEquals("1") - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/InterceptorTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/InterceptorTest.kt deleted file mode 100644 index bf71ca39..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/InterceptorTest.kt +++ /dev/null @@ -1,232 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.sample.MainActivity -import io.github.kakaocup.compose.extensions.screens -import org.junit.Assert -import org.junit.Rule -import org.junit.Test - -class InterceptorTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun testKakaoComposeInterceptors() { - val list = mutableListOf() - - KakaoCompose { - intercept { - onComposeInteraction { - onAll { list.add("ALL") } - onCheck { _, _ -> list.add("CHECK") } - onPerform { _, _ -> list.add("PERFORM") } - } - } - } - - composeTestRule.screens.main { - myButton { - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals(mutableListOf("ALL", "CHECK", "ALL", "PERFORM"), list) - } - - @Test - fun testViewInterceptors() { - val list = mutableListOf() - - composeTestRule.screens.main { - myButton { - intercept { - onAll { list.add("ALL") } - onCheck { _, _ -> list.add("CHECK") } - onPerform { _, _ -> list.add("PERFORM") } - } - - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals(mutableListOf("ALL", "CHECK", "ALL", "PERFORM"), list) - } - - @Test - fun testNestedInterceptors() { - val list = mutableListOf() - - KakaoCompose { - intercept { - onComposeInteraction { - onAll { list.add("ALL_KAKAO") } - onCheck { _, _ -> list.add("CHECK_KAKAO") } - onPerform { _, _ -> list.add("PERFORM_KAKAO") } - } - } - } - - composeTestRule.screens.main { - myButton { - intercept { - onAll { list.add("ALL_VIEW") } - onCheck { _, _ -> list.add("CHECK_VIEW") } - onPerform { _, _ -> list.add("PERFORM_VIEW") } - } - - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals( - mutableListOf( - "ALL_VIEW", "CHECK_VIEW", "ALL_KAKAO", "CHECK_KAKAO", "ALL_VIEW", - "PERFORM_VIEW", "ALL_KAKAO", "PERFORM_KAKAO" - ), list - ) - } - - @Test - fun testFullNestedInterceptors() { - val list = mutableListOf() - - KakaoCompose { - intercept { - onComposeInteraction { - onAll { list.add("ALL_KAKAO") } - onCheck { _, _ -> list.add("CHECK_KAKAO") } - onPerform { _, _ -> list.add("PERFORM_KAKAO") } - } - } - } - - composeTestRule.screens.main { - intercept { - onAll { list.add("ALL_SCREEN") } - onCheck { _, _ -> list.add("CHECK_SCREEN") } - onPerform { _, _ -> list.add("PERFORM_SCREEN") } - } - - myButton { - intercept { - onAll { list.add("ALL_VIEW") } - onCheck { _, _ -> list.add("CHECK_VIEW") } - onPerform { _, _ -> list.add("PERFORM_VIEW") } - } - - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals( - mutableListOf( - "ALL_VIEW", "CHECK_VIEW", "ALL_SCREEN", "CHECK_SCREEN", "ALL_KAKAO", "CHECK_KAKAO", - "ALL_VIEW", "PERFORM_VIEW", "ALL_SCREEN", "PERFORM_SCREEN", "ALL_KAKAO", "PERFORM_KAKAO" - ), list - ) - } - - @Test - fun testFullNestedWithResetsInterceptors() { - val list = mutableListOf() - - KakaoCompose { - intercept { - onComposeInteraction { - onAll { list.add("ALL_KAKAO") } - onCheck { _, _ -> list.add("CHECK_KAKAO") } - onPerform { _, _ -> list.add("PERFORM_KAKAO") } - } - } - } - - composeTestRule.screens.main { - intercept { - onAll { list.add("ALL_SCREEN") } - onCheck { _, _ -> list.add("CHECK_SCREEN") } - onPerform { _, _ -> list.add("PERFORM_SCREEN") } - } - - myButton { - intercept { - onAll { list.add("ALL_VIEW") } - onCheck { _, _ -> list.add("CHECK_VIEW") } - onPerform { _, _ -> list.add("PERFORM_VIEW") } - } - - assertIsDisplayed() - performClick() - } - - reset() - - myButton { - intercept { - onAll { list.add("ALL_VIEW") } - onCheck { _, _ -> list.add("CHECK_VIEW") } - onPerform { _, _ -> list.add("PERFORM_VIEW") } - } - - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals( - mutableListOf( - "ALL_VIEW", "CHECK_VIEW", "ALL_SCREEN", "CHECK_SCREEN", "ALL_KAKAO", "CHECK_KAKAO", - "ALL_VIEW", "PERFORM_VIEW", "ALL_SCREEN", "PERFORM_SCREEN", "ALL_KAKAO", "PERFORM_KAKAO", - "ALL_VIEW", "CHECK_VIEW", "ALL_KAKAO", "CHECK_KAKAO", - "ALL_VIEW", "PERFORM_VIEW", "ALL_KAKAO", "PERFORM_KAKAO" - ), list - ) - } - - @Test - fun testOverridingInterceptors() { - val list = mutableListOf() - - KakaoCompose { - intercept { - onComposeInteraction { - onAll { list.add("ALL_KAKAO") } - onCheck { _, _ -> list.add("CHECK_KAKAO") } - onPerform { _, _ -> list.add("PERFORM_KAKAO") } - } - } - } - - composeTestRule.screens.main { - myButton { - intercept { - onAll { list.add("ALL_VIEW") } - - onCheck(true) { interaction, assertion -> - list.add("CHECK_VIEW") - interaction.check(assertion) - } - - onPerform(true) { interaction, action -> - list.add("PERFORM_VIEW") - interaction.perform(action) - } - } - - assertIsDisplayed() - performClick() - } - } - - Assert.assertEquals( - mutableListOf("ALL_VIEW", "CHECK_VIEW", "ALL_VIEW", "PERFORM_VIEW"), - list - ) - } -} \ No newline at end of file diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/LazyListTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/LazyListTest.kt deleted file mode 100644 index d008b762..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/LazyListTest.kt +++ /dev/null @@ -1,69 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.material.MaterialTheme -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.swipeDown -import io.github.kakaocup.compose.sample.LazyListScreen -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.screen.LazyListHeaderNode -import io.github.kakaocup.compose.screen.LazyListItemNode -import io.github.kakaocup.compose.screen.LazyListScreen -import org.junit.Rule -import org.junit.Test - -class LazyListTest { - - @get:Rule - val composeTestRule = createComposeRule() - - @Test - @OptIn(ExperimentalTestApi::class) - fun lazyListTest() { - composeTestRule.setContent { - MaterialTheme { - LazyListScreen() - } - } - - onComposeScreen(composeTestRule) { - list.assertLengthEquals(0) - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - list { - assertLengthEquals(34) - firstChild { - title.assertTextEquals("Items from 1 to 10") - } - childWith { - hasText("Item 1") - } perform { - assertTextEquals("Item 1") - } - childAt(10) { - assertTextEquals("Item 10") - } - childWith { - hasAnyChild(androidx.compose.ui.test.hasText("Items from 21 to 30")) - } perform { - title.assertTextEquals("Items from 21 to 30") - } - childAt(23) { - assertTextEquals("Item 21") - } - childAt(32) { - assertTextEquals("Item 30") - } - descendantAt(33) { - assertTextEquals("Nested Item 1") - } - } - list.performScrollToIndex(0) - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - list.assertLengthEquals(35) - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleNavigationTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleNavigationTest.kt deleted file mode 100644 index e45dc618..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleNavigationTest.kt +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.material.MaterialTheme -import androidx.compose.ui.test.junit4.createComposeRule -import io.github.kakaocup.compose.sample.SimpleNavigationScreen -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.screen.navigation.FirstNavigationScreen -import io.github.kakaocup.compose.screen.navigation.SecondNavigationScreen -import org.junit.Rule -import org.junit.Test - -class SimpleNavigationTest { - @get:Rule - val composeTestRule = createComposeRule() - - @Test - fun simpleNavigationTest() { - composeTestRule.setContent { - MaterialTheme { - SimpleNavigationScreen() - } - } - - onComposeScreen(composeTestRule) { - sharedWidget.title { - assertIsDisplayed() - assertTextEquals("First screen") - } - navigationButton.performClick() - } - - onComposeScreen(composeTestRule) { - sharedWidget.title { - assertIsDisplayed() - assertTextEquals("Second screen") - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTest.kt deleted file mode 100644 index d325324a..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTest.kt +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.sample.MainActivity -import io.github.kakaocup.compose.sample.R -import io.github.kakaocup.compose.screen.MainActivityScreen -import org.junit.Rule -import org.junit.Test - -class SimpleTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun simpleTest() { - onComposeScreen(composeTestRule) { - myButton { - assertIsDisplayed() - assertTextContains("Button 1") - assertTextContains(R.string.button_1) - } - - myText1 { - assertIsDisplayed() - assertTextContains("Simple text 1") - } - - myText2 { - assertIsDisplayed() - assertTextContains("Simple text 2") - } - - onNode { - hasTestTag("doesNotExist") - }.invoke { - assertDoesNotExist() - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt deleted file mode 100644 index 58c7dec2..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/SimpleTestGlobalSemantic.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.MainActivity -import io.github.kakaocup.compose.screen.GlobalSemanticScreen -import org.junit.Rule -import org.junit.Test - -class SimpleTestGlobalSemantic { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun simpleTest() { - onComposeScreen { - myText1 { - assertIsDisplayed() - assertTextContains("Simple text 1") - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/TouchInputTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/TouchInputTest.kt deleted file mode 100644 index 8884e4ee..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/TouchInputTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.click -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.sample.MainActivity -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.screen.MainActivityScreen -import org.junit.Rule -import org.junit.Test - -class TouchInputTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @Test - fun touchInputTest() { - onComposeScreen(composeTestRule) { - clickCounter { - assertTextEquals("0") - performTouchInput { - click() - } - assertTextEquals("1") - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/WaitForTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/WaitForTest.kt deleted file mode 100644 index 708a6bbf..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/WaitForTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.kakaocup.compose.test - -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.DelayDisplayActivity -import io.github.kakaocup.compose.screen.DelayDisplayActivityScreen -import org.junit.Rule -import org.junit.Test - -class WaitUntilTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testWaitUntilAssertIsDisplayed() { - onComposeScreen { - mySimpleText { - assertIsNotDisplayed() - waitUntil { - assertIsDisplayed() - } - assertIsDisplayed() - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/NotScrollableListTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/NotScrollableListTest.kt deleted file mode 100644 index c6198471..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/NotScrollableListTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -package io.github.kakaocup.compose.test.list - -import androidx.compose.material.MaterialTheme -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Email -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.junit4.createComposeRule -import io.github.kakaocup.compose.KakaoCompose -import io.github.kakaocup.compose.SampleNoActivityTest -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.NotScrollableListScreen -import io.github.kakaocup.compose.screen.list.NotScrollableListComposeScreen -import org.junit.Rule -import org.junit.Test - -class NotScrollableListTest : SampleNoActivityTest() { - - @Test - fun test() { - composeTestRule.setContent { - MaterialTheme { - NotScrollableListScreen() - } - } - - onComposeScreen() { - notScrollableListNode { - assertIsDisplayed() - - assertLengthEquals(5) - - itemAt(1) { - performClick() - assertIsSelected() - } - - childAt(2) { - text { - assertTextEquals("Responses") - } - } - - itemWith({ - hasAnyDescendant( - androidx.compose.ui.test.hasText("Profile") - ) - }) { - assertIsNotSelected() - performClick() - assertIsSelected() - } - } - } - } - -} \ No newline at end of file diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableLazyListTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableLazyListTest.kt deleted file mode 100644 index b78728cf..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableLazyListTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -package io.github.kakaocup.compose.test.list - -import androidx.compose.material.MaterialTheme -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.swipeDown -import io.github.kakaocup.compose.SampleNoActivityTest -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.sample.ScrollableLazyListScreen -import io.github.kakaocup.compose.screen.list.ScrollableLazyListComposeScreen -import org.junit.Test - -class ScrollableLazyListTest : SampleNoActivityTest() { - - @OptIn(ExperimentalTestApi::class) - @Test - fun test() { - composeTestRule.setContent { - MaterialTheme { - ScrollableLazyListScreen() - } - } - - onComposeScreen() { - lazyList.assertLengthEquals(0) - - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - - lazyList { - assertLengthEquals(33) - firstChild { - title.assertTextEquals("Items from 1 to 10") - } - - itemWith( - { hasText("Item 1") } - ) { - assertTextEquals("Item 1") - } - - itemAt(10) { - assertTextEquals("Item 10") - } - childWith( - { hasAnyDescendant(androidx.compose.ui.test.hasText("Items from 21 to 30")) } - ) { - title.assertTextEquals("Items from 21 to 30") - } - itemAt(23) { - assertTextEquals("Item 21") - } - itemAt(32) { - assertTextEquals("Item 30") - } - } - - lazyList.performScrollToIndex(0) - - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - lazyList.assertLengthEquals(34) - - } - } - -} \ No newline at end of file diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableListTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableListTest.kt deleted file mode 100644 index c8b591db..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/list/ScrollableListTest.kt +++ /dev/null @@ -1,70 +0,0 @@ -package io.github.kakaocup.compose.test.list - -import androidx.compose.material.MaterialTheme -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.swipeDown -import io.github.kakaocup.compose.SampleNoActivityTest -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.sample.ScrollableListScreen -import io.github.kakaocup.compose.screen.LazyListHeaderNode -import io.github.kakaocup.compose.screen.LazyListItemNode -import io.github.kakaocup.compose.screen.list.ScrollableListComposeScreen -import org.junit.Test - -class ScrollableListTest : SampleNoActivityTest() { - - @OptIn(ExperimentalTestApi::class) - @Test - fun test() { - composeTestRule.setContent { - MaterialTheme { - ScrollableListScreen() - } - } - - onComposeScreen() { - scrollableList.assertLengthEquals(0) - - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - - scrollableList { - assertLengthEquals(33) - firstChild { - title.assertTextEquals("Items from 1 to 10") - } - - itemWith( - { hasText("Item 1") } - ) { - assertTextEquals("Item 1") - } - - itemAt(10) { - assertTextEquals("Item 10") - } - childWith( - { hasAnyDescendant(androidx.compose.ui.test.hasText("Items from 21 to 30")) } - ) { - title.assertTextEquals("Items from 21 to 30") - } - itemAt(23) { - assertTextEquals("Item 21") - } - itemAt(32) { - assertTextEquals("Item 30") - } - } - - scrollableList.performScrollToIndex(0) - - pullToRefresh.performTouchInput { - swipeDown(startY = 200f) - } - scrollableList.assertLengthEquals(34) - - } - } - -} \ No newline at end of file diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/modifier/BackgroundModifierTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/modifier/BackgroundModifierTest.kt deleted file mode 100644 index c83d27bc..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/modifier/BackgroundModifierTest.kt +++ /dev/null @@ -1,82 +0,0 @@ -package io.github.kakaocup.compose.test.modifier - -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.BackgroundActivity -import io.github.kakaocup.compose.screen.BackgroundActivityScreen -import io.github.kakaocup.compose.foundation.assertBackgroundAlphaEquals -import io.github.kakaocup.compose.foundation.assertBackgroundBrushEquals -import io.github.kakaocup.compose.foundation.assertBackgroundColorEquals -import io.github.kakaocup.compose.foundation.assertBackgroundShapeEquals -import org.junit.Rule -import org.junit.Test - -class BackgroundModifierTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testColor() { - onComposeScreen { - backgroundColorAndShapeBox { - assertBackgroundColorEquals(Color.Black) - } - } - } - - @Test - fun testColorString() { - onComposeScreen { - backgroundColorAndShapeBox { - assertBackgroundColorEquals("#000000") - } - } - } - - @Test - fun testColorLong() { - onComposeScreen { - backgroundColorAndShapeBox { - assertBackgroundColorEquals(0xFF000000) - } - } - } - - @Test - fun testShape() { - onComposeScreen { - backgroundColorAndShapeBox { - assertBackgroundShapeEquals(RectangleShape) - } - } - } - - @Test - fun testBrush() { - onComposeScreen { - backgroundBrushAndShapeBox { - assertBackgroundBrushEquals(Brush.linearGradient(listOf(Color.Green, Color.Red))) - } - } - } - - @Test - fun testAlpha() { - onComposeScreen { - backgroundBrushAndShapeBox { - assertBackgroundAlphaEquals(0.5f) - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KButtonNodeTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KButtonNodeTest.kt deleted file mode 100644 index f5b79f00..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KButtonNodeTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -package io.github.kakaocup.compose.test.node - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.ButtonActivity -import io.github.kakaocup.compose.screen.ButtonActivityScreen -import org.junit.Rule -import org.junit.Test - -class KButtonNodeTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testAssertPaddingValuesEquals() { - onComposeScreen { - val padding = PaddingValues( - start = 32.dp, - end = 32.dp, - top = 32.dp, - bottom = 32.dp - ) - - button { - assertPaddingValuesEquals(padding) - } - - outlinedButton { - assertPaddingValuesEquals(padding) - } - - textButton { - assertPaddingValuesEquals(padding) - } - } - } - - @Test - fun testAssertBorderStrokeEquals() { - onComposeScreen { - val borderStroke = BorderStroke(12.dp, Color.Green) - - button { - assertBorderStrokeEquals(borderStroke) - } - - outlinedButton { - assertBorderStrokeEquals(borderStroke) - } - - textButton { - assertBorderStrokeEquals(borderStroke) - } - } - } - - @Test - fun testAssertShapeEquals() { - onComposeScreen { - val shape = RoundedCornerShape(24.dp) - - button { - assertShapeEquals(shape) - } - - outlinedButton { - assertShapeEquals(shape) - } - - textButton { - assertShapeEquals(shape) - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KIconNodeTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KIconNodeTest.kt deleted file mode 100644 index 34bf2e3e..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KIconNodeTest.kt +++ /dev/null @@ -1,81 +0,0 @@ -package io.github.kakaocup.compose.test.node - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.AccountCircle -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.IconActivity -import io.github.kakaocup.compose.sample.R -import io.github.kakaocup.compose.screen.IconActivityScreen -import org.junit.Rule -import org.junit.Test - -class KIconNodeTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testContentDrawable() { - onComposeScreen { - iconDrawableRes { - assertContentEquals(R.drawable.ic_android) - } - } - } - - @Test - fun testContentVector() { - onComposeScreen { - iconImageVector { - assertContentEquals(Icons.Filled.AccountCircle) - } - } - } - - @Test - fun testContentColor() { - onComposeScreen { - iconDrawableRes { - assertTintColorEquals(Color.Black) - } - - iconImageVector { - assertTintColorEquals(Color.Black) - } - } - } - - @Test - fun testContentColorString() { - onComposeScreen { - iconDrawableRes { - assertTintColorEquals("#000000") - } - - iconImageVector { - assertTintColorEquals("#000000") - } - } - } - @Test - fun testContentColorLong() { - onComposeScreen { - iconDrawableRes { - assertTintColorEquals(0xFF000000) - } - - iconImageVector { - assertTintColorEquals(0xFF000000) - } - } - } -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KProgressIndicatorNodeTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KProgressIndicatorNodeTest.kt deleted file mode 100644 index ee222203..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KProgressIndicatorNodeTest.kt +++ /dev/null @@ -1,114 +0,0 @@ -package io.github.kakaocup.compose.test.node - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity -import io.github.kakaocup.compose.screen.ProgressIndicatorActivityScreen -import org.junit.Rule -import org.junit.Test - -class KProgressIndicatorNodeTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun testAssertColorEquals() { - onComposeScreen { - linearWithProgress { - assertColorEquals(Color.Green) - } - - linearWithoutProgress { - assertColorEquals(Color.Green) - } - - circularWithProgress { - assertColorEquals(Color.Green) - } - - circularWithoutProgress { - assertColorEquals(Color.Green) - } - } - } - - @Test - fun testAssertStrokeWidthEquals() { - onComposeScreen { - circularWithProgress { - assertStrokeWidthEquals(4.dp) - } - - circularWithoutProgress { - assertStrokeWidthEquals(4.dp) - } - } - } - - @Test - fun testAssertStrokeCapEquals() { - onComposeScreen { - linearWithProgress { - assertStrokeCapEquals(StrokeCap.Round) - } - - linearWithoutProgress { - assertStrokeCapEquals(StrokeCap.Round) - } - - circularWithProgress { - assertStrokeCapEquals(StrokeCap.Round) - } - - circularWithoutProgress { - assertStrokeCapEquals(StrokeCap.Round) - } - } - } - - @Test - fun testAssertBackgroundColorEquals() { - onComposeScreen { - linearWithProgress { - assertBackgroundColorEquals(Color.Blue) - } - - linearWithoutProgress { - assertBackgroundColorEquals(Color.Blue) - } - - circularWithProgress { - assertBackgroundColorEquals(Color.Blue) - } - - circularWithoutProgress { - assertBackgroundColorEquals(Color.Blue) - } - } - } - - @Test - fun testAssertProgressEquals() { - onComposeScreen { - linearWithProgress { - assertProgressEquals(0.3f) - } - - circularWithProgress { - assertProgressEquals(0.7f) - } - } - } - -} diff --git a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KTextNodeTest.kt b/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KTextNodeTest.kt deleted file mode 100644 index 4d903ad0..00000000 --- a/sample/src/androidTest/java/io/github/kakaocup/compose/test/node/KTextNodeTest.kt +++ /dev/null @@ -1,178 +0,0 @@ -package io.github.kakaocup.compose.test.node - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.sp -import io.github.kakaocup.compose.node.element.ComposeScreen.Companion.onComposeScreen -import io.github.kakaocup.compose.rule.KakaoComposeTestRule -import io.github.kakaocup.compose.sample.TextActivity -import io.github.kakaocup.compose.screen.TextActivityScreen -import org.junit.Rule -import org.junit.Test - -class KTextNodeTest { - - @get:Rule - val composeTestRule = createAndroidComposeRule() - - @get:Rule - val kakaoComposeTestRule = KakaoComposeTestRule( - semanticsProvider = composeTestRule, - useUnmergedTree = true - ) - - @Test - fun textAssertTextColorEquals() { - onComposeScreen { - textWithoutStyle { - assertTextColorEquals(Color.Black) - } - - textWithStyle { - assertTextColorEquals(Color.Black) - } - - textWithSemantic { - assertTextColorEquals(Color.Black) - } - } - } - - @Test - fun textAssertTextColorEqualsString() { - onComposeScreen { - textWithoutStyle { - assertTextColorEquals("#000000") - } - - textWithStyle { - assertTextColorEquals("#000000") - } - - textWithSemantic { - assertTextColorEquals("#000000") - } - } - } - - @Test - fun textAssertTextColorEqualsLong() { - onComposeScreen { - textWithoutStyle { - assertTextColorEquals(0xFF000000) - } - - textWithStyle { - assertTextColorEquals(0xFF000000) - } - - textWithSemantic { - assertTextColorEquals(0xFF000000) - } - } - } - - @Test - fun testAssertFontSizeEquals() { - onComposeScreen { - textWithAllFields { - assertFontSizeEquals(16.sp) - } - } - } - - @Test - fun testAssertFontStyleEquals() { - onComposeScreen { - textWithAllFields { - assertFontStyleEquals(FontStyle.Italic) - } - } - } - - @Test - fun testAssertFontWeightEquals() { - onComposeScreen { - textWithAllFields { - assertFontWeightEquals(FontWeight.Bold) - } - } - } - - @Test - fun testAssertLetterSpacingEquals() { - onComposeScreen { - textWithAllFields { - assertLetterSpacingEquals(4.sp) - } - } - } - - @Test - fun testAssertTextDecorationEquals() { - onComposeScreen { - textWithAllFields { - assertTextDecorationEquals(TextDecoration.Underline) - } - } - } - - @Test - fun testAssertTextAlignEquals() { - onComposeScreen { - textWithAllFields { - assertTextAlignEquals(TextAlign.Left) - } - } - } - - @Test - fun testAssertLineHeightEquals() { - onComposeScreen { - textWithAllFields { - assertLineHeightEquals(6.sp) - } - } - } - - @Test - fun testAssertOverflowEquals() { - onComposeScreen { - textWithAllFields { - assertOverflowEquals(TextOverflow.Ellipsis) - } - } - } - - @Test - fun testAssertSoftWrapEquals() { - onComposeScreen { - textWithAllFields { - assertSoftWrapEquals(false) - } - } - } - - @Test - fun testAssertMaxLinesEquals() { - onComposeScreen { - textWithAllFields { - assertMaxLinesEquals(10) - } - } - } - - @Test - fun testAssertMinLinesEquals() { - onComposeScreen { - textWithAllFields { - assertMinLinesEquals(3) - } - } - } -} diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index bffe6c4d..8c7dc449 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -21,14 +21,5 @@ - - - - - - - - -
\ No newline at end of file diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/MainActivity.kt b/sample/src/main/java/io/github/kakaocup/appium/sample/MainActivity.kt similarity index 98% rename from sample/src/main/java/io/github/kakaocup/compose/sample/MainActivity.kt rename to sample/src/main/java/io/github/kakaocup/appium/sample/MainActivity.kt index 978f59b4..5f8da7b1 100644 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/MainActivity.kt +++ b/sample/src/main/java/io/github/kakaocup/appium/sample/MainActivity.kt @@ -1,4 +1,4 @@ -package io.github.kakaocup.compose.sample +package io.github.kakaocup.appium.sample import android.os.Bundle import androidx.activity.compose.setContent diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/BackgroundActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/BackgroundActivity.kt deleted file mode 100644 index 548f0c91..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/BackgroundActivity.kt +++ /dev/null @@ -1,76 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.size -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.sample.BackgroundSemanticsScreenTestTags.BackgroundBrushAndShapeBox -import io.github.kakaocup.compose.sample.BackgroundSemanticsScreenTestTags.BackgroundColorAndShapeBox -import io.github.kakaocup.compose.sample.BackgroundSemanticsScreenTestTags.BackgroundScreen -import io.github.kakaocup.compose.foundation.background - -class BackgroundActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - BackgroundScreen() - } - } -} - -object BackgroundSemanticsScreenTestTags { - const val BackgroundScreen = "Screen" - const val BackgroundColorAndShapeBox = "backgroundColorAndShapeBox" - const val BackgroundBrushAndShapeBox = "backgroundBrushAndShapeBox" -} - -@Composable -fun BackgroundScreen() { - - val backgroundColor by remember { mutableStateOf(Color.Black) } - val backgroundShape by remember { mutableStateOf(RectangleShape) } - val backgroundBrush by remember { mutableStateOf(Brush.linearGradient(listOf(Color.Green, Color.Red))) } - - Column( - modifier = Modifier - .semantics { testTag = BackgroundScreen } - ) { - Box( - modifier = Modifier - .size(50.dp) - .background(backgroundColor, backgroundShape) - .testTag(BackgroundColorAndShapeBox) - ) - - Box( - modifier = Modifier - .size(50.dp) - .background(backgroundBrush, backgroundShape, 0.5f) - .testTag(BackgroundBrushAndShapeBox) - ) - } -} - -@Composable -@Preview(showSystemUi = true) -private fun SemanticsScreenPreview() { - MaterialTheme { - BackgroundScreen() - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/ButtonActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/ButtonActivity.kt deleted file mode 100644 index 7403df28..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/ButtonActivity.kt +++ /dev/null @@ -1,105 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.foundation.Button -import io.github.kakaocup.compose.foundation.OutlinedButton -import io.github.kakaocup.compose.foundation.Text -import io.github.kakaocup.compose.foundation.TextButton - -class ButtonActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } - - object ButtonScreenTestTags { - const val ButtonScreen = "Screen" - const val Button = "Button" - const val OutlinedButton = "OutlinedButton" - const val TextButton = "TextButton" - - } - - @Composable - private fun Screen() { - Column( - modifier = Modifier - .semantics { testTag = ButtonScreenTestTags.ButtonScreen } - ) { - Button( - onClick = {}, - modifier = Modifier.semantics { - testTag = ButtonScreenTestTags.Button - }, - shape = RoundedCornerShape(24.dp), - border = BorderStroke(12.dp, Color.Green), - contentPadding = PaddingValues( - start = 32.dp, - end = 32.dp, - top = 32.dp, - bottom = 32.dp - ) - ) { - Text(text = "Button 1") - } - - OutlinedButton( - onClick = {}, - modifier = Modifier.semantics { - testTag = ButtonScreenTestTags.OutlinedButton - }, - shape = RoundedCornerShape(24.dp), - border = BorderStroke(12.dp, Color.Green), - contentPadding = PaddingValues( - start = 32.dp, - end = 32.dp, - top = 32.dp, - bottom = 32.dp - ) - ) { - Text(text = "Button 1") - } - - TextButton( - onClick = {}, - modifier = Modifier.semantics { - testTag = ButtonScreenTestTags.TextButton - }, - shape = RoundedCornerShape(24.dp), - border = BorderStroke(12.dp, Color.Green), - contentPadding = PaddingValues( - start = 32.dp, - end = 32.dp, - top = 32.dp, - bottom = 32.dp - ) - ) { - Text(text = "Button 1") - } - } - } - - @Composable - @Preview(showSystemUi = true) - private fun TextScreenScreenPreview() { - MaterialTheme { - Screen() - } - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/CustomSemanticPropertyKeyActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/CustomSemanticPropertyKeyActivity.kt deleted file mode 100644 index 844fa859..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/CustomSemanticPropertyKeyActivity.kt +++ /dev/null @@ -1,61 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp - -val CustomSemanticKey = SemanticsPropertyKey("CustomSemanticKey") -var SemanticsPropertyReceiver.customSemanticKey by CustomSemanticKey - -object CustomSemanticsScreenTestTags { - const val Screen = "Screen" - const val view = "view" -} - -class CustomSemanticPropertyKeyActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } -} - -@Composable -private fun Screen() { - Column( - modifier = Modifier - .fillMaxSize() - .semantics { testTag = "Screen" } - ) { - Text( - text = "Simple text 1", - modifier = Modifier - .padding(8.dp) - .semantics { testTag = "view" } - .semantics { customSemanticKey = "Any value" } - ) - } -} - -@Composable -@Preview(showSystemUi = true) -private fun Preview() { - MaterialTheme { - Screen() - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/DelayDisplayActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/DelayDisplayActivity.kt deleted file mode 100644 index 7cf82c1b..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/DelayDisplayActivity.kt +++ /dev/null @@ -1,74 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch - -class DelayDisplayActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContent { - val isVisible = remember { mutableStateOf(false) } - - CoroutineScope(Dispatchers.Main).launch { - CoroutineScope(Dispatchers.Default).async { - delay(500) - }.await() - - isVisible.value = true - } - - Screen(isVisible.value) - } - } -} - -object DelayDisplayActivityTestTags { - const val Screen = "Screen" - const val mySimpleText = "mySimpleText" -} - -@Composable -private fun Screen(visible: Boolean) { - Column( - modifier = Modifier - .fillMaxSize() - .semantics { testTag = "Screen" } - ) { - if (visible) { - Text( - text = "Simple text 1", - modifier = Modifier - .padding(8.dp) - .semantics { testTag = "mySimpleText" } - ) - } - } -} - -@Composable -@Preview(showSystemUi = true) -private fun ScreenPreview() { - MaterialTheme { - Screen(true) - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/DialogActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/DialogActivity.kt deleted file mode 100644 index 2ff66386..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/DialogActivity.kt +++ /dev/null @@ -1,136 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.AlertDialog -import androidx.compose.material.Button -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.material.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp - -class DialogActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } - - object TestTags { - const val Screen = "Screen" - const val StatusText = "StatusText" - const val ShowAlertDialogButton = "ShowAlertDiaglog" - const val AlertDialog = "AlertDialog" - const val AlertDialogDismissButton = "AlertDialogDismissButton" - } - - @Composable - private fun Screen() { - - val openAlertDialog = remember { mutableStateOf(false) } - val status = remember { mutableStateOf("No Status") } - - when { - openAlertDialog.value -> { - AlertDialogExample( - onDismissRequest = { - status.value = "Dialog Dismissed" - openAlertDialog.value = false - }, - onConfirmation = { - status.value = "Dialog Confirmed" - openAlertDialog.value = false - }, - dialogTitle = "Alert dialog example", - dialogText = "This is an example of an alert dialog with buttons.", - ) - } - } - - Column( - modifier = Modifier - .semantics { testTag = TestTags.Screen } - ) { - Text( - text = status.value, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = TestTags.StatusText } - ) - - Button( - content = { - Text(text = "Show Alert Dialog") - }, - onClick = { - status.value = "Dialog Opened" - openAlertDialog.value = true - }, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = TestTags.ShowAlertDialogButton } - ) - } - - } - - @Composable - @Preview(showSystemUi = true) - private fun TextScreenScreenPreview() { - MaterialTheme { - Screen() - } - } - - @Composable - fun AlertDialogExample( - onDismissRequest: () -> Unit, - onConfirmation: () -> Unit, - dialogTitle: String, - dialogText: String, - ) { - AlertDialog( - modifier = Modifier.testTag(TestTags.AlertDialog), - title = { - Text(text = dialogTitle) - }, - text = { - Text(text = dialogText) - }, - onDismissRequest = { - onDismissRequest() - }, - confirmButton = { - TextButton( - onClick = { - onConfirmation() - } - ) { - Text("Confirm") - } - }, - dismissButton = { - TextButton( - modifier = Modifier.testTag(TestTags.AlertDialogDismissButton), - onClick = { - onDismissRequest() - } - ) { - Text("Dismiss") - } - } - ) - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/IconActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/IconActivity.kt deleted file mode 100644 index 401d07ae..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/IconActivity.kt +++ /dev/null @@ -1,71 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.material.MaterialTheme -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.AccountCircle -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import io.github.kakaocup.compose.foundation.Icon - -class IconActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } - - object IconScreenTestTags { - const val IconScreen = "Screen" - const val iconDrawableRes = "iconDrawableRes" - const val iconImageVector = "iconImageVector" - } - - @Composable - private fun Screen() { - val tintColor by remember { mutableStateOf(Color.Black) } - val iconRes by remember { mutableIntStateOf(R.drawable.ic_android) } - val iconImageVector by remember { mutableStateOf(Icons.Filled.AccountCircle) } - - Column( - modifier = Modifier - .semantics { testTag = IconScreenTestTags.IconScreen } - ) { - Icon( - modifier = Modifier - .testTag(IconScreenTestTags.iconDrawableRes), - resId = iconRes, - tint = tintColor, - contentDescription = null - ) - Icon( - modifier = Modifier - .testTag(IconScreenTestTags.iconImageVector), - imageVector = iconImageVector, - tint = tintColor, - contentDescription = null - ) - } - } - - @Composable - @Preview(showSystemUi = true) - private fun MainScreenPreview() { - MaterialTheme { - Screen() - } - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/LazyListScreen.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/LazyListScreen.kt deleted file mode 100644 index 293d0019..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/LazyListScreen.kt +++ /dev/null @@ -1,158 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.annotation.SuppressLint -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.Scaffold -import androidx.compose.material.Text -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.unit.dp - -@OptIn(ExperimentalMaterialApi::class) -@SuppressLint("UnusedMaterialScaffoldPaddingParameter") -@Composable -fun LazyListScreen() { - var items by remember { mutableStateOf(listOf()) } - var isRefreshing by remember { mutableStateOf(false) } - Scaffold( - Modifier.testTag("LazyListScreen") - ) { scaffoldPadding -> - val pullRefreshState = rememberPullRefreshState( - refreshing = isRefreshing, - onRefresh = { - if (items.isEmpty()) { - items = getItems() - } else { - items += LazyListItem.Item("Item ${items.size + 1}") - } - isRefreshing = false - } - ) - - Box( - modifier = Modifier - .padding(scaffoldPadding) - .testTag("PullToRefresh") - .pullRefresh(pullRefreshState) - ) { - LazyColumn( - Modifier - .fillMaxSize() - .testTag("LazyList") - .semantics { lazyListLength = items.size } - ) { - itemsIndexed(items) { index, item -> - val positionModifier = Modifier.semantics { lazyListItemPosition = index } - when (item) { - is LazyListItem.Header -> ListItemHeader(item, positionModifier) - is LazyListItem.Item -> ListItemCell(item, positionModifier) - is LazyListItem.NestedItem -> NestedListItemCell(item, positionModifier) - } - } - } - PullRefreshIndicator( - state = pullRefreshState, - refreshing = isRefreshing, - modifier = Modifier.align(Alignment.TopCenter), - ) - } - } -} - -@Composable -private fun ListItemHeader(item: LazyListItem.Header, modifier: Modifier = Modifier) { - Box( - modifier = Modifier - .padding(horizontal = 16.dp, vertical = 8.dp) - .clip(RoundedCornerShape(8.dp)) - .background(Color.Green) - .then(modifier) - ) { - Text( - item.title, - Modifier - .padding(8.dp) - .testTag("LazyListHeaderTitle") - ) - } -} - -@Composable -private fun ListItemCell(item: LazyListItem.Item, modifier: Modifier = Modifier) { - Text( - item.title, - Modifier - .fillMaxWidth() - .padding(16.dp) - .testTag("LazyListItemTitle") - .then(modifier) - ) -} - -@Composable -private fun NestedListItemCell(item: LazyListItem.NestedItem, modifier: Modifier = Modifier) { - Box( - modifier = Modifier.border(BorderStroke(2.dp, Color.Blue)) - ) { - Text( - item.title, - Modifier - .fillMaxWidth() - .padding(16.dp) - .testTag("LazyListItemTitle") - .then(modifier) - ) - } -} - - -private fun getItems(): List { - val result = mutableListOf() - - repeat(30) { index -> - if (index % 10 == 0) { - result += LazyListItem.Header(title = "Items from ${index + 1} to ${index + 10}") - } - result += LazyListItem.Item("Item ${index + 1}") - } - - result += LazyListItem.NestedItem("Nested Item 1") - - return result -} - -private sealed class LazyListItem { - data class Header(val title: String) : LazyListItem() - data class Item(val title: String) : LazyListItem() - data class NestedItem(val title: String) : LazyListItem() -} - -val LazyListItemPositionSemantics = SemanticsPropertyKey("LazyListItemPosition") -var SemanticsPropertyReceiver.lazyListItemPosition by LazyListItemPositionSemantics - -val LazyListLengthSemantics = SemanticsPropertyKey("LazyListLength") -var SemanticsPropertyReceiver.lazyListLength by LazyListLengthSemantics diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/NotScrollableListScreen.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/NotScrollableListScreen.kt deleted file mode 100644 index dba870a6..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/NotScrollableListScreen.kt +++ /dev/null @@ -1,229 +0,0 @@ -package io.github.kakaocup.compose.sample - -import androidx.compose.foundation.background -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.selection.selectable -import androidx.compose.material.Icon -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Email -import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material.icons.filled.Person -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.Send -import androidx.compose.material.icons.outlined.Email -import androidx.compose.material.icons.outlined.FavoriteBorder -import androidx.compose.material.icons.outlined.Person -import androidx.compose.material.icons.outlined.Search -import androidx.compose.material.icons.outlined.Send -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.Role -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.sample.semantics.listItemIndexSemantic -import io.github.kakaocup.compose.sample.semantics.listLength - -/** - * Sample with not scrollable list. - */ -@Composable -fun NotScrollableListScreen() { - Box( - modifier = Modifier - .fillMaxSize() - ) { - var selectedTabId by remember { - mutableStateOf(TabBarItem.Search.id) - } - - CustomTabBar( - selectedTabId = selectedTabId, - onSelect = { selectedTabId = it }, - modifier = Modifier - .align(Alignment.BottomStart) - ) - } -} - -/** - * Example of not scrollable list. - */ -@Composable -private fun CustomTabBar( - selectedTabId: String, - onSelect: (id: String) -> Unit, - modifier: Modifier = Modifier, -) { - Column( - modifier = modifier - .fillMaxWidth() - .heightIn(min = 49.dp) - .background(Color.White) - ) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(Color.Gray) - ) - - // Warning! - // There is no `Modifier.horizontalScroll`, so there is no `AccessibilityAction.ScrollBy` in this container. - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier - .fillMaxWidth() - .padding(4.dp) - .semantics { - testTag = "tabbar_container" - listLength = TabBarItem.entries.size - }, - ) { - TabBarItem.entries.forEachIndexed { index, tabBarItem -> - TabBarItemContent( - item = tabBarItem, - selectedTabId = selectedTabId, - onSelect = onSelect, - modifier = Modifier - .weight(1f) - .listItemIndexSemantic(index) - ) - } - } - } -} - -@Composable -private fun TabBarItemContent( - item: TabBarItem, - selectedTabId: String, - onSelect: (id: String) -> Unit, - modifier: Modifier = Modifier, -) { - val isSelected = item.id == selectedTabId - - Box( - modifier = modifier - .selectable( - selected = isSelected, - role = Role.Tab, - interactionSource = remember { - MutableInteractionSource() - }, - indication = null, - onClick = { onSelect.invoke(item.id) } - ), - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .padding(top = 5.dp, bottom = 4.dp), - ) { - Row(verticalAlignment = Alignment.CenterVertically) { - val iconContent = if (isSelected) item.selectedIcon else item.unselectedIcon - Icon( - imageVector = iconContent, - contentDescription = null, - modifier = Modifier - .testTag("tabbar_item_icon") - ) - - if (item.counter != null) { - Spacer(modifier = Modifier.width(4.dp)) - Text( - text = "${item.counter}", - color = Color.White, - modifier = Modifier - .background(Color.Red) - ) - } - } - Spacer(modifier = Modifier.height(3.dp)) - - Text( - text = item.text, - style = MaterialTheme.typography.button, - color = if (isSelected) Color.Black else Color.Gray, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - modifier = Modifier - .align(Alignment.CenterHorizontally) - .testTag("tabbar_item_text"), - ) - } - } -} - -private enum class TabBarItem( - val id: String, - val text: String, - val selectedIcon: ImageVector, - val unselectedIcon: ImageVector, - val counter: Int? = null, -) { - Search( - id = "0", - text = "Search", - selectedIcon = Icons.Filled.Search, - unselectedIcon = Icons.Outlined.Search, - ), - Favorites( - id = "1", - text = "Favorites", - selectedIcon = Icons.Filled.Favorite, - unselectedIcon = Icons.Outlined.FavoriteBorder, - counter = 100, - ), - Responses( - id = "2", - text = "Responses", - selectedIcon = Icons.Filled.Email, - unselectedIcon = Icons.Outlined.Email, - ), - Chats( - id = "3", - text = "Chats", - selectedIcon = Icons.Filled.Send, - unselectedIcon = Icons.Outlined.Send, - counter = 9, - ), - Profile( - id = "4", - text = "Profile", - selectedIcon = Icons.Filled.Person, - unselectedIcon = Icons.Outlined.Person, - ), -} - -@Preview -@Composable -private fun PreviewNotScrollableScreen() { - MaterialTheme { - NotScrollableListScreen() - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/ProgressIndicatorActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/ProgressIndicatorActivity.kt deleted file mode 100644 index 59197f81..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/ProgressIndicatorActivity.kt +++ /dev/null @@ -1,94 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.foundation.CircularProgressIndicator -import io.github.kakaocup.compose.foundation.LinearProgressIndicator -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity.TextScreenTestTags.CircularWithProgress -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity.TextScreenTestTags.CircularWithoutProgress -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity.TextScreenTestTags.LinearWithProgress -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity.TextScreenTestTags.LinearWithoutProgress -import io.github.kakaocup.compose.sample.ProgressIndicatorActivity.TextScreenTestTags.ProgressIndicatorScreen - - -class ProgressIndicatorActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } - - object TextScreenTestTags { - const val ProgressIndicatorScreen = "Screen" - const val CircularWithProgress = "CircularWithProgress" - const val CircularWithoutProgress = "CircularWithoutProgress" - const val LinearWithProgress = "LinearWithProgress" - const val LinearWithoutProgress = "LinearWithoutProgress" - } - - @Composable - private fun Screen() { - Column( - modifier = Modifier - .semantics { testTag = ProgressIndicatorScreen } - ) { - LinearProgressIndicator( - progress = 0.3f, - color = Color.Green, - strokeCap = StrokeCap.Round, - backgroundColor = Color.Blue, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = LinearWithProgress } - ) - LinearProgressIndicator( - color = Color.Green, - strokeCap = StrokeCap.Round, - backgroundColor = Color.Blue, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = LinearWithoutProgress } - ) - CircularProgressIndicator( - progress = 0.7f, - color = Color.Green, - strokeCap = StrokeCap.Round, - strokeWidth = 4.dp, - backgroundColor = Color.Blue, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = CircularWithProgress } - ) - CircularProgressIndicator( - color = Color.Green, - strokeCap = StrokeCap.Round, - strokeWidth = 4.dp, - backgroundColor = Color.Blue, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = CircularWithoutProgress } - ) - } - } - - @Composable - @Preview(showSystemUi = true) - private fun TextScreenScreenPreview() { - MaterialTheme { - Screen() - } - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableLazyListScreen.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableLazyListScreen.kt deleted file mode 100644 index 5ba29585..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableLazyListScreen.kt +++ /dev/null @@ -1,129 +0,0 @@ -package io.github.kakaocup.compose.sample - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.Scaffold -import androidx.compose.material.Text -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.sample.semantics.listItemIndexSemantic -import io.github.kakaocup.compose.sample.semantics.listLengthSemantic - -/** - * Sample with scrollable lazy list. - */ -@OptIn(ExperimentalMaterialApi::class) -@Composable -fun ScrollableLazyListScreen() { - var items by remember { mutableStateOf(listOf()) } - var isRefreshing by remember { mutableStateOf(false) } - - Scaffold { scaffoldPadding -> - val pullRefreshState = rememberPullRefreshState( - refreshing = isRefreshing, - onRefresh = { - if (items.isEmpty()) { - items = getItems() - } else { - items += ScrollableLazyListItem.Item("Item ${items.size + 1}") - } - isRefreshing = false - } - ) - - Box( - modifier = Modifier - .padding(scaffoldPadding) - .testTag("PullToRefresh") - .pullRefresh(pullRefreshState) - ) { - LazyColumn( - Modifier - .fillMaxSize() - .testTag("LazyList") - .listLengthSemantic(items.size) - ) { - itemsIndexed(items) { index, item -> - when (item) { - is ScrollableLazyListItem.Header -> ListItemHeader(item, Modifier.listItemIndexSemantic(index)) - is ScrollableLazyListItem.Item -> ListItemCell(item, Modifier.listItemIndexSemantic(index)) - } - } - } - PullRefreshIndicator( - state = pullRefreshState, - refreshing = isRefreshing, - modifier = Modifier.align(Alignment.TopCenter), - ) - } - } -} - - - -@Composable -private fun ListItemHeader(item: ScrollableLazyListItem.Header, modifier: Modifier = Modifier) { - Box( - modifier = Modifier - .padding(horizontal = 16.dp, vertical = 8.dp) - .clip(RoundedCornerShape(8.dp)) - .background(Color.Green) - .then(modifier) - ) { - Text( - item.title, - Modifier - .padding(8.dp) - .testTag("LazyListHeaderTitle") - ) - } -} - -@Composable -private fun ListItemCell(item: ScrollableLazyListItem.Item, modifier: Modifier = Modifier) { - Text( - item.title, - Modifier - .fillMaxWidth() - .padding(16.dp) - .testTag("LazyListItemTitle") - .then(modifier) - ) -} - -private fun getItems(): List { - val result = mutableListOf() - - repeat(30) { index -> - if (index % 10 == 0) { - result += ScrollableLazyListItem.Header(title = "Items from ${index + 1} to ${index + 10}") - } - result += ScrollableLazyListItem.Item("Item ${index + 1}") - } - - return result -} - -private sealed class ScrollableLazyListItem { - data class Header(val title: String) : ScrollableLazyListItem() - data class Item(val title: String) : ScrollableLazyListItem() -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableListScreen.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableListScreen.kt deleted file mode 100644 index 52aa4ce0..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/ScrollableListScreen.kt +++ /dev/null @@ -1,129 +0,0 @@ -package io.github.kakaocup.compose.sample - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.Scaffold -import androidx.compose.material.Text -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.unit.dp -import io.github.kakaocup.compose.sample.semantics.listItemIndexSemantic -import io.github.kakaocup.compose.sample.semantics.listLengthSemantic - -/** - * Copy of [ScrollableLazyListScreen] but with not lazy [androidx.compose.foundation.layout.Column]. - */ -@OptIn(ExperimentalMaterialApi::class) -@Composable -fun ScrollableListScreen() { - var items by remember { mutableStateOf(listOf()) } - var isRefreshing by remember { mutableStateOf(false) } - - Scaffold { scaffoldPadding -> - val pullRefreshState = rememberPullRefreshState( - refreshing = isRefreshing, - onRefresh = { - if (items.isEmpty()) { - items = getItems() - } else { - items += ScrollableListItem.Item("Item ${items.size + 1}") - } - isRefreshing = false - } - ) - - Box( - modifier = Modifier - .padding(scaffoldPadding) - .testTag("PullToRefresh") - .pullRefresh(pullRefreshState) - ) { - Column( - Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - .testTag("ScrollableColumn") - .listLengthSemantic(items.size) - ) { - items.forEachIndexed { index, item -> - when (item) { - is ScrollableListItem.Header -> ListItemHeader(item, Modifier.listItemIndexSemantic(index)) - is ScrollableListItem.Item -> ListItemCell(item, Modifier.listItemIndexSemantic(index)) - } - } - } - PullRefreshIndicator( - state = pullRefreshState, - refreshing = isRefreshing, - modifier = Modifier.align(Alignment.TopCenter), - ) - } - } -} - -@Composable -private fun ListItemHeader(item: ScrollableListItem.Header, modifier: Modifier = Modifier) { - Box( - modifier = Modifier - .padding(horizontal = 16.dp, vertical = 8.dp) - .clip(RoundedCornerShape(8.dp)) - .background(Color.Green) - .then(modifier) - ) { - Text( - item.title, - Modifier - .padding(8.dp) - .testTag("ListHeaderTitle") - ) - } -} - -@Composable -private fun ListItemCell(item: ScrollableListItem.Item, modifier: Modifier = Modifier) { - Text( - item.title, - Modifier - .fillMaxWidth() - .padding(16.dp) - .testTag("ListItemTitle") - .then(modifier) - ) -} - -private fun getItems(): List { - val result = mutableListOf() - - repeat(30) { index -> - if (index % 10 == 0) { - result += ScrollableListItem.Header(title = "Items from ${index + 1} to ${index + 10}") - } - result += ScrollableListItem.Item("Item ${index + 1}") - } - - return result -} - -private sealed class ScrollableListItem { - data class Header(val title: String) : ScrollableListItem() - data class Item(val title: String) : ScrollableListItem() -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/SimpleNavigationScreen.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/SimpleNavigationScreen.kt deleted file mode 100644 index 4dec47c8..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/SimpleNavigationScreen.kt +++ /dev/null @@ -1,105 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.annotation.SuppressLint -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Button -import androidx.compose.material.Card -import androidx.compose.material.Scaffold -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.unit.dp - -@Composable -fun SimpleNavigationScreen() { - var currentScreen by rememberSaveable { mutableStateOf(NavigationScreen.First) } - - when (currentScreen) { - NavigationScreen.First -> FirstNavigationScreen( - onNavigateSecondScreen = { - currentScreen = NavigationScreen.Second - } - ) - NavigationScreen.Second -> SecondNavigationScreen() - } -} - -@SuppressLint("UnusedMaterialScaffoldPaddingParameter") -@Composable -private fun FirstNavigationScreen(onNavigateSecondScreen: () -> Unit) { - Scaffold(Modifier.testTag("FirstNavigationScreen")) { _ -> - Card(Modifier.padding(64.dp)) { - Box( - Modifier - .fillMaxSize() - .padding(32.dp) - ) { - SharedWidget( - title = "First screen", - modifier = Modifier.align(Alignment.TopCenter) - ) - Button( - onClick = onNavigateSecondScreen, - modifier = Modifier - .align(Alignment.BottomCenter) - .testTag("NavigateSecondScreenButton") - ) { - Text("Navigate second screen") - } - } - } - } -} - -@SuppressLint("UnusedMaterialScaffoldPaddingParameter") -@Composable -private fun SecondNavigationScreen() { - Scaffold(Modifier.testTag("SecondNavigationScreen")) { _ -> - Card(Modifier.padding(64.dp)) { - Box( - Modifier - .fillMaxSize() - .padding(32.dp) - ) { - SharedWidget( - title = "Second screen", - modifier = Modifier.align(Alignment.TopCenter) - ) - } - } - } -} - -@Composable -private fun SharedWidget(title: String, modifier: Modifier = Modifier) { - Box( - modifier - .clip(RoundedCornerShape(16.dp)) - .background(Color.Green) - .testTag("SharedWidget") - ) { - Text( - title, - Modifier - .padding(16.dp) - .testTag("SharedWidgetTitle") - ) - } -} - -private enum class NavigationScreen { - First, - Second -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/TextActivity.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/TextActivity.kt deleted file mode 100644 index 9eb86b54..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/TextActivity.kt +++ /dev/null @@ -1,104 +0,0 @@ -package io.github.kakaocup.compose.sample - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.text.font.FontStyle.Companion.Italic -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import io.github.kakaocup.compose.foundation.Text -import io.github.kakaocup.compose.sample.TextActivity.TextScreenTestTags.textWithAllFields -import io.github.kakaocup.compose.sample.TextActivity.TextScreenTestTags.textWithSemantic -import io.github.kakaocup.compose.sample.TextActivity.TextScreenTestTags.textWithStyle -import io.github.kakaocup.compose.sample.TextActivity.TextScreenTestTags.textWithoutStyle - -class TextActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Screen() - } - } - - object TextScreenTestTags { - const val TextScreen = "Screen" - const val textWithAllFields = "textWithoutStyle" - const val textWithoutStyle = "textWithoutStyle" - const val textWithStyle = "textWithStyle" - const val textWithSemantic = "textWithSemantic" - - } - - @Composable - private fun Screen() { - Column( - modifier = Modifier - .semantics { testTag = TextScreenTestTags.TextScreen } - ) { - Text( - text = "Text With All Fields", - color = Color.Black, - fontSize = 16.sp, - fontStyle = Italic, - fontWeight = FontWeight.Bold, - letterSpacing = 4.sp, - textDecoration = TextDecoration.Underline, - textAlign = TextAlign.Left, - lineHeight = 6.sp, - overflow = TextOverflow.Ellipsis, - softWrap = false, - maxLines = 10, - minLines = 3, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = textWithAllFields } - ) - - Text( - text = "Text without style", - modifier = Modifier - .padding(8.dp) - .semantics { testTag = textWithoutStyle } - ) - - Text( - text = "Text with style", - modifier = Modifier - .padding(8.dp) - .semantics { testTag = textWithStyle }, - style = MaterialTheme.typography.body1.copy( - color = Color.Black - ) - ) - - Text( - text = "Text with semantic property", - color = Color.Black, - modifier = Modifier - .padding(8.dp) - .semantics { testTag = textWithSemantic } - ) - } - } - - @Composable - @Preview(showSystemUi = true) - private fun TextScreenScreenPreview() { - MaterialTheme { - Screen() - } - } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListItemIndex.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListItemIndex.kt deleted file mode 100644 index c7b55a71..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListItemIndex.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.kakaocup.compose.sample.semantics - -import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver -import androidx.compose.ui.semantics.semantics - -val ListItemIndexSemanticKey = SemanticsPropertyKey("ListItemIndex") -var SemanticsPropertyReceiver.listItemIndex by ListItemIndexSemanticKey -fun Modifier.listItemIndexSemantic(index: Int): Modifier { - return semantics { listItemIndex = index } -} diff --git a/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListLength.kt b/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListLength.kt deleted file mode 100644 index 3a56f216..00000000 --- a/sample/src/main/java/io/github/kakaocup/compose/sample/semantics/ListLength.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.kakaocup.compose.sample.semantics - -import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.SemanticsPropertyKey -import androidx.compose.ui.semantics.SemanticsPropertyReceiver -import androidx.compose.ui.semantics.semantics - -val ListLengthSemanticKey = SemanticsPropertyKey("ListLength") -var SemanticsPropertyReceiver.listLength by ListLengthSemanticKey -fun Modifier.listLengthSemantic(length: Int): Modifier { - return semantics { listLength = length } -} diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 6edf1016..4627979a 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - KakaoCompose + Kakao Appium Button 1 Change icon Change text color diff --git a/settings.gradle.kts b/settings.gradle.kts index 5ba91cf6..adfa6469 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,8 +1,6 @@ -include(":compose") -include(":compose-ui") -include(":compose-test") -include(":compose-semantics") +include(":appium") include(":sample") +include(":appium-tests") pluginManagement { repositories { From 674b6d5cd8de10adf6051a2254aab1c527b3cd29 Mon Sep 17 00:00:00 2001 From: Konstantin Aksenov Date: Fri, 9 Jan 2026 12:35:57 +1000 Subject: [PATCH 2/2] testing version --- .idea/compiler.xml | 2 +- .idea/gradle.xml | 1 + .idea/misc.xml | 3 ++- appium-tests/build.gradle.kts | 15 +++++---------- .../src/test/kotlin/appium/SimpleAppiumTest.kt | 14 +++++++------- appium/build.gradle.kts | 7 +------ .../main/kotlin/convention.application.gradle.kts | 2 +- .../kotlin/convention.kotlin-android.gradle.kts | 13 +++++++++++++ .../src/main/kotlin/convention.kotlin.gradle.kts | 2 +- .../src/main/kotlin/convention.library.gradle.kts | 6 ------ gradle/libs.versions.toml | 2 +- 11 files changed, 33 insertions(+), 34 deletions(-) create mode 100644 buildSrc/src/main/kotlin/convention.kotlin-android.gradle.kts diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 6bff30cc..c751bd1b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 46b553dc..4604aa3f 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -22,6 +22,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 25308214..0ad17cbd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,7 @@ + - + diff --git a/appium-tests/build.gradle.kts b/appium-tests/build.gradle.kts index eadafd01..8224751e 100644 --- a/appium-tests/build.gradle.kts +++ b/appium-tests/build.gradle.kts @@ -1,15 +1,10 @@ plugins { - kotlin("jvm") -} - -kotlin { - jvmToolchain(17) + id("convention.library") } dependencies { - testImplementation(kotlin("test")) - testImplementation("junit:junit:4.13.2") - testImplementation("io.appium:kotlin-client:9.0.0") - testImplementation(project(":appium")) -} \ No newline at end of file + testImplementation(kotlin("test")) + testImplementation(libs.junit.junit) + testImplementation(libs.java.client) +} diff --git a/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt b/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt index 49c9a7bb..d4433d96 100644 --- a/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt +++ b/appium-tests/src/test/kotlin/appium/SimpleAppiumTest.kt @@ -11,17 +11,17 @@ import org.openqa.selenium.remote.DesiredCapabilities import java.net.URL class SimpleAppiumTest { - private lateinit var driver: AppiumDriver + private var driver: AppiumDriver? = null @Before fun setUp() { val caps = DesiredCapabilities().apply { setCapability("platformName", "Android") - setCapability("deviceName", "emulator-5554") - setCapability("automationName", "UiAutomator2") - setCapability("appPackage", "io.github.kakaocup.sample") - setCapability("appActivity", "io.github.kakaocup.sample.MainActivity") - setCapability("noReset", true) + setCapability("appium:deviceName", "emulator-5554") + setCapability("appium:automationName", "UiAutomator2") + setCapability("appium:appPackage", "io.github.kakaocup.appium.sample") + setCapability("appium:appActivity", "io.github.kakaocup.appium.sample.MainActivity") + setCapability("appium:noReset", true) } driver = AndroidDriver(URL("http://127.0.0.1:4723"), caps) @@ -38,6 +38,6 @@ class SimpleAppiumTest { @After fun tearDown() { - driver.quit() + driver?.quit() } } \ No newline at end of file diff --git a/appium/build.gradle.kts b/appium/build.gradle.kts index dd425005..7df3b408 100644 --- a/appium/build.gradle.kts +++ b/appium/build.gradle.kts @@ -3,15 +3,10 @@ plugins { id("convention.publishing") } -android { - namespace = "io.github.kakaocup.appium" -} - dependencies { - implementation(libs.androidx.test.ext.junit) - implementation(libs.java.client) implementation(libs.selenium.java) + implementation(libs.junit.junit) implementation(kotlin("test")) } diff --git a/buildSrc/src/main/kotlin/convention.application.gradle.kts b/buildSrc/src/main/kotlin/convention.application.gradle.kts index 6751c331..1d079d50 100644 --- a/buildSrc/src/main/kotlin/convention.application.gradle.kts +++ b/buildSrc/src/main/kotlin/convention.application.gradle.kts @@ -4,7 +4,7 @@ import io.github.kakaocup.withVersionCatalog plugins { id("com.android.application") id("convention.android-base") - id("convention.kotlin") + id("convention.kotlin-android") } withVersionCatalog { libs -> diff --git a/buildSrc/src/main/kotlin/convention.kotlin-android.gradle.kts b/buildSrc/src/main/kotlin/convention.kotlin-android.gradle.kts new file mode 100644 index 00000000..2274d492 --- /dev/null +++ b/buildSrc/src/main/kotlin/convention.kotlin-android.gradle.kts @@ -0,0 +1,13 @@ +import io.github.kakaocup.withVersionCatalog +import org.gradle.kotlin.dsl.kotlin +import kotlin.text.toInt + +plugins { + kotlin("android") +} + +withVersionCatalog { libs -> + kotlin { + jvmToolchain(libs.versions.jvmVersion.get().toInt()) + } +} diff --git a/buildSrc/src/main/kotlin/convention.kotlin.gradle.kts b/buildSrc/src/main/kotlin/convention.kotlin.gradle.kts index 135b5016..985eb17b 100644 --- a/buildSrc/src/main/kotlin/convention.kotlin.gradle.kts +++ b/buildSrc/src/main/kotlin/convention.kotlin.gradle.kts @@ -1,7 +1,7 @@ import io.github.kakaocup.withVersionCatalog plugins { - kotlin("android") + kotlin("jvm") } withVersionCatalog { libs -> diff --git a/buildSrc/src/main/kotlin/convention.library.gradle.kts b/buildSrc/src/main/kotlin/convention.library.gradle.kts index 61134b62..c177df89 100644 --- a/buildSrc/src/main/kotlin/convention.library.gradle.kts +++ b/buildSrc/src/main/kotlin/convention.library.gradle.kts @@ -1,9 +1,3 @@ plugins { - id("com.android.library") - id("convention.android-base") id("convention.kotlin") } - -kotlin { - jvmToolchain(8) -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f257e0c7..3bd93be0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ compileSdk = "36" seleniumJavaVersion = "4.39.0" targetSdk = "36" minSdk = "21" -jvmVersion = "8" +jvmVersion = "17" dokkaVersion = "1.9.20" appcompatVersion = "1.7.1"