From c4333b7071dea2378f437da6d3ba89e157cfd8a4 Mon Sep 17 00:00:00 2001 From: Sergey Sova Date: Thu, 6 Jun 2024 22:13:20 +0400 Subject: [PATCH] Add all docs from effector v23 --- .github/workflows/deploy.yml | 42 + .gitignore | 22 + .prettierignore | 4 + .prettierrc | 21 + AUTHORS | 140 + README.md | 44 + astro.config.ts | 56 + package.json | 68 + pagefind.yml | 4 + plugins/admonitions.ts | 53 + plugins/remark-fallback-lang.ts | 80 + pnpm-lock.yaml | 6814 +++++++++++++++++ postcss.config.cjs | 3 + public/.nojekyll | 0 public/CNAME | 1 + public/banner.png | Bin 0 -> 94627 bytes public/external.svg | 16 + public/favicon.ico | Bin 0 -> 15086 bytes public/favicon.svg | 228 + public/fonts/LexendDeca-Light.ttf | Bin 0 -> 78200 bytes public/fonts/LexendDeca-Regular.ttf | Bin 0 -> 67740 bytes public/fonts/LexendDeca-Regular.woff2 | Bin 0 -> 57576 bytes public/images/sample-visualization.gif | Bin 0 -> 52426 bytes public/logo/automationhero.svg | 50 + public/logo/aviasales.dark.svg | 1 + public/logo/aviasales.png | Bin 0 -> 12445 bytes public/logo/avito.svg | 38 + public/logo/codengage.png | Bin 0 -> 3826 bytes public/logo/docsvision.png | Bin 0 -> 9721 bytes public/logo/express24.svg | 95 + public/logo/foxford.svg | 1 + public/logo/globalCtoForum.png | Bin 0 -> 18847 bytes public/logo/healthSamurai.svg | 28 + public/logo/intouchHealth.png | Bin 0 -> 22384 bytes public/logo/joom.svg | 1 + public/logo/junto.png | Bin 0 -> 7450 bytes public/logo/lunatask.png | Bin 0 -> 9674 bytes public/logo/mts.svg | 11 + public/logo/okoo.png | Bin 0 -> 17071 bytes public/logo/radity.png | Bin 0 -> 13424 bytes public/logo/raiffeisen.svg | 19 + public/logo/redmadrobot.png | Bin 0 -> 2654 bytes public/logo/sber.png | Bin 0 -> 62737 bytes public/logo/semrush.png | Bin 0 -> 85496 bytes public/logo/smartomato.svg | 9 + public/logo/space307.svg | 8 + public/logo/stellarX.svg | 3 + public/logo/stmLabs.png | Bin 0 -> 30314 bytes public/logo/tenpixls.png | Bin 0 -> 22817 bytes public/logo/travelpayouts.svg | 19 + public/logo/unicef.svg | 88 + public/logo/uptarget.png | Bin 0 -> 30474 bytes public/logo/vk.svg | 4 + public/make-scrollable-code-focusable.js | 3 + src/components/DropDownMenu.astro | 208 + src/components/FeatureCard.astro | 37 + src/components/Footer/Footer.astro | 92 + src/components/HeadCommon.astro | 47 + src/components/HeadSEO.astro | 48 + src/components/Header/EffectorLogo.astro | 8 + src/components/Header/Header.astro | 282 + src/components/Header/MobileMenuButton.astro | 73 + src/components/Header/Search.astro | 368 + src/components/Header/SkipToContent.astro | 29 + src/components/Header/ThemeToggleButton.css | 30 + src/components/Header/ThemeToggleButton.tsx | 121 + src/components/Landing/Companies.astro | 221 + src/components/Landing/Feature.astro | 59 + src/components/Landing/FeaturesGrid.astro | 14 + src/components/Landing/Hero.astro | 110 + src/components/Landing/Stats.astro | 257 + src/components/LeftSidebar/LeftSidebar.astro | 160 + src/components/LiveDemo.jsx | 23 + src/components/MobileNavigation.astro | 117 + src/components/NestedLinks.astro | 201 + src/components/NotTranslatedYet.astro | 29 + src/components/PageContent/Announcement.astro | 50 + src/components/PageContent/Contributors.astro | 208 + src/components/PageContent/PageContent.astro | 182 + src/components/RightSidebar/MoreMenu.astro | 61 + .../RightSidebar/RightSidebar.astro | 42 + .../RightSidebar/TableOfContents.module.css | 108 + .../RightSidebar/TableOfContents.tsx | 119 + src/components/TranslationDisclaimer.astro | 21 + src/consts.ts | 97 + src/content/config.ts | 23 + src/content/docs/en/FAQ.md | 12 + .../docs/en/api/effector-react/Gate.md | 92 + .../docs/en/api/effector-react/Provider.md | 86 + .../docs/en/api/effector-react/connect.md | 52 + .../en/api/effector-react/createComponent.md | 57 + .../docs/en/api/effector-react/createGate.md | 84 + .../api/effector-react/createStoreConsumer.md | 46 + .../docs/en/api/effector-react/index.md | 39 + .../en/api/effector-react/module/scope.md | 103 + .../effector-react/module/\321\201ompat.md" | 94 + .../docs/en/api/effector-react/useEvent.md | 128 + .../docs/en/api/effector-react/useGate.md | 57 + .../docs/en/api/effector-react/useList.md | 225 + .../en/api/effector-react/useProvidedScope.md | 47 + .../docs/en/api/effector-react/useStore.md | 64 + .../docs/en/api/effector-react/useStoreMap.md | 140 + .../docs/en/api/effector-react/useUnit.md | 192 + .../docs/en/api/effector-solid/Gate.md | 55 + .../docs/en/api/effector-solid/createGate.md | 77 + .../docs/en/api/effector-solid/index.md | 25 + .../en/api/effector-solid/module/scope.md | 64 + .../docs/en/api/effector-solid/useGate.md | 58 + .../docs/en/api/effector-solid/useStoreMap.md | 117 + .../docs/en/api/effector-solid/useUnit.md | 175 + .../en/api/effector-vue/ComponentOptions.md | 63 + .../api/effector-vue/EffectorScopePlugin.md | 34 + src/content/docs/en/api/effector-vue/Gate.md | 52 + .../docs/en/api/effector-vue/VueEffector.md | 36 + .../docs/en/api/effector-vue/VueSSRPlugin.md | 41 + .../en/api/effector-vue/createComponent.md | 49 + .../docs/en/api/effector-vue/createGate.md | 80 + src/content/docs/en/api/effector-vue/index.md | 38 + .../en/api/effector-vue/module/composition.md | 17 + .../docs/en/api/effector-vue/module/ssr.md | 19 + .../docs/en/api/effector-vue/useEvent.md | 54 + .../docs/en/api/effector-vue/useGate.md | 30 + .../docs/en/api/effector-vue/useStore.md | 49 + .../docs/en/api/effector-vue/useStoreMap.md | 130 + .../docs/en/api/effector-vue/useUnit.md | 150 + .../docs/en/api/effector-vue/useVModel.md | 108 + src/content/docs/en/api/effector/Domain.md | 299 + src/content/docs/en/api/effector/Effect.md | 583 ++ src/content/docs/en/api/effector/Event.md | 893 +++ src/content/docs/en/api/effector/Scope.md | 102 + src/content/docs/en/api/effector/Store.md | 325 + .../docs/en/api/effector/allSettled.md | 92 + src/content/docs/en/api/effector/attach.md | 620 ++ .../docs/en/api/effector/babel-plugin.md | 370 + src/content/docs/en/api/effector/clearNode.md | 84 + src/content/docs/en/api/effector/combine.mdx | 167 + src/content/docs/en/api/effector/createApi.md | 57 + .../docs/en/api/effector/createDomain.md | 47 + .../docs/en/api/effector/createEffect.md | 187 + .../docs/en/api/effector/createEvent.md | 95 + .../docs/en/api/effector/createStore.md | 265 + .../docs/en/api/effector/createWatch.md | 68 + .../effector/demo/_combine-array-fn.live.js | 11 + .../demo/_combine-non-stores-fn.live.js | 22 + .../effector/demo/_combine-object-fn.live.js | 11 + .../effector/demo/_combine-stores-fn.live.js | 13 + src/content/docs/en/api/effector/fork.md | 233 + src/content/docs/en/api/effector/forward.md | 112 + .../docs/en/api/effector/fromObservable.md | 47 + src/content/docs/en/api/effector/guard.md | 176 + src/content/docs/en/api/effector/hydrate.md | 56 + src/content/docs/en/api/effector/index.md | 69 + src/content/docs/en/api/effector/inspect.md | 190 + src/content/docs/en/api/effector/is.md | 382 + src/content/docs/en/api/effector/launch.md | 53 + src/content/docs/en/api/effector/merge.md | 103 + .../en/api/effector/module/babel-plugin.md | 10 + .../docs/en/api/effector/module/inspect.md | 14 + .../en/api/effector/module/\321\201ompat.md" | 100 + src/content/docs/en/api/effector/restore.md | 136 + src/content/docs/en/api/effector/sample.md | 498 ++ src/content/docs/en/api/effector/scopeBind.md | 115 + src/content/docs/en/api/effector/serialize.md | 107 + src/content/docs/en/api/effector/split.md | 398 + .../docs/en/api/effector/withRegion.md | 62 + src/content/docs/en/api/index.mdx | 49 + src/content/docs/en/conventions/naming.md | 41 + .../docs/en/core-principles/own-your-data.md | 11 + .../docs/en/core-principles/releases.md | 26 + .../docs/en/core-principles/testing.md | 13 + .../docs/en/core-principles/typings.md | 17 + .../unit-shape-protocol.md | 69 + .../en/explanation/computation-priority.md | 70 + src/content/docs/en/explanation/events.md | 183 + src/content/docs/en/explanation/glossary.md | 162 + src/content/docs/en/explanation/prior-art.md | 33 + src/content/docs/en/explanation/sids.md | 322 + .../docs/en/guides/migration-guide-v23.md | 115 + .../docs/en/guides/server-side-rendering.md | 311 + src/content/docs/en/guides/testing.md | 147 + src/content/docs/en/introduction/community.md | 177 + .../docs/en/introduction/core-concepts.md | 80 + src/content/docs/en/introduction/ecosystem.md | 61 + src/content/docs/en/introduction/examples.md | 62 + .../docs/en/introduction/installation.md | 123 + .../docs/en/introduction/motivation.md | 31 + .../docs/en/recipes/common/countdown.md | 81 + src/content/docs/en/recipes/index.md | 9 + .../docs/en/recipes/nextjs/integrate.md | 7 + src/content/docs/en/recipes/nextjs/router.md | 74 + .../docs/en/recipes/nextjs/scope-bind.md | 50 + .../react-native/asyncstorage-counter.md | 111 + src/content/docs/en/recipes/react/counter.md | 43 + .../en/recipes/react/dynamic-form-schema.md | 413 + src/content/docs/en/recipes/react/effects.md | 49 + src/content/docs/en/recipes/react/forms.md | 208 + src/content/docs/en/recipes/react/gate.md | 78 + src/content/docs/en/recipes/react/slots.md | 130 + .../docs/en/recipes/react/todo-creator.md | 95 + .../en/recipes/react/todo-with-validation.md | 94 + .../docs/en/typescript/typing-effector.md | 217 + .../typescript/usage-with-effector-react.md | 642 ++ .../docs/en/typescript/utility-types.md | 126 + .../docs/ru/api/effector-react/index.md | 26 + .../docs/ru/api/effector-react/useEvent.md | 184 + .../docs/ru/api/effector-react/useList.md | 224 + .../ru/api/effector-react/useProvidedScope.md | 32 + .../docs/ru/api/effector-react/useStore.md | 46 + .../docs/ru/api/effector-react/useStoreMap.md | 113 + .../docs/ru/api/effector-react/useUnit.md | 146 + src/content/docs/ru/api/effector/Effect.md | 625 ++ src/content/docs/ru/api/effector/Event.md | 407 + src/content/docs/ru/api/effector/Scope.md | 104 + src/content/docs/ru/api/effector/Store.md | 685 ++ .../docs/ru/api/effector/babel-plugin.md | 248 + src/content/docs/ru/api/effector/clearNode.md | 76 + src/content/docs/ru/api/effector/combine.md | 279 + src/content/docs/ru/api/effector/createApi.md | 74 + .../docs/ru/api/effector/createEffect.md | 177 + .../docs/ru/api/effector/createEvent.md | 74 + .../docs/ru/api/effector/createStore.md | 117 + .../docs/ru/api/effector/createWatch.md | 55 + src/content/docs/ru/api/effector/forward.md | 127 + .../docs/ru/api/effector/fromObservable.md | 37 + src/content/docs/ru/api/effector/guard.md | 195 + src/content/docs/ru/api/effector/index.md | 61 + src/content/docs/ru/api/effector/is.md | 326 + src/content/docs/ru/api/effector/launch.md | 22 + src/content/docs/ru/api/effector/merge.md | 97 + src/content/docs/ru/api/effector/sample.md | 371 + src/content/docs/ru/api/effector/scopeBind.md | 38 + src/content/docs/ru/api/index.mdx | 48 + src/content/docs/ru/explanation/glossary.md | 144 + src/content/docs/ru/explanation/prior-art.md | 28 + src/content/docs/ru/introduction/ecosystem.md | 34 + src/content/docs/ru/introduction/examples.md | 10 + .../docs/ru/introduction/installation.md | 122 + src/content/docs/ru/recipes/index.md | 8 + .../docs/ru/typescript/typing-effector.md | 173 + .../docs/ru/typescript/utility-types.md | 124 + src/docs.ts | 51 + src/env.d.ts | 16 + src/icons/Chevron.astro | 21 + src/icons/Copy.astro | 26 + src/icons/Discord.astro | 12 + src/icons/DiscordLined.astro | 28 + src/icons/Dots.astro | 16 + src/icons/EditPencil.astro | 21 + src/icons/Effector.astro | 382 + src/icons/External.astro | 15 + src/icons/Github.astro | 10 + src/icons/Language.astro | 18 + src/icons/Menu.astro | 27 + src/icons/React.astro | 21 + src/icons/Solid.astro | 52 + src/icons/Twitter.astro | 12 + src/icons/Vue.astro | 10 + src/icons/Youtube.astro | 15 + src/languages.ts | 243 + src/layouts/CommonLayout.astro | 42 + src/layouts/Landing.astro | 28 + src/layouts/MainLayout.astro | 173 + src/navigation.ts | 1004 +++ src/pages/[...slug].astro | 62 + src/pages/[lang]/[...slug].astro | 68 + src/pages/en.astro | 1 + src/pages/index.astro | 81 + src/pages/ru.astro | 79 + src/pages/uz.astro | 80 + src/styles/index.css | 577 ++ src/styles/language.css | 102 + src/styles/theme.css | 226 + tailwind.config.cjs | 8 + tsconfig.json | 13 + 274 files changed, 35357 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 AUTHORS create mode 100644 README.md create mode 100644 astro.config.ts create mode 100644 package.json create mode 100644 pagefind.yml create mode 100644 plugins/admonitions.ts create mode 100644 plugins/remark-fallback-lang.ts create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.cjs create mode 100644 public/.nojekyll create mode 100644 public/CNAME create mode 100644 public/banner.png create mode 100644 public/external.svg create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/fonts/LexendDeca-Light.ttf create mode 100644 public/fonts/LexendDeca-Regular.ttf create mode 100644 public/fonts/LexendDeca-Regular.woff2 create mode 100644 public/images/sample-visualization.gif create mode 100644 public/logo/automationhero.svg create mode 100644 public/logo/aviasales.dark.svg create mode 100644 public/logo/aviasales.png create mode 100644 public/logo/avito.svg create mode 100644 public/logo/codengage.png create mode 100644 public/logo/docsvision.png create mode 100644 public/logo/express24.svg create mode 100644 public/logo/foxford.svg create mode 100644 public/logo/globalCtoForum.png create mode 100644 public/logo/healthSamurai.svg create mode 100644 public/logo/intouchHealth.png create mode 100644 public/logo/joom.svg create mode 100644 public/logo/junto.png create mode 100644 public/logo/lunatask.png create mode 100644 public/logo/mts.svg create mode 100644 public/logo/okoo.png create mode 100644 public/logo/radity.png create mode 100644 public/logo/raiffeisen.svg create mode 100644 public/logo/redmadrobot.png create mode 100644 public/logo/sber.png create mode 100644 public/logo/semrush.png create mode 100644 public/logo/smartomato.svg create mode 100644 public/logo/space307.svg create mode 100644 public/logo/stellarX.svg create mode 100644 public/logo/stmLabs.png create mode 100644 public/logo/tenpixls.png create mode 100644 public/logo/travelpayouts.svg create mode 100644 public/logo/unicef.svg create mode 100644 public/logo/uptarget.png create mode 100644 public/logo/vk.svg create mode 100644 public/make-scrollable-code-focusable.js create mode 100644 src/components/DropDownMenu.astro create mode 100644 src/components/FeatureCard.astro create mode 100644 src/components/Footer/Footer.astro create mode 100644 src/components/HeadCommon.astro create mode 100644 src/components/HeadSEO.astro create mode 100644 src/components/Header/EffectorLogo.astro create mode 100644 src/components/Header/Header.astro create mode 100644 src/components/Header/MobileMenuButton.astro create mode 100644 src/components/Header/Search.astro create mode 100644 src/components/Header/SkipToContent.astro create mode 100644 src/components/Header/ThemeToggleButton.css create mode 100644 src/components/Header/ThemeToggleButton.tsx create mode 100644 src/components/Landing/Companies.astro create mode 100644 src/components/Landing/Feature.astro create mode 100644 src/components/Landing/FeaturesGrid.astro create mode 100644 src/components/Landing/Hero.astro create mode 100644 src/components/Landing/Stats.astro create mode 100644 src/components/LeftSidebar/LeftSidebar.astro create mode 100644 src/components/LiveDemo.jsx create mode 100644 src/components/MobileNavigation.astro create mode 100644 src/components/NestedLinks.astro create mode 100644 src/components/NotTranslatedYet.astro create mode 100644 src/components/PageContent/Announcement.astro create mode 100644 src/components/PageContent/Contributors.astro create mode 100644 src/components/PageContent/PageContent.astro create mode 100644 src/components/RightSidebar/MoreMenu.astro create mode 100644 src/components/RightSidebar/RightSidebar.astro create mode 100644 src/components/RightSidebar/TableOfContents.module.css create mode 100644 src/components/RightSidebar/TableOfContents.tsx create mode 100644 src/components/TranslationDisclaimer.astro create mode 100644 src/consts.ts create mode 100644 src/content/config.ts create mode 100644 src/content/docs/en/FAQ.md create mode 100644 src/content/docs/en/api/effector-react/Gate.md create mode 100644 src/content/docs/en/api/effector-react/Provider.md create mode 100644 src/content/docs/en/api/effector-react/connect.md create mode 100644 src/content/docs/en/api/effector-react/createComponent.md create mode 100644 src/content/docs/en/api/effector-react/createGate.md create mode 100644 src/content/docs/en/api/effector-react/createStoreConsumer.md create mode 100644 src/content/docs/en/api/effector-react/index.md create mode 100644 src/content/docs/en/api/effector-react/module/scope.md create mode 100644 "src/content/docs/en/api/effector-react/module/\321\201ompat.md" create mode 100644 src/content/docs/en/api/effector-react/useEvent.md create mode 100644 src/content/docs/en/api/effector-react/useGate.md create mode 100644 src/content/docs/en/api/effector-react/useList.md create mode 100644 src/content/docs/en/api/effector-react/useProvidedScope.md create mode 100644 src/content/docs/en/api/effector-react/useStore.md create mode 100644 src/content/docs/en/api/effector-react/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-react/useUnit.md create mode 100644 src/content/docs/en/api/effector-solid/Gate.md create mode 100644 src/content/docs/en/api/effector-solid/createGate.md create mode 100644 src/content/docs/en/api/effector-solid/index.md create mode 100644 src/content/docs/en/api/effector-solid/module/scope.md create mode 100644 src/content/docs/en/api/effector-solid/useGate.md create mode 100644 src/content/docs/en/api/effector-solid/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-solid/useUnit.md create mode 100644 src/content/docs/en/api/effector-vue/ComponentOptions.md create mode 100644 src/content/docs/en/api/effector-vue/EffectorScopePlugin.md create mode 100644 src/content/docs/en/api/effector-vue/Gate.md create mode 100644 src/content/docs/en/api/effector-vue/VueEffector.md create mode 100644 src/content/docs/en/api/effector-vue/VueSSRPlugin.md create mode 100644 src/content/docs/en/api/effector-vue/createComponent.md create mode 100644 src/content/docs/en/api/effector-vue/createGate.md create mode 100644 src/content/docs/en/api/effector-vue/index.md create mode 100644 src/content/docs/en/api/effector-vue/module/composition.md create mode 100644 src/content/docs/en/api/effector-vue/module/ssr.md create mode 100644 src/content/docs/en/api/effector-vue/useEvent.md create mode 100644 src/content/docs/en/api/effector-vue/useGate.md create mode 100644 src/content/docs/en/api/effector-vue/useStore.md create mode 100644 src/content/docs/en/api/effector-vue/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-vue/useUnit.md create mode 100644 src/content/docs/en/api/effector-vue/useVModel.md create mode 100644 src/content/docs/en/api/effector/Domain.md create mode 100644 src/content/docs/en/api/effector/Effect.md create mode 100644 src/content/docs/en/api/effector/Event.md create mode 100644 src/content/docs/en/api/effector/Scope.md create mode 100644 src/content/docs/en/api/effector/Store.md create mode 100644 src/content/docs/en/api/effector/allSettled.md create mode 100644 src/content/docs/en/api/effector/attach.md create mode 100644 src/content/docs/en/api/effector/babel-plugin.md create mode 100644 src/content/docs/en/api/effector/clearNode.md create mode 100644 src/content/docs/en/api/effector/combine.mdx create mode 100644 src/content/docs/en/api/effector/createApi.md create mode 100644 src/content/docs/en/api/effector/createDomain.md create mode 100644 src/content/docs/en/api/effector/createEffect.md create mode 100644 src/content/docs/en/api/effector/createEvent.md create mode 100644 src/content/docs/en/api/effector/createStore.md create mode 100644 src/content/docs/en/api/effector/createWatch.md create mode 100644 src/content/docs/en/api/effector/demo/_combine-array-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-object-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js create mode 100644 src/content/docs/en/api/effector/fork.md create mode 100644 src/content/docs/en/api/effector/forward.md create mode 100644 src/content/docs/en/api/effector/fromObservable.md create mode 100644 src/content/docs/en/api/effector/guard.md create mode 100644 src/content/docs/en/api/effector/hydrate.md create mode 100644 src/content/docs/en/api/effector/index.md create mode 100644 src/content/docs/en/api/effector/inspect.md create mode 100644 src/content/docs/en/api/effector/is.md create mode 100644 src/content/docs/en/api/effector/launch.md create mode 100644 src/content/docs/en/api/effector/merge.md create mode 100644 src/content/docs/en/api/effector/module/babel-plugin.md create mode 100644 src/content/docs/en/api/effector/module/inspect.md create mode 100644 "src/content/docs/en/api/effector/module/\321\201ompat.md" create mode 100644 src/content/docs/en/api/effector/restore.md create mode 100644 src/content/docs/en/api/effector/sample.md create mode 100644 src/content/docs/en/api/effector/scopeBind.md create mode 100644 src/content/docs/en/api/effector/serialize.md create mode 100644 src/content/docs/en/api/effector/split.md create mode 100644 src/content/docs/en/api/effector/withRegion.md create mode 100644 src/content/docs/en/api/index.mdx create mode 100644 src/content/docs/en/conventions/naming.md create mode 100644 src/content/docs/en/core-principles/own-your-data.md create mode 100644 src/content/docs/en/core-principles/releases.md create mode 100644 src/content/docs/en/core-principles/testing.md create mode 100644 src/content/docs/en/core-principles/typings.md create mode 100644 src/content/docs/en/ecosystem-development/unit-shape-protocol.md create mode 100644 src/content/docs/en/explanation/computation-priority.md create mode 100644 src/content/docs/en/explanation/events.md create mode 100644 src/content/docs/en/explanation/glossary.md create mode 100644 src/content/docs/en/explanation/prior-art.md create mode 100644 src/content/docs/en/explanation/sids.md create mode 100644 src/content/docs/en/guides/migration-guide-v23.md create mode 100644 src/content/docs/en/guides/server-side-rendering.md create mode 100644 src/content/docs/en/guides/testing.md create mode 100644 src/content/docs/en/introduction/community.md create mode 100644 src/content/docs/en/introduction/core-concepts.md create mode 100644 src/content/docs/en/introduction/ecosystem.md create mode 100644 src/content/docs/en/introduction/examples.md create mode 100644 src/content/docs/en/introduction/installation.md create mode 100644 src/content/docs/en/introduction/motivation.md create mode 100644 src/content/docs/en/recipes/common/countdown.md create mode 100644 src/content/docs/en/recipes/index.md create mode 100644 src/content/docs/en/recipes/nextjs/integrate.md create mode 100644 src/content/docs/en/recipes/nextjs/router.md create mode 100644 src/content/docs/en/recipes/nextjs/scope-bind.md create mode 100644 src/content/docs/en/recipes/react-native/asyncstorage-counter.md create mode 100644 src/content/docs/en/recipes/react/counter.md create mode 100644 src/content/docs/en/recipes/react/dynamic-form-schema.md create mode 100644 src/content/docs/en/recipes/react/effects.md create mode 100644 src/content/docs/en/recipes/react/forms.md create mode 100644 src/content/docs/en/recipes/react/gate.md create mode 100644 src/content/docs/en/recipes/react/slots.md create mode 100644 src/content/docs/en/recipes/react/todo-creator.md create mode 100644 src/content/docs/en/recipes/react/todo-with-validation.md create mode 100644 src/content/docs/en/typescript/typing-effector.md create mode 100644 src/content/docs/en/typescript/usage-with-effector-react.md create mode 100644 src/content/docs/en/typescript/utility-types.md create mode 100644 src/content/docs/ru/api/effector-react/index.md create mode 100644 src/content/docs/ru/api/effector-react/useEvent.md create mode 100644 src/content/docs/ru/api/effector-react/useList.md create mode 100644 src/content/docs/ru/api/effector-react/useProvidedScope.md create mode 100644 src/content/docs/ru/api/effector-react/useStore.md create mode 100644 src/content/docs/ru/api/effector-react/useStoreMap.md create mode 100644 src/content/docs/ru/api/effector-react/useUnit.md create mode 100644 src/content/docs/ru/api/effector/Effect.md create mode 100644 src/content/docs/ru/api/effector/Event.md create mode 100644 src/content/docs/ru/api/effector/Scope.md create mode 100644 src/content/docs/ru/api/effector/Store.md create mode 100644 src/content/docs/ru/api/effector/babel-plugin.md create mode 100644 src/content/docs/ru/api/effector/clearNode.md create mode 100644 src/content/docs/ru/api/effector/combine.md create mode 100644 src/content/docs/ru/api/effector/createApi.md create mode 100644 src/content/docs/ru/api/effector/createEffect.md create mode 100644 src/content/docs/ru/api/effector/createEvent.md create mode 100644 src/content/docs/ru/api/effector/createStore.md create mode 100644 src/content/docs/ru/api/effector/createWatch.md create mode 100644 src/content/docs/ru/api/effector/forward.md create mode 100644 src/content/docs/ru/api/effector/fromObservable.md create mode 100644 src/content/docs/ru/api/effector/guard.md create mode 100644 src/content/docs/ru/api/effector/index.md create mode 100644 src/content/docs/ru/api/effector/is.md create mode 100644 src/content/docs/ru/api/effector/launch.md create mode 100644 src/content/docs/ru/api/effector/merge.md create mode 100644 src/content/docs/ru/api/effector/sample.md create mode 100644 src/content/docs/ru/api/effector/scopeBind.md create mode 100644 src/content/docs/ru/api/index.mdx create mode 100644 src/content/docs/ru/explanation/glossary.md create mode 100644 src/content/docs/ru/explanation/prior-art.md create mode 100644 src/content/docs/ru/introduction/ecosystem.md create mode 100644 src/content/docs/ru/introduction/examples.md create mode 100644 src/content/docs/ru/introduction/installation.md create mode 100644 src/content/docs/ru/recipes/index.md create mode 100644 src/content/docs/ru/typescript/typing-effector.md create mode 100644 src/content/docs/ru/typescript/utility-types.md create mode 100644 src/docs.ts create mode 100644 src/env.d.ts create mode 100644 src/icons/Chevron.astro create mode 100644 src/icons/Copy.astro create mode 100644 src/icons/Discord.astro create mode 100644 src/icons/DiscordLined.astro create mode 100644 src/icons/Dots.astro create mode 100644 src/icons/EditPencil.astro create mode 100644 src/icons/Effector.astro create mode 100644 src/icons/External.astro create mode 100644 src/icons/Github.astro create mode 100644 src/icons/Language.astro create mode 100644 src/icons/Menu.astro create mode 100644 src/icons/React.astro create mode 100644 src/icons/Solid.astro create mode 100644 src/icons/Twitter.astro create mode 100644 src/icons/Vue.astro create mode 100644 src/icons/Youtube.astro create mode 100644 src/languages.ts create mode 100644 src/layouts/CommonLayout.astro create mode 100644 src/layouts/Landing.astro create mode 100644 src/layouts/MainLayout.astro create mode 100644 src/navigation.ts create mode 100644 src/pages/[...slug].astro create mode 100644 src/pages/[lang]/[...slug].astro create mode 100644 src/pages/en.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/ru.astro create mode 100644 src/pages/uz.astro create mode 100644 src/styles/index.css create mode 100644 src/styles/language.css create mode 100644 src/styles/theme.css create mode 100644 tailwind.config.cjs create mode 100644 tsconfig.json diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..dcdbcf8 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,42 @@ +name: Github Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: write + id-token: write + pages: write + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - name: 🛎️ Checkout + uses: actions/checkout@v4 + + - name: 🐧 Use Node.js v20.x + uses: actions/setup-node@v4 + with: + node-version: v20.x + cache: "pnpm" + + - run: corepack enable + - run: pnpm install + - run: pnpm build + - run: pnpm search:build + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: "./build" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f5e086 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store +.idea diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1f6a343 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist +node_modules +.astro +.vscode diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..fbd1886 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,21 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": false, + "printWidth": 100, + "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-attributes"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro", + "plugins": [ + "prettier-plugin-tailwindcss", + "prettier-plugin-astro", + "prettier-plugin-organize-attributes" + ] + } + } + ] +} diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..97c5773 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,140 @@ +Zero Bias +andretshurotshka +Dmitry Boldyrev +Sergey Sova +Alexander Khoroshikh <32790736+AlexandrHoroshih@users.noreply.github.com> +popuguytheparrot +github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> +Igor Kamyshev +Sova <5620073+sergeysova@users.noreply.github.com> +AlexandrHoroshih +Valery Kobzar +doasync +Egor Guscha +Illia Osmanov (iosmanov) +mg901 +Yan +Igor Ryzhov +Illia Osmanov +Arthur Irgashev +bloadvenro +YanLobat +Ilya <10588170+Komar0ff@users.noreply.github.com> +Kirill Mironov +Ainur Sharaev +Arutyunyan Artyom +drevoed +Nikita Nafranets +dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +popuguy <19804652+popuguytheparrot@users.noreply.github.com> +Aleksandr Osipov +Andrew Gopienko +bakugod <47696795+bakugod@users.noreply.github.com> +Victor Didenko +sterios_sav +Dmitrij Shuleshov <3arabotaet@gmail.com> +Viktor Pasynok +zukhrik +Mika Andrianarijaona +SLy +Spoki4 +uulaal +Antropov Andrey +Bohdan Petrov +Egor Aristov +sergey20x25 +Ainur <33234903+ainursharaev@users.noreply.github.com> +Alexander Belov <16794134+belovweb@users.noreply.github.com> +Anton Kosykh +Anton Yurovskykh <11337124+yurovant@users.noreply.github.com> +Arsen-95 <83858217+Arsen-95@users.noreply.github.com> +Denis Sikuler +Kirill <79372250+bybbsy@users.noreply.github.com> +Komar0ff +Maxim Sidorov +Renat Sagdeev +Samir +Sozonov +Stanislav +Tauyekel Kunzhol +Victor +Vladimir Ivakin +aldibatyr@gmail.com <47831819+aldibatyr@users.noreply.github.com> +allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> +cqh +ivanov-v +xaota <1172619+xaota@users.noreply.github.com> +☃︎ +0xflotus <0xflotus@gmail.com> +45m0d3u5 +7iomka <7iomka@gmail.com> +Abel Siqueira +Aleksandr Grigorii <42298502+domosedov@users.noreply.github.com> +Aleksei Arro +Aleksei Pudnikov +Alex Anokhin +Alexander Mikhaylov +Alexandrsv +Andrew Laiff +Artsiom Rymarchyk +DecliningLotus +Denis Maushov +Denis Skiba +Dmitry Dudin +Ed Prince +Egor Gorbachev +Gabriel Husek +Ilya Martynov <84752977+Ilmar7786@users.noreply.github.com> +Infant Frontender <34810942+newbornfrontender@users.noreply.github.com> +Ivan Oshchepkov +Jan Keromnes +Jesse Jackson +Joel Bandi +Kireev Mikhail <29187880+kireevmp@users.noreply.github.com> +Kirill Tyurin +Kurzdor +Lebedev Konstantin +Leniorko +Ludovic Dem +MiiZZo +Mike Cann +Oleg <64708593+olejech@users.noreply.github.com> +Oleh +Pasha Grekovich +Pavel Tereschenko +Rachael Dawn +Rafael Fakhreev +Raman Aktsisiuk +Robert Kuzhin <82271383+raidenmiro@users.noreply.github.com> +Roman +Satya Rohith +Sergey Belozyorcev +Shiyan7 <57950265+Shiyan7@users.noreply.github.com> +The Gitter Badger +Usman Yunusov +Vadim Filimonov +Vasili Sviridov +Vasili Svirydau +Victor Kolb +Victor-Nikliaiev +Vladislav +Vladislav Botvin +Will Heslam +WoodenPC +Yesset +alek-de-mik +anatolykopyl +ansunrisein <45604301+ansunrisein@users.noreply.github.com> +c01nd01r +dmitryplyaskin <35658668+dmitryplyaskin@users.noreply.github.com> +gzaripov +houston[bot] +ilfey +kanno <812137533@qq.com> +leushkin +miyaokamarina +nulladdict +risenforces +seonmyung.lim +vladthelittleone +xxxue <1659809758@qq.com> diff --git a/README.md b/README.md new file mode 100644 index 0000000..f9cc6fd --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Documentation + +## Content files + +All files of the content can be written using MD or MDX inside `src/content/docs/[lang]`. + +Astro can find localized version via the same slug (path to the document) in the another directory: + +- `src/content/docs/[lang]/[slug].md` (_or `.mdx`_) +- `src/content/docs/en/api/effector/clearNode.md` +- `src/content/docs/ru/api/effector/clearNode.md` + +## Configuration + +The most basic setup is in `src/consts.ts`. + +Translation of the UI elements is in `src/languages.ts`. + +All navigation structure is in `src/navigation.ts`. + +## Run + +Simply install the `pnpm` and run: + +```shell +pnpm install +pnpm start +``` + +To fetch commits history, you need Github Personal Access Token. Just add it: + +```shell +GITHUB_TOKEN=github_pat_REDACTED_TOKEN pnpm start +``` + +### Search + +By default search disabled on the local machine due to index requirements. But you can enable it by following steps: + +1. Build the docs — `COMPRESS=false pnpm build` +2. Start search serve server — `pnpm search:dev` +3. Start astro with env parameter `PUBLIC_SEARCH=true pnpm dev` + +`COMPRESS=false` disables compressing, to speed up build. diff --git a/astro.config.ts b/astro.config.ts new file mode 100644 index 0000000..63b84a3 --- /dev/null +++ b/astro.config.ts @@ -0,0 +1,56 @@ +import "dotenv/config"; +import { defineConfig } from "astro/config"; +import mdx from "@astrojs/mdx"; +import compress from "astro-compress"; +import preact from "@astrojs/preact"; +import tailwind from "@astrojs/tailwind"; +import directive from "remark-directive"; +import github from "remark-github"; +import breaks from "remark-breaks"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; + +import { remarkHeadingId } from "@effector/remark-heading-id"; + +import { admonitions } from "./plugins/admonitions"; +import { remarkFallbackLang } from "./plugins/remark-fallback-lang"; + +// https://astro.build/config +export default defineConfig({ + site: process.env.NODE_ENV === "development" ? "http://localhost:4321" : `https://effector.dev`, + integrations: [ + tailwind({ applyBaseStyles: false }), + preact({ compat: true }), + mdx({ extendMarkdownConfig: true }), + process.env.COMPRESS !== "false" && compress(), + ], + prefetch: true, + base: "/", + build: { + assets: "assets", + }, + scopedStyleStrategy: "where", + markdown: { + syntaxHighlight: "prism", + remarkPlugins: [directive, admonitions, github, remarkHeadingId], + rehypePlugins: [ + [ + rehypeAutolinkHeadings, + { + behavior: "prepend", + properties: { class: "href" }, + }, + ], + ], + }, + vite: { + server: { + proxy: { + "/_pagefind": { + target: "http://127.0.0.1:1414", + rewrite: (path) => path.replace(/^\/dist/, ""), + }, + }, + }, + }, + devToolbar: { enabled: false }, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..b3e00d7 --- /dev/null +++ b/package.json @@ -0,0 +1,68 @@ +{ + "name": "@effector/docs", + "type": "module", + "private": true, + "version": "23.0.0", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro", + "search:dev": "pagefind --serve", + "search:build": "pagefind" + }, + "repository": { + "type": "git", + "url": "https://github.com/effector/effector" + }, + "packageManager": "pnpm@8.11.0", + "overrides": { + "react": "npm:@preact/compat@latest", + "react-dom": "npm:@preact/compat@latest" + }, + "dependencies": { + "@algolia/client-search": "^4.22.1", + "@astrojs/mdx": "^2.2.1", + "@astrojs/preact": "^3.1.1", + "@astrojs/tailwind": "^5.1.0", + "@codesandbox/sandpack-react": "^2.10.0", + "@effector/remark-heading-id": "^2.0.2", + "@octokit/rest": "^19.0.13", + "@pagefind/default-ui": "^1.0.4", + "@tailwindcss/typography": "^0.5.10", + "@types/html-escaper": "^3.0.2", + "@types/mdast": "^4.0.3", + "@types/node": "^20.11.30", + "@types/react": "^18.2.69", + "@types/react-dom": "^18.2.22", + "@types/unist": "^3.0.2", + "astro": "^4.5.9", + "astro-compress": "^2.2.17", + "clsx": "^1.2.1", + "cssnano": "^6.1.1", + "dotenv": "^16.4.5", + "effector": "^23.2.0", + "html-escaper": "^3.0.3", + "nanoid": "^4.0.2", + "pagefind": "^1.0.4", + "preact": "^10.18.1", + "rehype-autolink-headings": "^7.1.0", + "remark-breaks": "^4.0.0", + "remark-directive": "^3.0.0", + "remark-github": "^12.0.0", + "rollup": "^4.13.0", + "tailwindcss": "^3.4.1", + "unist-util-map": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.1" + }, + "devDependencies": { + "mdast-util-directive": "^3.0.0", + "prettier": "^3.2.5", + "prettier-plugin-astro": "^0.13.0", + "prettier-plugin-organize-attributes": "^1.0.0", + "prettier-plugin-tailwindcss": "^0.5.13", + "typescript": "^5.2.2" + } +} diff --git a/pagefind.yml b/pagefind.yml new file mode 100644 index 0000000..7202ace --- /dev/null +++ b/pagefind.yml @@ -0,0 +1,4 @@ +exclude_selectors: + - "pre > code" +site: ./dist +output_subdir: ./_pagefind diff --git a/plugins/admonitions.ts b/plugins/admonitions.ts new file mode 100644 index 0000000..35960ce --- /dev/null +++ b/plugins/admonitions.ts @@ -0,0 +1,53 @@ +import { map } from "unist-util-map"; +import "mdast-util-directive"; +import type { Root, Node } from "mdast"; +import type { VFile } from "vfile"; +import type { TextDirective } from "mdast-util-directive"; + +// TODO: Add svg icons + +export function admonitions({ types = ["tip", "info", "warning"] } = {}) { + return (tree: Root, file: VFile) => { + return map(tree, (node) => { + if ( + node.type === "containerDirective" || + node.type === "textDirective" || + node.type === "leafDirective" + ) { + if (types.includes(node.name)) { + const children = node.children; + delete node.children; + + return h("div", { className: `admonition admonition-${node.name}` }, [ + h("div", { className: "admonition-heading" }, [ + h("span", { className: "admonition-title" }, [ + text(node.attributes!.title ?? node.name), + ]), + ]), + h("div", { className: "admonition-content" }, children), + ]) satisfies TextDirective; + } + } + return node; + }); + }; +} + +function node(type: string, name: string, props = {}, rest = {}) { + return { + type, + data: { + hName: name, + hProperties: props, + }, + ...rest, + }; +} + +function text(value: string) { + return { type: "text", value }; +} + +function h(name: string, props = {}, children: unknown[] = []): T { + return node("element", name, props, { children }) as T; +} diff --git a/plugins/remark-fallback-lang.ts b/plugins/remark-fallback-lang.ts new file mode 100644 index 0000000..d4730ab --- /dev/null +++ b/plugins/remark-fallback-lang.ts @@ -0,0 +1,80 @@ +// Copied from https://github.com/withastro/docs/blob/main/plugins/remark-fallback-lang.ts +import fs from "node:fs"; +import path from "node:path"; +import type { Root } from "mdast"; +import type { Plugin, Transformer } from "unified"; +import { visit } from "unist-util-visit"; + +export function remarkFallbackLang() { + const pageSourceDir = path.resolve("./src/content/docs"); + const baseUrl = "https://effector.dev/"; + + const transformer: Transformer = (tree, file) => { + const pageUrl = mdFilePathToUrl(file.path, pageSourceDir, baseUrl); + const pageLang = getLanguageCodeFromPathname(pageUrl.pathname); + + // Ignore pages without language prefix and English pages + if (!pageLang || pageLang === "en") return; + + visit(tree, "link", (link) => { + const linkUrl = new URL(link.url, pageUrl); + + // Ignore external links + if (pageUrl.host !== linkUrl.host) return; + + // Ignore link targets without language prefix + const linkLang = getLanguageCodeFromPathname(linkUrl.pathname); + if (!linkLang) return; + + // Ignore link targets that have a valid source file + const linkSourceFileName = tryFindSourceFileForPathname(linkUrl.pathname, pageSourceDir); + if (linkSourceFileName) return; + + link.children.push({ + type: "html", + value: ` (EN)`, + }); + }); + }; + + return transformer; +} + +export function mdFilePathToUrl(mdFilePath: string, pageSourceDir: string, baseUrl: string) { + const pathBelowRoot = path.relative(pageSourceDir, mdFilePath); + const pathname = pathBelowRoot.replace(/\\/g, "/").replace(/\.mdx?$/i, "/"); + + return new URL(pathname, baseUrl); +} + +export function getLanguageCodeFromPathname(pathname: string) { + // Assuming that `pathname` always starts with a `/`, retrieve the first path part, + // which is usually the language code + const firstPathPart = pathname.split("/")[1]; + // Only return parts that look like a two-letter language code + // with optional two-letter country code + if (firstPathPart.match(/^[a-z]{2}(-[a-zA-Z]{2})?$/)) return firstPathPart; +} + +/** + * Attempts to find a Markdown source file for the given `pathname`. + * + * Example: Given a pathname of `/en/some-page` or `/en/some-page/`, + * searches for the source file in the following locations + * and returns the first matching path: + * - `${this.pageSourceDir}/en/some-page.md` + * - `${this.pageSourceDir}/en/some-page/index.md` + * - `${this.pageSourceDir}/e n/some-page.mdx` + * - `${this.pageSourceDir}/en/some-page/index.mdx` + * + * If no existing file is found, returns `undefined`. + */ +export function tryFindSourceFileForPathname(pathname: string, pageSourceDir: string) { + const possibleSourceFilePaths = [ + path.join(pageSourceDir, pathname, ".") + ".md", + path.join(pageSourceDir, pathname, "index.md"), + path.join(pageSourceDir, pathname, ".") + ".mdx", + path.join(pageSourceDir, pathname, "index.mdx"), + ]; + return possibleSourceFilePaths.find((possiblePath) => fs.existsSync(possiblePath)); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..4889913 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6814 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@algolia/client-search': + specifier: ^4.22.1 + version: 4.22.1 + '@astrojs/mdx': + specifier: ^2.2.1 + version: 2.2.1(astro@4.5.9) + '@astrojs/preact': + specifier: ^3.1.1 + version: 3.1.1(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4) + '@astrojs/tailwind': + specifier: ^5.1.0 + version: 5.1.0(astro@4.5.9)(tailwindcss@3.4.1) + '@codesandbox/sandpack-react': + specifier: ^2.10.0 + version: 2.10.0(@lezer/common@1.2.1)(react-dom@18.2.0)(react@18.2.0) + '@effector/remark-heading-id': + specifier: ^2.0.2 + version: 2.0.2(@types/mdast@4.0.3)(unified@10.1.2) + '@octokit/rest': + specifier: ^19.0.13 + version: 19.0.13 + '@pagefind/default-ui': + specifier: ^1.0.4 + version: 1.0.4 + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.1) + '@types/html-escaper': + specifier: ^3.0.2 + version: 3.0.2 + '@types/mdast': + specifier: ^4.0.3 + version: 4.0.3 + '@types/node': + specifier: ^20.11.30 + version: 20.11.30 + '@types/react': + specifier: ^18.2.69 + version: 18.2.69 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.22 + '@types/unist': + specifier: ^3.0.2 + version: 3.0.2 + astro: + specifier: ^4.5.9 + version: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + astro-compress: + specifier: ^2.2.17 + version: 2.2.17 + clsx: + specifier: ^1.2.1 + version: 1.2.1 + cssnano: + specifier: ^6.1.1 + version: 6.1.1(postcss@8.4.38) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + effector: + specifier: ^23.2.0 + version: 23.2.0 + html-escaper: + specifier: ^3.0.3 + version: 3.0.3 + nanoid: + specifier: ^4.0.2 + version: 4.0.2 + pagefind: + specifier: ^1.0.4 + version: 1.0.4 + preact: + specifier: ^10.18.1 + version: 10.18.1 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + remark-breaks: + specifier: ^4.0.0 + version: 4.0.0 + remark-directive: + specifier: ^3.0.0 + version: 3.0.0 + remark-github: + specifier: ^12.0.0 + version: 12.0.0 + rollup: + specifier: ^4.13.0 + version: 4.13.0 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 + unist-util-map: + specifier: ^4.0.0 + version: 4.0.0 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + vfile: + specifier: ^6.0.1 + version: 6.0.1 + +devDependencies: + mdast-util-directive: + specifier: ^3.0.0 + version: 3.0.0 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + prettier-plugin-astro: + specifier: ^0.13.0 + version: 0.13.0 + prettier-plugin-organize-attributes: + specifier: ^1.0.0 + version: 1.0.0(prettier@3.2.5) + prettier-plugin-tailwindcss: + specifier: ^0.5.13 + version: 0.5.13(prettier-plugin-astro@0.13.0)(prettier-plugin-organize-attributes@1.0.0)(prettier@3.2.5) + typescript: + specifier: ^5.2.2 + version: 5.2.2 + +packages: + + /@algolia/cache-common@4.22.1: + resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + dev: false + + /@algolia/client-common@4.22.1: + resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + dependencies: + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + + /@algolia/client-search@4.22.1: + resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + + /@algolia/logger-common@4.22.1: + resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + dev: false + + /@algolia/requester-common@4.22.1: + resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} + dev: false + + /@algolia/transporter@4.22.1: + resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + dependencies: + '@algolia/cache-common': 4.22.1 + '@algolia/logger-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + dev: false + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: false + + /@astrojs/compiler@1.8.2: + resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} + dev: true + + /@astrojs/compiler@2.7.0: + resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} + dev: false + + /@astrojs/internal-helpers@0.3.0: + resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} + dev: false + + /@astrojs/markdown-remark@4.3.1: + resolution: {integrity: sha512-eJFi600tkRjTFiwzY9oD8AgCgB7gFqyWCKWuZ33dATVBgLiROD+zlMZ8STZzU7+ZALvmiUAun/K7umTmP5YfVQ==} + dependencies: + '@astrojs/prism': 3.0.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.0 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.0.0 + shiki: 1.2.0 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@2.2.1(astro@4.5.9): + resolution: {integrity: sha512-bSr/AkvGieD9Pc5ZzMnAk7IHnw0vyt/aOujuYUmYT+NHiWahAUy/+ywNNMhTMmea0irdMYnBVC1AEKMQ/oXxow==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + dependencies: + '@astrojs/markdown-remark': 4.3.1 + '@mdx-js/mdx': 3.0.1 + acorn: 8.11.2 + astro: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + es-module-lexer: 1.4.2 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.0 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 2.0.0 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-ASgmVzh4wLyIyynp5CIfDwE45Vg/tIP+Y+5SnQtURmCP1qZpjdUbsw+bGQ0wCSXtjIbzCBa7Kw7Qn0g6WE2W2w==} + engines: {node: '>=18.14.1'} + peerDependencies: + preact: ^10.6.5 + dependencies: + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@preact/preset-vite': 2.8.2(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4) + '@preact/signals': 1.2.1(preact@10.18.1) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) + preact: 10.18.1 + preact-render-to-string: 6.3.1(preact@10.18.1) + preact-ssr-prepass: 1.2.1(preact@10.18.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + - vite + dev: false + + /@astrojs/prism@3.0.0: + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + dependencies: + prismjs: 1.29.0 + dev: false + + /@astrojs/tailwind@5.1.0(astro@4.5.9)(tailwindcss@3.4.1): + resolution: {integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + dependencies: + astro: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + autoprefixer: 10.4.16(postcss@8.4.31) + postcss: 8.4.31 + postcss-load-config: 4.0.2(postcss@8.4.31) + tailwindcss: 3.4.1 + transitivePeerDependencies: + - ts-node + dev: false + + /@astrojs/telemetry@3.0.4: + resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} + engines: {node: '>=18.14.1'} + dependencies: + ci-info: 3.9.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.3 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: false + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: false + + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.23.5: + resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helpers': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.23.5: + resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: false + + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.23.5: + resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: false + + /@babel/parser@7.23.5: + resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + dev: false + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.24.3): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.3) + '@babel/types': 7.23.5 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + dev: false + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: false + + /@babel/traverse@7.23.5: + resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.23.5: + resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1): + resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + dev: false + + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.2.1): + resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.2.1 + dev: false + + /@codemirror/commands@6.3.2: + resolution: {integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==} + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.22.1): + resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@lezer/common': 1.1.1 + '@lezer/css': 1.1.4 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-html@6.4.7: + resolution: {integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1) + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/css': 1.1.4 + '@lezer/html': 1.3.7 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/language': 6.9.3 + '@codemirror/lint': 6.4.2 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/javascript': 1.4.9 + dev: false + + /@codemirror/language@6.9.3: + resolution: {integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==} + dependencies: + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + style-mod: 4.1.0 + dev: false + + /@codemirror/lint@6.4.2: + resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==} + dependencies: + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.3.2: + resolution: {integrity: sha512-5jEikOfU0r9y+OTlZn5AEQB15mibu3deLBUp+GnLzVUNezEEuPt/JdSeniQNi+0YviblAvOPO2JQAlgJ3SYYaA==} + dev: false + + /@codemirror/view@6.22.1: + resolution: {integrity: sha512-38BRn1nPqZqiHbmWfI8zri23IbRVbmSpSmh1E/Ysvc+lIGGdBC17K8zlK7ZU6fhfy9x4De9Zyj5JQqScPq5DkA==} + dependencies: + '@codemirror/state': 6.3.2 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + dev: false + + /@codesandbox/nodebox@0.1.8: + resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} + dependencies: + outvariant: 1.4.0 + strict-event-emitter: 0.4.6 + dev: false + + /@codesandbox/sandpack-client@2.10.0: + resolution: {integrity: sha512-1vLN0j8ElzTmTG43yoBj1dsOyuw6SqRH9rRa13D32jtM4v2qPFLWIFElcyNpH/YbWsCRZTUCN6ku6U4Yw/Xdvg==} + dependencies: + '@codesandbox/nodebox': 0.1.8 + buffer: 6.0.3 + dequal: 2.0.3 + outvariant: 1.4.0 + static-browser-server: 1.0.3 + dev: false + + /@codesandbox/sandpack-react@2.10.0(@lezer/common@1.2.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XDUOJMPp97FK9YUjHlgFQQqWJY77ih215wFz2CWEzJTalRIM6yneexcTs62Jv1VtgHmRkUxdsgZPqT6KCqKAEA==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.2.1) + '@codemirror/commands': 6.3.2 + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1) + '@codemirror/lang-html': 6.4.7 + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@codesandbox/sandpack-client': 2.10.0 + '@lezer/highlight': 1.2.0 + '@react-hook/intersection-observer': 3.1.1(react@18.2.0) + '@stitches/core': 1.2.8 + anser: 2.1.1 + clean-set: 1.1.2 + codesandbox-import-util-types: 2.2.3 + dequal: 2.0.3 + escape-carriage: 1.3.1 + lz-string: 1.5.0 + react: 18.2.0 + react-devtools-inline: 4.4.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 17.0.2 + transitivePeerDependencies: + - '@lezer/common' + dev: false + + /@effector/remark-heading-id@2.0.2(@types/mdast@4.0.3)(unified@10.1.2): + resolution: {integrity: sha512-W28SkiSOtfJf8P5pTqtoybwC7naPwf0n9rFniC4ym1s3UYnT7Zj3itFo9CfkIZ0i0haPCMztxXjpkxANUKxh5Q==} + engines: {node: '>=8'} + peerDependencies: + '@types/mdast': ^3.0.11 + unified: ^10.1.0 + dependencies: + '@types/mdast': 4.0.3 + lodash: 4.17.21 + unified: 10.1.2 + unist-util-visit: 1.4.1 + dev: false + + /@emnapi/runtime@0.45.0: + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.33.2: + resolution: {integrity: sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.2: + resolution: {integrity: sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.1: + resolution: {integrity: sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.1: + resolution: {integrity: sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.1: + resolution: {integrity: sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.1: + resolution: {integrity: sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.1: + resolution: {integrity: sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.1: + resolution: {integrity: sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.1: + resolution: {integrity: sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.1: + resolution: {integrity: sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.2: + resolution: {integrity: sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.2: + resolution: {integrity: sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.2: + resolution: {integrity: sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.2: + resolution: {integrity: sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.2: + resolution: {integrity: sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.2: + resolution: {integrity: sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.2: + resolution: {integrity: sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 0.45.0 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.2: + resolution: {integrity: sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.2: + resolution: {integrity: sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: false + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@lezer/common@1.1.1: + resolution: {integrity: sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==} + dev: false + + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: false + + /@lezer/css@1.1.4: + resolution: {integrity: sha512-CuUwjidrU7FOBokqASRJc72SmJ9g1PsHXDOWMoKg4md6+2u/Zxzwx5YsYrAFxRDsLrjLlsIyEF1rZHK3gFEJbw==} + dependencies: + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/highlight@1.2.0: + resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + dependencies: + '@lezer/common': 1.1.1 + dev: false + + /@lezer/html@1.3.7: + resolution: {integrity: sha512-Wo+rZ5UjLP0VqUTyXjzgmTYRW5bvTJUFn4Uw0K3HCQjX2/+f+zRo9GLN5BCAojwHQISPvaQk8BWSv2SSKx/UcQ==} + dependencies: + '@lezer/common': 1.1.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/javascript@1.4.9: + resolution: {integrity: sha512-7Uv8mBBE6l44spgWEZvEMdDqGV+FIuY7kJ1o5TFm+jxIuxydO3PcKJYiINij09igd1D/9P7l2KDqpkN8c3bM6A==} + dependencies: + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/lr@1.3.14: + resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} + dependencies: + '@lezer/common': 1.1.1 + dev: false + + /@mdx-js/mdx@3.0.1: + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdx': 2.0.9 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: false + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@18.1.1: + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + dev: false + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: false + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: false + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: false + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: false + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.7.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: false + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: false + + /@pagefind/darwin-arm64@1.0.4: + resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/darwin-x64@1.0.4: + resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/default-ui@1.0.4: + resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} + dev: false + + /@pagefind/linux-arm64@1.0.4: + resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/linux-x64@1.0.4: + resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/windows-x64@1.0.4: + resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@prefresh/vite': 2.4.3(preact@10.18.1)(vite@5.2.4) + '@rollup/pluginutils': 4.2.1 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) + debug: 4.3.4 + kolorist: 1.8.0 + magic-string: 0.30.5 + node-html-parser: 6.1.12 + resolve: 1.22.8 + source-map: 0.7.4 + stack-trace: 1.0.0-pre2 + vite: 5.2.4(@types/node@20.11.30) + transitivePeerDependencies: + - preact + - supports-color + dev: false + + /@preact/signals-core@1.5.0: + resolution: {integrity: sha512-U2diO1Z4i1n2IoFgMYmRdHWGObNrcuTRxyNEn7deSq2cru0vj0583HYQZHsAqcs7FE+hQyX3mjIV7LAfHCvy8w==} + dev: false + + /@preact/signals@1.2.1(preact@10.18.1): + resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} + peerDependencies: + preact: 10.x + dependencies: + '@preact/signals-core': 1.5.0 + preact: 10.18.1 + dev: false + + /@prefresh/babel-plugin@0.5.0: + resolution: {integrity: sha512-joAwpkUDwo7ZqJnufXRGzUb+udk20RBgfA8oLPBh5aJH2LeStmV1luBfeJTztPdyCscC2j2SmZ/tVxFRMIxAEw==} + dev: false + + /@prefresh/core@1.5.2(preact@10.18.1): + resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} + peerDependencies: + preact: ^10.0.0 + dependencies: + preact: 10.18.1 + dev: false + + /@prefresh/utils@1.2.0: + resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} + dev: false + + /@prefresh/vite@2.4.3(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-diQ8AW+Y2i1QEhO64t2hhV8WFP9X0/NAxuSd9eRlVyS3LOs3RgGOwjOmLoJqwCmIbdq5Szq983gO+xdW/l0G6A==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + dependencies: + '@babel/core': 7.23.5 + '@prefresh/babel-plugin': 0.5.0 + '@prefresh/core': 1.5.2(preact@10.18.1) + '@prefresh/utils': 1.2.0 + '@rollup/pluginutils': 4.2.1 + preact: 10.18.1 + vite: 5.2.4(@types/node@20.11.30) + transitivePeerDependencies: + - supports-color + dev: false + + /@react-hook/intersection-observer@3.1.1(react@18.2.0): + resolution: {integrity: sha512-OTDx8/wFaRvzFtKl1dEUEXSOqK2zVJHporiTTdC2xO++0e9FEx9wIrPis5q3lqtXeZH9zYGLbk+aB75qNFbbuw==} + peerDependencies: + react: '>=16.8' + dependencies: + '@react-hook/passive-layout-effect': 1.2.1(react@18.2.0) + intersection-observer: 0.10.0 + react: 18.2.0 + dev: false + + /@react-hook/passive-layout-effect@1.2.1(react@18.2.0): + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + dependencies: + react: 18.2.0 + dev: false + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: false + + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@shikijs/core@1.2.0: + resolution: {integrity: sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==} + dev: false + + /@stitches/core@1.2.8: + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + dev: false + + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.1): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.1 + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 + dev: false + + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + dependencies: + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + dev: false + + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@types/css-tree@2.3.7: + resolution: {integrity: sha512-LUlutQBpR2TgqZJdvXCPOx9EME7a4PHSEo2Y2c8POFpj1E9a6V94PUZNwjVdfHWyb8RQZoNHTYOKs980+sOi+g==} + dev: false + + /@types/csso@5.0.4: + resolution: {integrity: sha512-W/FsRkm/9c04x9ON+bj+HQ0cSgNkG1LvcfuBCpkP7cpikM7+RkrNFLGtiofb++xBG6KGMUycLoDbi9/K621ZCw==} + dependencies: + '@types/css-tree': 2.3.7 + dev: false + + /@types/debug@4.1.10: + resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} + dependencies: + '@types/ms': 0.7.33 + + /@types/estree-jsx@1.0.2: + resolution: {integrity: sha512-GNBWlGBMjiiiL5TSkvPtOteuXsiVitw5MYGY1UYlrAq0SKyczsls6sCD7TZ8fsjRsvCVxml7EbyjJezPb3DrSA==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/hast@3.0.2: + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/html-escaper@3.0.2: + resolution: {integrity: sha512-A8vk09eyYzk8J/lFO4OUMKCmRN0rRzfZf4n3Olwapgox/PtTiU8zPYlL1UEkJ/WeHvV6v9Xnj3o/705PKz9r4Q==} + dev: false + + /@types/html-minifier-terser@7.0.2: + resolution: {integrity: sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA==} + dev: false + + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + + /@types/mdx@2.0.9: + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} + dev: false + + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + + /@types/nlcst@1.0.3: + resolution: {integrity: sha512-cpO6PPMz4E++zxP2Vhp/3KVl2Nbtj+Iksb25rlRinG7mphu2zmCIKWWlqdsx1NwJEISogR2eeZTD7JqLOCzaiw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: false + + /@types/react-dom@18.2.22: + resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + dependencies: + '@types/react': 18.2.69 + dev: false + + /@types/react@18.2.69: + resolution: {integrity: sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==} + dependencies: + '@types/prop-types': 15.7.12 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + dev: false + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + dev: false + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: false + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /anser@2.1.1: + resolution: {integrity: sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==} + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: false + + /array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro-compress@2.2.17: + resolution: {integrity: sha512-nqwLZApVtoMyRjvvsWIyBkzj31YSHtzWPOCLdZZLSu94ieWxIzoapa0jD7Vt+K6Mzc+KfXPdB9dK+hDcJCy9wQ==} + dependencies: + '@types/csso': 5.0.4 + '@types/html-minifier-terser': 7.0.2 + csso: 5.0.5 + files-pipe: 2.1.15 + html-minifier-terser: 7.2.0 + kleur: 4.1.5 + lightningcss: 1.24.1 + sharp: 0.33.2 + svgo: 3.2.0 + terser: 5.29.2 + dev: false + + /astro@4.5.9(@types/node@20.11.30)(typescript@5.2.2): + resolution: {integrity: sha512-GheU72Goz7dYQNKaqTxB2H49cNvHfahGSbNkTvMXk+gyHf/g633qadqlO2ZQbTUacoUWmDzvS5fhMZt2/w4naQ==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.7.0 + '@astrojs/internal-helpers': 0.3.0 + '@astrojs/markdown-remark': 4.3.1 + '@astrojs/telemetry': 3.0.4 + '@babel/core': 7.24.3 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + '@types/babel__core': 7.20.5 + acorn: 8.11.2 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.5.3 + ci-info: 4.0.0 + clsx: 2.0.0 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 4.3.2 + diff: 5.1.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.4.2 + esbuild: 0.19.12 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.5 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.2 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.5.4 + shiki: 1.2.0 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.0(typescript@5.2.2) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.2.4(@types/node@20.11.30) + vitefu: 0.2.5(vite@5.2.4) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.22.4 + zod-to-json-schema: 3.22.5(zod@3.22.4) + optionalDependencies: + sharp: 0.32.6 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + dev: false + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001559 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: false + + /axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + dependencies: + dequal: 2.0.3 + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + requiresBuild: true + dev: false + optional: true + + /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.3): + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + dependencies: + '@babel/core': 7.24.3 + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + optional: true + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001559 + electron-to-chromium: 1.4.571 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: false + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.715 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + requiresBuild: true + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + optional: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001600 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: false + + /caniuse-lite@1.0.30001559: + resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} + dev: false + + /caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + dev: false + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true + dev: false + optional: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: false + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: false + + /clean-set@1.1.2: + resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + dev: false + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /codesandbox-import-util-types@2.2.3: + resolution: {integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==} + dev: false + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + requiresBuild: true + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /css-declaration-sorter@7.1.1(postcss@8.4.38): + resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.38 + dev: false + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.0 + dev: false + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /cssnano-preset-default@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-XW/dYN2p8Jdkp1lovFd0UVRh6RB0iMyXJbAE9Qm+taR3p2LGu492AW34lVaukUrXoK9IxK5aK3CUmFpUorU4oA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + css-declaration-sorter: 7.1.1(postcss@8.4.38) + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-calc: 9.0.1(postcss@8.4.38) + postcss-colormin: 6.1.0(postcss@8.4.38) + postcss-convert-values: 6.1.0(postcss@8.4.38) + postcss-discard-comments: 6.0.2(postcss@8.4.38) + postcss-discard-duplicates: 6.0.3(postcss@8.4.38) + postcss-discard-empty: 6.0.3(postcss@8.4.38) + postcss-discard-overridden: 6.0.2(postcss@8.4.38) + postcss-merge-longhand: 6.0.5(postcss@8.4.38) + postcss-merge-rules: 6.1.1(postcss@8.4.38) + postcss-minify-font-values: 6.1.0(postcss@8.4.38) + postcss-minify-gradients: 6.0.3(postcss@8.4.38) + postcss-minify-params: 6.1.0(postcss@8.4.38) + postcss-minify-selectors: 6.0.4(postcss@8.4.38) + postcss-normalize-charset: 6.0.2(postcss@8.4.38) + postcss-normalize-display-values: 6.0.2(postcss@8.4.38) + postcss-normalize-positions: 6.0.2(postcss@8.4.38) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38) + postcss-normalize-string: 6.0.2(postcss@8.4.38) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38) + postcss-normalize-unicode: 6.1.0(postcss@8.4.38) + postcss-normalize-url: 6.0.2(postcss@8.4.38) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.38) + postcss-ordered-values: 6.0.2(postcss@8.4.38) + postcss-reduce-initial: 6.1.0(postcss@8.4.38) + postcss-reduce-transforms: 6.0.2(postcss@8.4.38) + postcss-svgo: 6.0.3(postcss@8.4.38) + postcss-unique-selectors: 6.0.4(postcss@8.4.38) + dev: false + + /cssnano-utils@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /cssnano@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-paTFZuiVohpaXJuau8l7buFt9+FTmfjwEO70EKitzYOQw3frib/It4sb6cQ+gJyDEyY+myDSni6IbBvKZ0N8Lw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-preset-default: 6.1.1(postcss@8.4.38) + lilconfig: 3.1.1 + postcss: 8.4.38 + dev: false + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + mimic-response: 3.1.0 + dev: false + optional: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + requiresBuild: true + dev: false + optional: true + + /deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} + dev: false + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + + /deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + dependencies: + base-64: 1.0.0 + dev: false + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /effector@23.2.0: + resolution: {integrity: sha512-TqR/e5BSfAk4ZkHOykmqPmT9Nn4fLE/BhuBiVmy2cb7Vp6in8N+xMDFhWWZAgOdQjehgt/dIVQyXuWpXh3EoZA==} + engines: {node: '>=11.0.0'} + dev: false + + /electron-to-chromium@1.4.571: + resolution: {integrity: sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==} + dev: false + + /electron-to-chromium@1.4.715: + resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==} + dev: false + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true + dependencies: + once: 1.4.0 + dev: false + optional: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /es-module-lexer@1.4.2: + resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} + dev: false + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: false + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: false + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-carriage@1.3.1: + resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.2 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.2 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/unist': 3.0.2 + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true + dev: false + optional: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /files-pipe@2.1.15: + resolution: {integrity: sha512-HYPXV6nh/H3U0WUDErZMVUoUJh15XDe5/rFwHWZXU5wIyCbCkA7UAuhLySs7sua3MRuwILuwZLDnQtXhaibNeg==} + dependencies: + '@types/node': 20.11.30 + deepmerge-ts: 5.1.0 + fast-glob: 3.3.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true + dev: false + optional: true + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.3.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: false + + /html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: false + + /html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.29.2 + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true + dev: false + optional: true + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + + /intersection-observer@0.10.0: + resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: false + + /lightningcss-darwin-arm64@1.24.1: + resolution: {integrity: sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.24.1: + resolution: {integrity: sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.24.1: + resolution: {integrity: sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.24.1: + resolution: {integrity: sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.24.1: + resolution: {integrity: sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.24.1: + resolution: {integrity: sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.24.1: + resolution: {integrity: sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.24.1: + resolution: {integrity: sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.24.1: + resolution: {integrity: sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.24.1: + resolution: {integrity: sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.24.1 + lightningcss-darwin-x64: 1.24.1 + lightningcss-freebsd-x64: 1.24.1 + lightningcss-linux-arm-gnueabihf: 1.24.1 + lightningcss-linux-arm64-gnu: 1.24.1 + lightningcss-linux-arm64-musl: 1.24.1 + lightningcss-linux-x64-gnu: 1.24.1 + lightningcss-linux-x64-musl: 1.24.1 + lightningcss-win32-x64-msvc: 1.24.1 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: false + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: false + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {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.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {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.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-newline-to-break@2.0.0: + resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-find-and-replace: 3.0.1 + dev: false + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: false + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.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.1 + 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 + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + 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 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.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 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {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.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + 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 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.10 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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 + transitivePeerDependencies: + - supports-color + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + requiresBuild: true + dev: false + optional: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + requiresBuild: true + dev: false + optional: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true + dev: false + optional: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true + dev: false + optional: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + + /nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + dependencies: + '@types/nlcst': 1.0.3 + dev: false + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: false + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + semver: 7.5.4 + dev: false + optional: true + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true + dev: false + optional: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-html-parser@6.1.12: + resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + dependencies: + css-select: 5.1.0 + he: 1.2.0 + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.1 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + dev: false + + /outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + dev: false + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /pagefind@1.0.4: + resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} + hasBin: true + optionalDependencies: + '@pagefind/darwin-arm64': 1.0.4 + '@pagefind/darwin-x64': 1.0.4 + '@pagefind/linux-arm64': 1.0.4 + '@pagefind/linux-x64': 1.0.4 + '@pagefind/windows-x64': 1.0.4 + dev: false + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + /parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /postcss-calc@9.0.1(postcss@8.4.38): + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-colormin@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-convert-values@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-discard-comments@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-duplicates@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-empty@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-overridden@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.31): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.31 + yaml: 2.4.1 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.1 + dev: false + + /postcss-merge-longhand@6.0.5(postcss@8.4.38): + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.4.38) + dev: false + + /postcss-merge-rules@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-minify-font-values@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-gradients@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-params@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-normalize-charset@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-normalize-display-values@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-positions@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-string@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-unicode@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-url@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-ordered-values@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-reduce-initial@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + postcss: 8.4.38 + dev: false + + /postcss-reduce-transforms@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-svgo@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + svgo: 3.2.0 + dev: false + + /postcss-unique-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: false + + /preact-render-to-string@6.3.1(preact@10.18.1): + resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.18.1 + pretty-format: 3.8.0 + dev: false + + /preact-ssr-prepass@1.2.1(preact@10.18.1): + resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} + peerDependencies: + preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' + dependencies: + preact: 10.18.1 + dev: false + + /preact@10.18.1: + resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + optional: true + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prettier-plugin-astro@0.13.0: + resolution: {integrity: sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g==} + engines: {node: ^14.15.0 || >=16.0.0} + dependencies: + '@astrojs/compiler': 1.8.2 + prettier: 3.2.5 + sass-formatter: 0.7.9 + dev: true + + /prettier-plugin-organize-attributes@1.0.0(prettier@3.2.5): + resolution: {integrity: sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==} + engines: {node: '>=14.0.0'} + peerDependencies: + prettier: ^3.0.0 + dependencies: + prettier: 3.2.5 + dev: true + + /prettier-plugin-tailwindcss@0.5.13(prettier-plugin-astro@0.13.0)(prettier-plugin-organize-attributes@1.0.0)(prettier@3.2.5): + resolution: {integrity: sha512-2tPWHCFNC+WRjAC4SIWQNSOdcL1NNkydXim8w7TDqlZi+/ulZYz2OouAI6qMtkggnPt7lGamboj6LcTMwcCvoQ==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.2.5 + prettier-plugin-astro: 0.13.0 + prettier-plugin-organize-attributes: 1.0.0(prettier@3.2.5) + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /property-information@6.3.0: + resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + optional: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + requiresBuild: true + dev: false + optional: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + requiresBuild: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + optional: true + + /react-devtools-inline@4.4.0: + resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==} + dependencies: + es6-symbol: 3.1.3 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + dev: false + + /rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + dev: false + + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.2 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + dev: false + + /rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /rehype@13.0.1: + resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.4 + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: false + + /remark-breaks@4.0.0: + resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-newline-to-break: 2.0.0 + unified: 11.0.4 + dev: false + + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + 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.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-github@12.0.0: + resolution: {integrity: sha512-ByefQKFN184LeiGRCabfl7zUJsdlMYWEhiLX1gpmQ11yFg6xSuOTW7LVCv0oc1x+YvUMJW23NU36sJX2RWGgvg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-find-and-replace: 3.0.1 + mdast-util-to-string: 4.0.0 + to-vfile: 8.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + dependencies: + '@types/nlcst': 1.0.3 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + dev: false + + /retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + dependencies: + '@types/nlcst': 1.0.3 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + dependencies: + '@types/nlcst': 1.0.3 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + dev: false + + /retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + dependencies: + '@types/nlcst': 1.0.3 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 + fsevents: 2.3.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + requiresBuild: true + dev: false + + /sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + dependencies: + suf-log: 2.5.3 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + optional: true + + /sharp@0.33.2: + resolution: {integrity: sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==} + engines: {libvips: '>=8.15.1', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.2 + '@img/sharp-darwin-x64': 0.33.2 + '@img/sharp-libvips-darwin-arm64': 1.0.1 + '@img/sharp-libvips-darwin-x64': 1.0.1 + '@img/sharp-libvips-linux-arm': 1.0.1 + '@img/sharp-libvips-linux-arm64': 1.0.1 + '@img/sharp-libvips-linux-s390x': 1.0.1 + '@img/sharp-libvips-linux-x64': 1.0.1 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.1 + '@img/sharp-libvips-linuxmusl-x64': 1.0.1 + '@img/sharp-linux-arm': 0.33.2 + '@img/sharp-linux-arm64': 0.33.2 + '@img/sharp-linux-s390x': 0.33.2 + '@img/sharp-linux-x64': 0.33.2 + '@img/sharp-linuxmusl-arm64': 0.33.2 + '@img/sharp-linuxmusl-x64': 0.33.2 + '@img/sharp-wasm32': 0.33.2 + '@img/sharp-win32-ia32': 0.33.2 + '@img/sharp-win32-x64': 0.33.2 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /shiki@1.2.0: + resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} + dependencies: + '@shikijs/core': 1.2.0 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + dev: false + optional: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + optional: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + dev: false + + /static-browser-server@1.0.3: + resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + dotenv: 16.4.5 + mime-db: 1.52.0 + outvariant: 1.4.0 + dev: false + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /streamx@2.15.2: + resolution: {integrity: sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg==} + requiresBuild: true + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + optional: true + + /strict-event-emitter@0.4.6: + resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.3.0 + strip-ansi: 7.1.0 + dev: false + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} + dev: false + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + + /stylehacks@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + dependencies: + s.color: 0.0.15 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /svgo@3.2.0: + resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + engines: {node: '>=14.0.0'} + hasBin: true + 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 + dev: false + + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + optional: true + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + requiresBuild: true + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + optional: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + optional: true + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + requiresBuild: true + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.2 + dev: false + optional: true + + /terser@5.29.2: + resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /to-vfile@8.0.0: + resolution: {integrity: sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==} + dependencies: + vfile: 6.0.1 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /tsconfck@3.0.0(typescript@5.2.2): + resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true + dependencies: + safe-buffer: 5.2.1 + dev: false + optional: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-map@4.0.0: + resolution: {integrity: sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + dependencies: + '@types/unist': 2.0.10 + array-iterate: 2.0.1 + dev: false + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + dependencies: + unist-util-is: 3.0.0 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + /unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + dependencies: + unist-util-visit-parents: 2.1.2 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@5.2.4(@types/node@20.11.30): + resolution: {integrity: sha512-vjFghvHWidBTinu5TCymJk/lRHlR5ljqB83yugr0HA1xspUPdOZHqbqDLnZ8f9/jINrtFHTCYYyIUi+o+Q5iyg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.30 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vitefu@0.2.5(vite@5.2.4): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 5.2.4(@types/node@20.11.30) + dev: false + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false + + /zod-to-json-schema@3.22.5(zod@3.22.4): + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + peerDependencies: + zod: ^3.22.4 + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..06aa677 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require("tailwindcss/nesting"), require("autoprefixer"), require("cssnano")], +}; diff --git a/public/.nojekyll b/public/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..e755274 --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +beta.effector.dev diff --git a/public/banner.png b/public/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fa7f5a543a7c8a9d088654131d4b4c2e208775 GIT binary patch literal 94627 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

h{TC4lS zo|HC4OpRoF`P3)c%~AhlxgRwh#{f1e@iy55Q*x+^dT6=q?h)UER3{1(Ps~tK`NqR= zzpXeQwyn7b>?7Z$3>T<@gM)d>o6SsF5ijg{&K9RrF6Yx;D&G@%C=58K&F*}(>T#>1 z-w+w3M}sIWnRcCOYDzXmzsskV}iwI@0oQ#W-j^kedvoYVeL|$-Z9@9 zt;d0NR!bOuoAsEBr3sD$VAChh=gx=^=ts2GCc=@abb|PGA2|o(pPTJrEcy6v!r!49 z-n<>M(Wrqsu1;GgMfPmx{OshtROh+N#B;999M$Un?!DcKS&_K$=9pRNK?bnWBwHq$ zO1azDlGhjUT017T`9p+zdSPo>e3vY$sIA<3N>9|+0W_YG_nX#u9sN$MREC#4mL5n8 zRwP_iWa()dNI*s~S*lfTv0;ukH*RUJgwfCQM5prC7fw3o+_UvOp#a=l%-+X3#_M;s z3L;pMub=nG-BTY3_e~11D5)wb#3MSukFD0;OQ(B|ZT94R{0hSjY;XI|TQ`Ue0pB_L z9~yTxpsC5{YVWqZJ`mWS-N1|Mt(fXn1`_L~@vm;r!{h>`ppyr1>%zmaH0?YV^h`J5 zlmCuZQD8kGylHKpy(coSFR13vwVL5JBHhP-xRRf`WB)Tr@CjGleM!g&d9X&AB!6d0 z3fINsh9jXseahNi`NU?~g1&A3ti7&1FMe{&eVo|%79ZD=*D}F|IuQ`9L8z6h%+dvn z0$v|$y6JXVk)BG z@j2+#K->^gVt;5$$V~9ip`Qs`IFkU7Inn&Mxz(DN+3Uy5a;d`d8txki9Ai!BdmTgq znMltuKHZsfC0%3wMMOC4siKkkJ9EZQU{Ak7*dXhYWR(!zAp}Wli-qol{d@;VD0~~L!Qke~0$f;Zu1K#p<_^1kQcUgXuTtBlQ zAV{@6v~Mr6vB>NEP_ZYB9~I!tZ29F$ObYHMy<1)Dc8z16%INV|7o!=RUfisH=(O?e zWUSWi4oeSPuhfy(smQMQ3!5AM6KWwo4!s0RAWZb7c~5BG=N;9K)^634L74r|LUYvV zA0v=a{D^BFB-M_XqVcNxKCGL_O3 z*?Z5g6>;l5d#)+ngemHscREfzo((h`sOVe!uv~1#JZUB2VgsUu5!8J952NA8aBDNJ z&8pc%7KgJ)_`;&)Xfuz=uHm@4qDM!Q$N++NE3-fztWxHHg2&K}%eVRs-gv5sIjXpI z>>@YkvP9)|Lt@V~K>w2nd(X*5F(=!hG*TZXD#WF2+et!9$)o;0v3O}PqG9q6bkAIl zpG=+GVtaJuz*^Wt+;!^W0}B2VxZ}-V+HgfelBjB&06AQsDD039L^OY$GcW#8kVLr3 zsvcJoHz60&265+cY@dm^6}Rs=tP>--1WPg_G5?)VT=2ku7j9OK<~>(_{SlPJ?R)yg zXOGc_R`1cU+4mgD#b+{D%i~1a!Mdlm>k-9+v8+Q|XS_1^!D-(ED;YqdeslM!ytIUQ z16D+IP1^7@4W{xwsSe%(*AoJblpb0Q1&S1H^)xec3gu|Gz(!}d!T8OTV zB>G$B*NTX6dw;N)QD5NHwfv^x9fxu6QyaJX2TG~$K6=HmH4b?=@>qN?cwv(}M-lh< zs3t5RcYZUMa=$`!BrCT6ydeX>0#+VzpGj4oa;}i|BIrqdc0|1J3XwpG^>)9s@m~rl zu~^sVopu_#bNn?Xl^?O96~IS3ASzW7(U{$lQl$BgAe9dj+^7|$=3$k*P`5&8j`2`G z6p$hArV^ngxeL~Dq#Z$zNQv(GnBN~yKN>>9S}SPBR=K5IXwgF7 zEP30+hHRPodgb8Hn<5dH53~Wo4=Qz5A653!0guA)(8p^x!KFY)3mTth=D~Sx(AzuB zQz$dy*YVQ*rCaoH<^`}#lBwl{=ewRJOt|mw+_?MQ6gqCvCi{wbFtN^Upa z44B)C?GOJoYxMuWH$B)h4Ee&ZL@2~7YJdIuiE*Z|a%*tf5s7&0Qw{n#Fn!?ynBG#M z1G>(Td&hTMjWQs!o)T@rsxXP;uIkp48u?3aaX`E*!mJH$Bz#47o-t@7y4KIjj@JO8 zpk^FxdfDrqKf-3q#2(BksuRroq`|Hy`gtmmz4iDfYkt=Ja+KuG@>>L3 zA!ko6PVtrL^f=UZ?5i9Ko=yu~Y2Jv-z5exe_ziSi$}#F_ppm|UB3ssK2%|$JUET-B z`7i-JI5nqJbIo?NgKn;=v>fBm*|Ab=z6A5Ti2Qs?*MTmE)jEY+)l(u5rtKT ztO_c$wB+C`sDR!}o@!|f%mp#%!1f8-8$^L9#@w~M5xlMWaecOIr;~$EU3Mdb z<_C9q!ff)#srGs296`0_G(Z<*wJBi0ftGWtM@|HFx!vm3tZz-3<&XCr0@)_gBoy6r zZibebF-g(dVqbQ6_TcFUvn2=&(Z+Q7^El)@vYuDw7=ECYSp zyOccHUz#Y5E^PKnyzK#VF8{*~yLA1>Bs?k3r*%tA$~zYLVSzAv>c0-(d29D~mo@Fh z|FD4$Kb%#Pa>!g1l$gZ5XWom|+tVtXBu5=7kbV<_)mD<(!#jX~FU7*lmd@pLIlF~eHDk?0v=Q1!v&QI)T694#PA&#s=vw;r$&u{m;lIrdd~gaU2i z9a%H9ah;V%BeV_3F8FDO!h;H9TdFo;m$F0Y-BM%`GUX6nl=0rtg4T~B4Zy}jGJb;I zL=NxT?SQoddH&-K7z?9(}R)FYX+)x=yE@#$4r3 zi$v;Ov{7d@_kDSQZKwq5!GbNB^x@i1O40EL`(~)SjGIpw=P;0O zvMji-w9dR^6SibAYJNu26?eKVAoZNmG9%nNRQs!jrTWbQI1Z3R<7)?aVg>kG!;t>d z3^5XQ;-m7bC2}8IjU^6~4jy8ZO^Fn6tixLvHpx$hked;>3IJZPF2D;S@oJ)VxCm#Rri2RBy>ph2Ho zN}A0~{N^r5jo90W5(bu(4I*FSKHQFhx(zxgOMeUnC}i%f@O@ITYdkFf76|bDU5sX- z6Mo5C)PG#Q2G)`me)53kjnBAe;q~G{L_;n`BARGkr{-(;>0_q!N6HXH622|)yJ|Xm zGYGX4t+%r(`CSMC`js;O7qiCx4e+ZzLlUhZTpG@hH5^Gz^_j-u&ztkX*%8s?D+n<% z8o38)%lp|%qV(N+1c?{2BN!>vl752-slkNtKZHgoI&)B_)2IvWm$EcJw!7>f6gM!* zgW<*v3_2&rU*EK>!hGMgq&g#|6DZQ@H#d%-k6%2ovBFT?g2B92;lDZIK7HKoaF(>+ zxbx!MTJZ~E8*oJi*&9Y`ye7WH-WKql{kwv`*uhaAO4nee#fG=orja^`*UO@9@IyPgK{a7`c<5c(xv{leE69al8Ry7>uh)m*49B3{&qxCTLml{d|$W| zargdVh&$&Tu5ZQdr&*Q(Y+msE4o^9)B9Ue!G3SV4Z^BjG>~>iK6LV9v3Q_LOB7DY_ zP~5HLbvo%cFIQ`QtOletnhpb+-F_0BH#akDin*lXwBrN$$_NTtmGTeOSTFb}dCpU9 zIHwOIs3j+3r=)Hy)jhVgL4=#{sq^)13W{q%-7G;_Srnq}HQj4C?!iLbHR@vE@D$)t zx4QYuQn#u3IPgzt@E;czk?X$__6v~-q**(1&Pl;YRhDTuhM$#4SXvmV#PYMAHxH}( z%<`m3JVboilhh#3(S0W+K=w7}!v-|)RFy(_@;SK{AAHv@W36>JvJoXOT=VQaL-Ey{ zw~9)r2g%GUrMowI^LT`+rd#N;U*v;XpWL#4St4Bm^0{$i`BwU^^Zg8If!8ln`cLc+ zE$>NHyk^)_nmn<<@ptuadM=Z;Hp6O+IpaAfpDu zA#h&<$%JMh?3;}%LbXR1;MT3p+sg_H8hOX65LMrbJ8uPcmu=iW%%lUF=@)g04HAwXAK+TfEg$>?N+8d0XnhIkqij1d~W^cHkTEr!a~?p@d$hBhiy9dpl=8&Cy2Bb%td%88Os2a z7fx_n##Fl9oC{fAxeegq6smpgsxk|p0yyad*eQ2%-^Fyu-8C%CWHw^`n)^7-TH(9E z%^I>~O+jbg@L=oPAhiSC*`tYC_u&QZv7u|6Yzj8MwxzWyxK>FM6VeH#j6bYf8jvA` zogZ(_=QOAxmV3H!=l&c3faaI7^Nv*rNs0izO5&KrE+opM$SR(6ISavF%F``hmet>z z&|2@E`4}xnc7HkCuQWO%`s6^4r{35dpzb|JdPb$JQPeL2Mz9eNy~6;{WisUW$j%Db@D z>#g(ql?tgE)8~A+VaUd6WK`{G-tzdP@7tlvd_t0JAm=3;!UzCmDyNe}GDa`3i^)!0gwt#nnlff?bAlv(a2yE*gT&d*GSH+0hn&P(@5yS_kEK;|=*MqzH#lg!##g-1n>|XbK zw(B!W_GYb>cV`J>i3+Pvm$$J+S6@IM%0X(Jax|6`m&e)@ow&(c+X`ck$`x-h;axHS zTFb?q9#A?vofN7{d7nzT%G1PEVWbA^8#=8xJKHAbM81+FA%6eHZe({IiRstA8j_%+ z?5p1}4H|DsS6BIwncmGyXR^8pbfC@B#7X|;y|1f2q_E3vNYk#BJt_b|bfQ{#*qieE zMTh&6Trp5R!!`-e3lVd|e|GUxZrhBkCTB}Haui!=WR>-yWavvlK{2bdC1?C5NmAOSBPnwyMqT5&3o=xswp${3TE~%CV#R*eh)#0MU zGqJ&8Vp=D`Kj45Aal-aAjAFCuJ5i0J1+WR3dqG+pW4qffSSRl~8Lz7Rwqp>K$HiJN zW$T9SgHws6h7FUSiJ(j%=GN|e8Qeyer$r0^djSRj2mpBNj6cxOF}Yx}EEIauChNcd z`>P?<=E#SoiS#R-%UNdYl)KGO`JDQ@`^H}rFZ+Be$)e&d=Sgp`Tsk2w*D(4sbwgyC z$mJnw_n_oAd~~+@OmqwSDO!R-<85X+WQ);rWh3{_9P(O^2Q;C+bNe@HxbIwmM~iY6 zpCqyS8?h$_I#`)*au`m;501|-Kegn&)23mN65}JVaT0EPKsFQLg{nw>1K6K44-)3g zF9IUE3kVJD;^Bk|#g^u!_O?}g#7b)h&p~2hLKG>^4DyZ-1O=e7F9N6mfE#Ud=Ml3< z#&WlMv`=uof|#-QtCaym%ams=Mf*wI%a}U34{FFFRmsR>vYKj1^pui zQgyNi*Ra5>ty2S}yeUdc0Kns_wNvh=CiH26m5;X}pZD{+*#H20z!ibxrQsHg&`G_W zI4Lw1_boFHh<%iTUd_onc7}G_1}T&2qJ+DeK%W0!_#{T?b1DFj3}qt#0N0A|5vJV)!^czXbOL;^Bw~q| z5G5KyMUob=r5bk3ApH*~-t1EMuOXJz-?HjQUJ+E?NgHd!la~rEFBaI(w)4ApS|Rns zR-bW;oyO5`Ycnmntz%wkO;Xhkr#+eX^tYgC!`GoBvDGu^h_y|LlH2enrc%C5xbPdQ zO6(Vktxv13YC)f;d;qvg7(LPcPt0kP~eW?jO zr~LK7kLk3c2b5qW^$kh1t++k@*9AcIF;z1A;vLu+R&N#~OEy?pFJo!OfYFQ#8&!CbwQkf>Hee4JxjOE*^RmG|2@?!J~(sV{Vy4H8$A-C9m zC%E%<>YrImzz5+gCm&N@JP4_5$sX&|&;tOL?=jg^9^r+YoV;Ogm*(SA@mCAmIgxiV z+&e5>f1_N~<3rN=TlMpI6ECf(L0NqmDg&~+@=0{smpIPuqPo{VqsW&oF|vxB?b&2F z=H!_j4&IpREl&JL8OBs zkN~0gj(}1{2)!eq^dcRSy&n9&@7nutpZrJvbAl0`Rc6haxo75HD?|x)KcY%Ma9xl| zF%)fN*e3FcPI}GDq}96|t1!NF(C!w1A1jqLfD<{|7hUGte>4~AMi8g2Z;0*AN^%ls zJc)A7GUKX2g75W!(a5=b>fLFRCd{3VhCjq=s@e}Gzy8(j@C{GQJaLu|0Wv{+)ow4P zCJnH#G1{Nz{2aWH#wmSx?I!=NPi@bu2E69=yT{P=#utU0Q9!h$xaApU$3Fo>_XAO9rh_5>y_zoN~D)`fGoTs4q)TT!4JFcDL4d-XuZfad- zMADBTNKCxu#DRMG zDknY)<3!&lh2{LkVdq3Xl3JK|P{TAd^Hsq(1|CIRoo=R(O_*Q-2wbmrt3gMy@b!;% zbV}KIjdgoMinVM4bv?0iVE-h%bhdk8xi45esevHLZnAH{$ao>@qa1*P#0{&nwda^D zzbc!Ao^dWG{;V(u8aO8pVP=bF%Gda@L{TgNxiC@uZOTeG`_suEW6l7u2m;97p#D1n z3GGjTa-bTIjo zQxx&&b(wu>d9Ku{$_szTh`J!QBjW2RX#Q=gFLk-G!h~GSv~k&vpY#(IO{`d%tIBFf z^H`S>m(8C-qO}SsxuQN9s)39ev zyMNT!(Ry_n$P~!9cz=CAgrveD+8NOWZ<3G|_dHb3;_yrm=!*cZtaM$OKyw@~PP z4yFM+XTG7rOfBj?`Wo3Vt}?*6E*S<}dIT*A^rVMJpX^(SHpZbxrAK5W&lCCc4!w*d z))a1v>V0a%8V&E-&&-?u0}GUtk_5;AdbCXWhCa6yaccgaHwRzC7!dd4C`Rpk_n1zU zxOsPg%yF;nTz6IL*pK*5u+W*LS5IGp$>WvyrgQ11#u&ZAg7-v;D?9IX=CaJ|=*d5c zoZluUfF|#~nmb}1H++6cq2n`Ok-NF&oY;Uqszak^EcAE^HxJjDoM|sR z5Jvtn_S$I$OQv$V6;E4P`~~1XSTdhgeOoZ`TYAM(Oa6vDjcv<R*gqdH0Z~hdzXFP1#|*Ia~cSsa)ESR-M!fdRqub)p9nr~h%t5wSeqcGr6#KC z_Uo=62W*zZk5Ju-^mMSf+@~oCDHFt=b>n>cBIPgZ85a)rP1$OMqo>$Q)b{RLb|>P& z3#&`5Q>-oWQgyYdR0~&@{%PA>S&6XSn`A0JnW`T#e~hko{${q}Vn0+X)s~&DU$@Qn zwVlxQElq5VcjPErckW}F`tQAl2j_8w+uGB3V#<$A!o)>b4hG4z@E~f>UkD0n76QFw zTt5Yi16KmDqkPnzMAnmFu(|*66Wb3Zl1F#`h>YCxGMr5z0B4sK^&~A-EE)B9`p<(l?rCW+XV9lix6KkJOr_q~}_Zr(}w@r`^h$#N<>Ykb* zqNXr&!nQ=M%IG3ds-gJ3N%EeQ@H1Fj z2!FY(!Z}rBP?XcWtjOWEk9+Tb6XaVwkTE$Evb?7TK^@b;~qFK^Ji z(B5#;>2Ans=tFRv51Kch1uikb(mdV40xx}ZwdP?*6ocf%PY0IdlMeXV+<;<;mv_)Up!+RN&Bz_ zIo%2>U2@Cr2~EJBZ&n2j=ReyQQbsG#=<3-Hdop59xwUK}%ewIgM#46lie!PhKII3W zAcm9@HqZCHF|$I)*U($v@_1G%3D*8>CQ81Qa#EWE9(}DzNpg!N=K^=PP~4;a z{yT@bm{m#IdyRt52dd>7CVj_vNnwubHfi+nYp6&|=9C0|tAK;AoJ8+kHn!}IDUdF^ zwU|<8IPyd{$zDCLOp7n-qwbu-vW^12M#-B&9)Ro9E)}ld-S@1_v7p7L zvKf)o^3f2K7~bd8%Zj&Ul%q1utkUS?;MT{=_KOcE7lUexvxG0a6#3oM(BiEw`eAEF zER|x;WasUj2UBH}o_OJ#h28Y!ufYB2+ui%$71P|4vKs!k{v( zKz6c4Hd}$VLpUTuN{uh&9HEQ}m&@(oka|V)pn*T~q}C3Pp1dTw*Xmh%Bj3E@=gSbYpHf5edl(*jaz3hliv&hUdNn+syM*ZA& zpY1H0pHxDg+F8hDE~QtI_|pJ#>bFi>oy5u1bWUp&KTxfvk< z?(Uj(@ymfy#H;QIagN$rmUQ8+e>$fgFd%!#A}IvX>T#y#xLmtygX5GFEsBx^dT1FQ zBT0CBk{ZOAKnZb2r_Sb1W_9MJX^Sfj9~pevtP>v6Z9l7h(?JOE zm=y)|$O=dOzA{Xvl{F%2*ZIP0Mn0HEN&*WAf7CAkpPilwxddjl&6q9P;~Hd5`I`>v zyu{ET8reTCq&eXJT8%!IfS*CF6xZ5t;U@D!As;S#qfEH6`y%cVG9v_sd}=efy>Lqc zY>$DR+#j}$?W6OWSp{%U3ChbvrW|YeVJ{ik*4NJSQRfAAgqJ(QS>jX-YURA8dUCpy z?gqiGcxo$|qWZR!mR)hV7#>1YQ-g^7`98XRNLS`$-vC%41A&V+)qopo^5uS@8F)Cb zZsob-I`xzh=SiONayIPVo$s7-nJuyySKQZR*jd_0#7J6QjBY=3r9i zGVj~^AX}pV?X{vy6ou5S*oTyta!6-#m*_|xdiV1Sq{$@4{36qPf`}OY(H<(2c-}$F zd~}8y2-n7g&|%;ySZ!^zub@tjLtP} znr8OK9Hj>)UKoxoxE(2Ced~ItPgwg>{Fsxb7SpDr>OL+2q0h=X;fetez18aNYLpA2*Rv@bE?@gS=l9nb0lINni8T zp)iAMR*qkX!uE-|zjMJ$&z==k+jSMu78h(w(%SoxcdLyUm@vCPtI}W5F7GNJdB@}OL3F@q}p&UR+!3}Az9WPd|Xr3?ENi5ahhjDiJ z`!TBJ!;{Ap$dgwuu`<4UkMD(UH(VDUci(IsBmc#5aZVDBpH+P`rJ6AVXa0a+t8x*zv&}i(-PPQ%zDu zb=hXL{M>t7?e+5u@Awy%EDKm|diaEUK4*W{{a_Saj9m*~*v}i=hQIF>6zLYVI;oB= z7M@)7sq!cY3mi(V6CALM>T0!S#^ckDzQxeBxDLtr@scReaW#Sh0~ChZWz9Tghvj^3 z1Ngk|HNa5H8h2OS%bt3^3%x7Qu=2L_H&GI|epN-v^>x|uhbP6)o}-@XUcOheNJ!)5 zEw*YMTn`YG^5Rzr5)L2;_VV~FZeq(RCzD4_c$Y3Yyh3r2qLT!Ve#n!eSHDOWIUdpf zE?QXaV=0Y~+9dR+tvD1gwbTh9b+R{W5Rntz@5T0{n3AR50cOFq7kQ{FHC0mesIg)F zV(F#*n5<&ygO`r@AJzazvRrpGHZ{?!ev?2=k`ncbt8@2%Bv4~m>%l)6gT5jc*1 zj?K=XM;}M@(c`J0jt?PN$#BL=e>K{X(MSjqm!gCXsv&}9<^_8nqO^96uK0#gG#t4& z!p}r6Z)fDeEDWu1oc4CLZ-n5H%5j|rYT=k)ZPgNTa%srYNO8I@F`T|hNshw^#;po= zHO_r{r}Yx3c);yz(UMs-=<5L8ygA+cw8Zq2Z}gh#NQO{^_=L;J1DYl&+E9I@>_6zA zM>KlH3>!k{UgMM6an)A!ShonTWku)fJU?}JHj^S?%^=9Rxf4ZQN{Ou!^d=N45tpZPN~d#fqeEvL-wZ3UMy#ptKR%( z5>{tp-Q|AXJS{9Q2BXg$RV53r*F)t;9?TO_-^`JcE^POTRq7i=qhehzz~YhjnC!Uj z2R4i)m7OifY#Ru>$$qp64Umrx81zPd2AP4VmjIKjp!H;rnKGkhX*?Y|N9pw+25C4| zt?rV2k9kUC-in%q3YGzfD?J^Y8_LX5Z~>*pJERdvI;8zt?IPh$4@NS;y~y*`iALlb zOfd2OctaZDr^@e9EbbA~qct8&|L!Ix04aL>zV5@)uJgb5*5SA~!{E9no{#rL2fN_m zyT7z2qU^$jFVFD~_DjLpo(1c$qaFcRC~{K?I|0WmoshyFoVp-+L~B)<6+_r8=laJK zNK4CpC?H%BJzTnhx&Ms1>dCXyG=d(?(B%s!Aj3clq!mLPn5JB zdA@Uz+eNxy*~YZh;GlhB^zspwSq?SIbpIxcN_JbQoNkq>Z&almh*@AT43y*w?1+f> zLek~?ENOM;K473Js5jA3L#7kB+4Oj{*>^#mu-HPuRLNztiYlMpFk;phGge*9iM+Vr zAbs@5Xw7rWE)aQsaa^a!JN%nAUUg~HB&y6!UFoHV(pI4#12($NS_X_}Lh-vGj?6SP znnX*q}(Weop5{{j#P7zUI83{;H>mq1DuRzsEeYcz5ajO(MlqXwchUr*@@FLDAu z*)V+1ho5EL5(`0LsmD~wm_MTYkS`FP(UxVy`yb#V)zwu~VeRz=a}sS1acxeo+DBwV zwXs$_JD1!avBM+E>5(c}Jz?=LlMhfkZc49YF~)=WbaxOv9c5XeFjmg}UslUgZG9m8 z?|`sgPF~KgZX8BqGiJB1eDO0C$Ht#)Mn7e?HU>KoxXO7kylY?&^5*dCGS!Kqd_Bht zQg1?Av0B|iyJss9LSKJinHxMOjO*a)bH!8Nz%4hJFScndIY6<*H9){J%`ij6Xq(na z3v&b*^e@G0J+ujhO;y|`fek!|>_r?h4kJNJh|p@6s94Qa-JwFlo;xAszo#b~K)9%B8sqRXlM^Tq?3ZfHyTsyUMW4`nq;dq;*f;TUS2?^9h4!y|Sm(uA^O-Ni{oL5%OZ$$sU0mu`2(02Wlo-KSjLm8O!yJr35+gd$bH^bVFLq?v zrSu`>$JliWZ1G^DLHMO<3Lr{J`lAo|dm*h_@Y z)(m_|NvBNdD?5f$?0z}-exc>tW;7R^MA;^(jE7jO%~iREgkc%G!Z0Rt97eC=BZWgc z#Waw&atnqv^>6+w?c|6y4!dN*fWa&xNZ6ttj?vuDjV3DEJxWPX=D|u1OMv9@f5Z$H zSRz*EVBJNVCws+31&`q-!RrL0xSeU_Y(wj4(+@4T7X?Hfh>FXZFT(?oSc3Q(vdXO} zI|61u!qv#!5aUQ(Bx~{L6vxuvt_PJjdRjuK5^@LRPi`ZF;ejnY#}qsgyK}jleZ69u zm7%O%_8<=P7lZ{?Ujpzt-3_C~usFtG>uwMt!5q^OYQymw8-3<-ZnNZOqvzU(;g-p~ ztfjq*&$pEr8mlonI}HzWJK`ehCeG|l#dYjz5>JlKh49>Ot4Td{#k?>O!*xvF0!aPL?fG%|~)w94LrnR9`eOD!b~>~B0N7MgBUEEK|==OBgwdoB)H zM?^G1#6^)N;FzGD*{T!TaF*fUNG-DGgVbn+QC4L32ad+v>cn0(lMMB zA}*YBuo+g(qoEo1^n|PB(W9`LyB10>?oJT~9qHLkZq)p69p2riKS!Pq#}m14$^B-) zE0~1dhNge_iA$t&PI{a@Q;Y9JDVdq8haKC|W?s0(oOO2Az_AQWKIL=}S3qh~+YYQM zPNyiDvgX~$Y~MYGLIff#s>9HxNQ3RB5lK79ur3V<$YQ`()b@UBokMwtf$NA(0)F#k z=@lY=Cs+<6pSvd6VERLWwXaT|XJNjd%_!`EOX((*oA{n*%l% zL*XZ)gz3C@i4B_FF(k0aGZ5&8&ovRv%#g|Zp?>`A@0suyJ0wdns^>-0SvvCQ`0n71 zN=XImQ*v})*)4lw`{QF<>&!pQ;GdG*ifp-x zR*S2O2A@~pMYnKWE((a6#C-Ybtd!x!6(7uTVdiwRZ=C5_mm%HWf0*CFgCgs4?YuWb zFl7u0zMTHGwL@cbS2+|wsrkRIP4!iIv`yHOAazSb9QY<;(D=Bwvv7Ff6H@&}&+-daR1Mz7f z21+xe)2$tbu74_)$g#t9!2rYiVPT-k0U-Q3fNJQKlcGu-W)h2A5|s>zGv$P zhVYk5=oCI|wQea%^k7=!&+rX%!&S7nxlb4>Qz5BGPB4zEt$qAhEf>?l)^N8edGN7@ zY;NgN94IQN3sEAU5|`DHtH=zhX($@#t4ngaQ%?d5w1aYm=^in01`O@@kc%L-^LXJC zBBU6OCc$exE@QzHB`dfvbIJb7@D{LBA0m;#c51s)tzz*AeC~?Hjkye}RdjHqRLSob z?rP`R7Of`x$Sb9U>ygAWK=@GIFz`nlGWhD~e$LWBO7ZAVd`8_hA!(c7KxEkJWH5-> zItrJ6FO}=?OMT&J3Klfe(m=IU-{7lcA#?qu&oD})y5e~qu*%K+ZQw~_jT2SCxSj(M z&=TaDZy-OcqH$H2})+A zqX>IM{6w$)nMY{McS1$iqSl0o?sK6L4LrW4__rUI4`}!>8l=OtGK=AQilWKtm>CcL zW^`Y*-2n31!op(7B_*;;&%f#D74j{x;)&Hv%ZdnHR+Ll+Q$a-XS4i39$EvlCB3eaD!dEDO^#59aM2w7?MxjDn_$0)^ z)EQN7y%z_&`Y3gx_q{I9u5+31@<>~Wh9J*y;d1U1IMW*1!?%imMI6LoFV3fo_}SjY z^JQ=%bKchFei~dyl^+yGsL?pdmY<~cLnVnD<$VpTFi`c(I4cB$WsM$q++~1?n=cf8 z)MxFH7KyX05Ni~2?Z|WZ=f-4Balu5v+uh4b7_ATInayn~4X5;sG%6)dxD5UdoBXn4Y^(BmSFQD&1L*wuQ=QixY^ua) zobb)DC>L5g5wgf0MgJHKD+&H`MB5ZnW-s?f*|B%BE>{(B1qAdGjN$?}5s%}>lXn~H zBE%YPwni~^!@UM7|C8_?8+HT7%dnNP!?$p*uAVi`#-BH^#eE?q9kwW0jmLxeY9IB= zgj#yu8q=BQ+-8a_%lT|pe({O1pf3a0YVoSi(g#KRWal9A1&z@cZ-H@c6NQ^ z9a(Qo;Hx{q!9V(s8EmmqKhsYS|2HnbEE<>#QErf9lE2x3G02GOwRoiYUU&6lm(W=u zBb$7Bk-@O%34hY}>rdwOxG(=3yjii{>bCgdLu}`V#rB6IaYoqh%GDjS-7mqoP*AQ) z{wA5!5p6Pak>mB1asFLuGQBZ1!{W(<=op<X5cgrOM0)v3|}*_+EK;`~DvCTzGF!Jdsheci-`!hYz+F;u8Z^Y-3lSzxS zfSPk!)4QQ$$d3gxbOyOGk~v4=72_Uv)0~V+%%#hKXZM(I_5*5i1vXaz7(AmyYK@Vj z=n0+}h{!{Jn$>*6x2;thi9ub67efjWI;h0n;mhNj;8Hito-s7U3$Quml@5jRX z?>}Svvh%3K_UG;@x@ds0GOJ?2Bs-iZvc_M~jzn4@)6ut&S)=e}0JEGBAv2io4`u~r^~~IRN^bN4#N=t*hc|RQ_2wUJM~(~) zu;zh&mQItqZ|GNG>0ghJOb7Va%^3oUz8O6vo4*r{iQi*OT}w-1xztpFmy; zW~USZXGS0Gp4`5NQ^mmytX|J5=<1$hcDA8_4dpSy*h+uDU0geO5Agv0Ln%^r(hDYm zQ9V^sNdfYQQC`p-vH$t!kB3zuwCQc&?h|0+SO}fw^zTw!_%rAE;-1i85HY9bc6;Gq zGFaP!kUG7yjYZb$KzFpz5M+%^K0|&e?0np4Ku?!#ZWCg?;u`3h{o~hk9Q)*?zFW>^ z7%Y$g;W{B5>Nb)a+&|S);@B;aB$wLK3J1Ls0Tltv=sO>z)yk?iys&V}@H6tF=W;Lh z{`rFeBZt+U(sW^gBncA@a&fkHaW2$C()aD=Z1s>2LEEFJ!hi(|3(3f&1a6i)Hxv#^ z7=e8OrV?oOw__XqHj?yFsOSrxz#iy7K`;qzY<%gnGB^r+`de{;eh(fk1!!jAksKFHl--2W;5blipS{{9ja zspOxRVfA@)_?$gpA&z#V(jw81pX@=@vR}Znfgi97f#Q;|IR~e;tS|dT&qzRGC++Vq zBA@%02wo4g{E#&C*w3Kjg1&~PJ>NwzLeEp#4~&ZP{sVhz19+kX1|wWl_$r|0Cq8yg zlhPs=n!%u8f1n)-9&(H7pJL&p|1=hM_kMUnp1)Exmh=bw|I+#|AmnR|p>sBDZeRBN ze;ygr@8~_NBxNqR&6m?kvVUf8A|?b?kw3+ehrkb-;wL+Fpp@Gp~{!0prMcUPy7*b#Wl(TRA znr~PlNg~fjotay5d+#phLDRl*P4)PYPRUWX$V7?nb+B z8_kg*Obx*emYOz~1`7lP8(EN_R!|nT`8V&vDmA}*O$Su~G5$KOK3)?SH8t~XKd5pW z<0JV#IZEGgPW;`(iDmw{w1gg{GhP5-gI z$_#bj5}(M80xFslc#X_rYMn2=P(8?J7aJRP3BLr+7*K!dyBf21cU2J-!I?-jd$#5(#S>u4ot+=g5K7Scv0vhgUsal`z$z)Ph|~KkUed zJxxiMD{2RS&zzd1zscNYIFgZn+juZKsaRpmUX42c40w?l(zUAqVmyHRfV87&&XOd-oD z1q-L@+0ORv#(|2 z*mH(&exO^vPc#=tc-*_r~39#*u>zuL&P)R z9Q0t4v+TlPOfx&wq%I$CauWDCTA_2(IoZx92V zAGj`KPhSs9n;zmDf6c{>@>Mu?Z>i`lwp2jR$PBUz%rvJNbJY}F{2v6$HASG>%N^d*EpFzV zn(-vU(ImTA*d*TAsYXWT;H3(E%GlwAn;B7{Y-UB|RKlm&L@SsoI;J)VHwwX!$(=SN7hUAA4~PzHck=Y5Xh6~ z8>(5W672h6?93;AnIn@594Ua!DM9P5Gr!8->6YCB4^-uo`nzaEd~2?QG3TLKCI|?K zt>d4mm`zpU@}R1m-zjV`BI!s^>tJqHlgB?7-lqGf7Bo)g3Z zg2We$#+*LG0olQnb1M+v-Lh^8eL;T2Ifu%9d;510V5(e>sH)66xXy%B8OpoM1BYlqE8Q#K-XaC$7tfP)bbb8?q%kg&4(uL*go=o zOZz{!I~>|`NiEO|3k!4+nD68g@UaQ+-jlF-WX7TScLEc@F4B-I(mH3OpTEBqH}sFB z`~D0v=v*eZ1%k2q*KB7=dbYILX|*o%it*3I+SyJrc|T0* zHT-t8ypDS{q<3VNzr5^5@eGE!>curG1sQtlk345%fE|et-`3d_P&o!F)N(zr2=GSc z5GpqFL`sPO7cuKXT-BVw93xti;^O;O+9y2C6s$dxGTM2uE!e86_td8SdwTe=mumnO zWbcTiIS~R(xA%A@j>#qINHDjJ6OC#h>-GLQj z;@&8)s#**`QmA^KOzALkW`}oyb`rIH(Ohluopk#b`zlEBCOqbb=+?t`ze0mEJTeCw zTm&&@+!@7IcFv3kjCl1=up?hsX`3KGJB1$ zMl(v&)(by1-;b`*=cH10ykk!fw=2>lO!q0;x0vu+MZGG^EC2(P5|Dy17YuJP9Hk%v zcH~ykNBY6?$T-D9@rBl6tdmMs-&0=!p@thTHY?)y$wN%?(vVLX0GerZc?z(Ayp4(b zPCVkXgyO(#(XbGF{wFeh_NuHi%>kr0f4%`AUltmcHolF_CkxYg{mv d@Q1a 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 C&2U@* literal 0 HcmV?d00001 diff --git a/public/external.svg b/public/external.svg new file mode 100644 index 0000000..1285331 --- /dev/null +++ b/public/external.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df86553d390a2b926a0f25942db42e494d057ea9 GIT binary patch literal 15086 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 n2pSr%%Zagq8_q||Lo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/LexendDeca-Light.ttf b/public/fonts/LexendDeca-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..485a97f1a94aeccbaff07ef4ea7d79d88e305594 GIT binary patch literal 78200 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LexendDeca-Regular.ttf b/public/fonts/LexendDeca-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6b42154c37b4d1c34966502d609335b6be543566 GIT binary patch literal 67740 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�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

8^*O>v?MAAWAByh^EY zlCq%IAnMly1@GN^xYfxt6Q}sz_KuVm_F{f${>U(DZEQ?Q6tlcMBUws@T@DMoG=iBN zr;d@(D;C96#<8PAFNJ-|WG1$BWayYZcT1~VNZQ2w{4wvDwavxt9keYk#NV@w)Jy|B zPDBQIct)DXSc#~VH_2b6#!U**7XZsl6HNI7{W`x2(0q%!kfFIKyuFw8kFr@a#Finc?5d>!>tptqJJ~o(}T0Ngb58plY)vF8JhV zIoyNp>8iV+D)^bxWL)Hw=la5LzwZUyup6^vyWA) zs|{oVg8kle&;*voo7y`Y2wqy;U6!btp?HSlv3X|my;zuDIcObg?;ja9_@D3&^YtPW zpp7i?%glUMR;NGwKbfjGq@Ojdb>*L&ukU>cif`8E5Y%MiHPTLSg*Bxirve$bfY-Ib zBC;1#uQ+SCftpvIT~R@Au2l3QfYpm z!CCsw*RHBFwIn)|+7>1*_houc*L}R+oR8h`Ib&jfFxc)~d)PHo5h-TYwic8t2p?JH zOyT~<8be|)^Ek!&?8u~J$OvhvB@Vmx7KO;uC)?U58M(qtVWWGe{3-nGJ-^B&8vw8| z=sezGwve~=dr%w9S98gnO`3-1lkXP}(w6c%Qao3SZ04SKc}Mtzf)~!cInyjQ zVMs_m3VxHx8yGT&W+6l(6NhB*xp#BcSjLtFC&#o`uPQF>ZKYR{_0L@4NK{tsw}-4> z9u;{!>`wr-uuMysYQ$e{U&>>&^*)u5!D;55wb&W+s8~$-N7>%HIDp3?m35SFcnD`u zFXijb>3`JG9RS#uDhlNzh1(7%z;(IZ0>&2;_@}to|W-mbbEdJFi(Zq1Aq;TDDMpag7pb9Z03y7= zr6?NAI1cNR@Qrn~aczJ@y!rJSVb816{bvTAjn W{vE`B2ttZNaz8B!xYyg0p}C6EMUCRTEof7@#VF z0#;zm^iGP14PoT8AnCOE>cOPZ%X^bLp7XC6HiR{fge+rm4Qx-e4|oC=g@J|3LaiGa zl`{Bd!N`3>UM}bx^wKO^8>Mijwh?LqD+`ma>Peyo!EKA!Zb4B_Q4zg-e{psROUEwG z4kZ>W=re%^h#3}En3hdd<)0>%vX-DE@a~4cZ`+q~E`y!3kFqtNgWfDk&rMg+zY-?E z%f19zW>jKanv^_BgDisXQ>)B~w)dI{&Nu8OqP%dnT6(p$yJ3{OmyrlIS%e(ja1ITh z*4dj-*d?_sc%aBjd;m2Jdg0yUb<3r?f$a3Q5F>quppF!uL`2WH`TEV}l0c>dLmGbj{e|KJ15+7kXy(WFyUaZix{#oVh~OX{?MO3`a_ym*x7E%Iw$}eW z7gSF-g_+qSUC}wfD2mG5fM;kQ9b6YP#Bn$g=|);%c0Vu9)(3Hz%{|fn z^?D zi@?dT5!`?Wt-uW7;hlDaNzxt`Dv1_{bwnG94XUFc^$)D~8xHElo{NmehR{&6)CEax zqb@jb1$b*$IAAU`wq=4A_J4$W>0ZdI(e!+tv|O>#5uHO^I^ccc@1e~LCmdr-w`GB8 z{Q+YtZy?yF9G1DyrUT1xV?Wnm&NMRe&0$HAOPB0qL`Z|&!52=dua>jlyW8M5P7UvI zV#wYwrb#ocXX+mP)>BJV!hi18yVtmr@C${`jE?_7d};fGEZ8#*ggU$x`IMzOzZ!RM zW``6J&Ql)Gqy4|*&^&)kRL4-ob^<7z2lkAv^*~jJ4I5?F%R0eio}lbJRQtv48PcB=hzZ}Bz#pB0OeG;q0# zzb_eJ2h-i2kA<0)MNIgGk$)}3=$P5N`m^;@4Q%UjuwcS4&gaVeV>d|9JZf-$vND0; zqw?SWI7#WZIPM2g!yc}#)3S(r3dGn6rThRqEO*e6aU#iPDL6|7svC!wMAFiRhADU3 zb|lclY$Z?;OrZnYKqm(bOKZ%7In4`Ya{AgiS%5T^MH!Tg4ds+6#_yrwIPjJozAor!8QHFPs46T&tRnp5mW0zy;>76odM z3W@#qxkJh%RL)=(Uql3F%=yF)wIhs9r3k78#ZU_xs77z1kSa9b6C$a2<3!9Wa|8~x z*(F&(gQyTuf2ZT#D{7ou%YacW*qF=qHp>mY0AuE*OkZO-!}^DE(|#`V2qy6GILdjJ ziKFFh`xKqKL}P*Q6C!S zV_vu}vRupwdCy4PWKHXwDDZ66$}Qg5a2DOb^PwRO1ARpJ+;EMnIcRzYrOQ>n+W=iI zunz7I^4abro;r^7EdQfwbkc@@-~Vqw-7$u!L?#m1##sTH$dJJ6FDL*ZLzSpjkB8#< ze=G#A(8n#`epszDz73$$B$~&l0$WMyd5e$+A4wN%=wcI5=+v%w4#IQ{Pt1gwR zaJq?G@Y;`gjRZ5OzAvSnxtErHuR3qP+O8&)2y#KO!ueE4#8cL{5I^{R75S+rM$uC~ zz+?Cl% z{k(yxDwEt*_}#*iY#ys~(4yZh9_MmXNlX=V8DCm|9Ng#XHrAzkk9M7=y4Wvd-Uhr4 zk3AE&cuyZ9?-lr}GIzjM6Y!{;!L&lB2>xuRyGvt!+$)$9wW>4P;EeiE_)J|YAgT)Z zf}L5KjB?>WZ?QdgX}2SmiOBFPvZU~-23-4p+}Vm41@x&K3u^xF;hH3%6F{C9Ip3*; zRqH*cCVhM~rClmr5)@@;2Bifm#T*elo7qQq-ua}6zhPV%e-yjFg}s|Z-C7km<*p?5 zpa7R;BjF9<1?^nu)hT_mn}V=yrcI!z&bvJ@&hk;K74-?)1OejAE@s$Hk%A`vQ4)}Nf+6CJO9i6*?q!K`jR?%L!WKZl4PkQ}uG;_-5MAs4-TWlA;2EU0 z9R0D>;_=InSl@2{)%tZ?^m@duA6+ks;$Q5gXy(P$`%{T_Q_!ybt8M9YVtnh=aGyL} z$0lbp@d1asHvG3AVJC9zMI&LlXu=zZM6~Vf`EWF^bvg zo=p4UUjwyDFw2U69J{bn+)hyR_F9LzU_pRdGTqNdA2b^ai?Xu|St6pSW2ueG2zp7m z#Qz){!TxcDX`oGRYo>*^J2clSv9Neu)8W9?U#lgNMy8@20#o1&H8O(et|g^tsyb0P zLjs8*HD``yDgr@=Bb=b1LG>m;qM@9tjsy~&RN{qV$N2cF_FmHaJ~L7hnG()~#SPzF zO?#_(*r8Okl7q!ml-O6}%MiugjW7f@xdS804aCR_Fn^Xd(!0RhwQ%QM;hVe+8AtY= z{YwD$av%mVTdVDn#3{htM=u|1zM+sf;-dSlWpKX#ljPnE#-KV-1ma$lyB2%Q|ZD@W!^*cDM(;_q@; zmhG;Uu&Z)cHyMvoU?k0~xkF}HN2i}4$J|h6c+q443az{Z)3`tXNTuH(;9DM%-EisN zOJ5Z!Pn^AU|7W+=FNbr8oE&n8!igZ|D8L;Zi)**eMuWxuj@!F-`m*vP^Qw)p9 z5;@PUX}4P>zWK>Q;9V>8>4~?j(k4wB<@nvKmQ9*vB$j0RN<8|M3#-W9XJbIp#3agS zL55D2VG;}@e=NRbGYGjL2qkot_`GI?%Y_-mrl~{`HL$6M4roQy^tb&Fsx1E6jdoK* zYgf;W&re`iG({$cC3U&~=l0pws+MX&m0PKvc@F?UcVJhU3^>n>jSh~DVF-&*1|}bu zK{(Dv?QKX1p`C`1EjbZOCASuf(S8gXP%X<}_6~l~1MEgNAywqqk1;8rjDYdKCx7H* zmZ}HJazSr+m3Iv2cmRw{U*jUfc`G5HNUbDK0+d7Uw@ceQ4mEY&ZLx=N=3h6al zidE{YGwL&JrRfooKPbcFwUz*~?_hRrKFt{G$gL}>sK}lybAz|=;@Nb=9P{y=dTu|l z9rfHf+7$Ev3T{#EIB6a$y8971B=(nR5n0+U|7i|}bQGFy~xF69p*&*@Mh){r5JgQ!5n0zYA~ z({Avg_sEZ80z364mui_oZ8OET%weBt1_nEg{6nzH?D~iX=IkgrH^TX{=M5dJ zR*@(r;xk=y%-ewcAl_bFkA1ny@gbyNT+aBR$v$Xuml5`tE4r;LHNc#lZw4!wX7{W? zMdD$8S&5HFa?+ceM$x-F1G1cb z#EoFE)4-fO+;b4mZ&V?&M>vun+UC^?21){#kMY=if-#}!SGZR!v-<~DwvEXS=s7}rhPQ=cg{<#TGY^|o402Q&VoHGrISHngCY#PU`f2J42emZ!nHA=7jP zYzp2QOc#>|Lc#e1JiCSQ;8)gs=J)_NZv15SW#H+-fDC{BAzk%t9CGl@^V#h4TzAY{ zD(MWhHzD^CE%1=_y1ls`TdgfNSeyLQwn24UZJ#M*E71Ac0n%w~y^D=`dvPS-epllT za?RFeuN8TRd0)azdrdoLFG$BEacZ1T$DoZ_iKE1k{xK`ELi<8;RT5Y23&4GpKV3&! z^%W+UMqfMD=s`Zsua!q@n0?{STHDpFz&Ow3p0v0XIwTG>u=woRF<14)A9K9aWe?~1^mJ968XKCP^Bg>M$kX?r z`-smhNh>lWu4`_quWf5?Op1Bk#wvNTed~wBqfgE0J4jNCLq`Dg|$Rz z=)X?~*HJyRy`Vlgr04JGYU25OkJa5fDmW*gQy1DNw=0$uO;e)Cz0m!x|3&Y^T6d6X zBeUQT;?a%!oJVB3gW}N;k&FC7od`X2ko{H~(euJAc-nZe%vfVS1fMG8YK@(%Q=z zj~u}bEduWN%uCZJ--G~?lBaT4%+s=Nb~<=4B}HN>L3yiPjQ^cJ@lb4~{4ocs`#9Rd zy{nGF!mlauI%D2U91J+yy#<#%TIbV>PNbzYcfl7s;66;pC0H0oe>XvjT|+}Ia)NwAGeP7r z%m;Zq(hTzHMcn4La>Xgwj*ajlJO4Qvkm6|J6yovbyx%*nidltdyV2%#J~nYKfN|C< zrzm{9AWoVd&ETrv5k9^*stzF{BFl7h>iEc=k*G=Kq+Q%1`Ogu%yJtE!4-L3j8OK7N zl2+YG4)zn<54W{K#@&m_(X{17b}dsnr6ZGrip}!6Ky?qI1j1T*0eu_*g)ie`isGe*HqbhX z4RNP$+n!d49h?0hh9GWW2>iP4eWkVnjHa|4_)PiUq8w8#SFm{rOj zh7P;z=`^zoAvh63sNtYrNd4yTO|N%DIxR4c`2v9XQ3o!odk6v{$uCWK;Pa`&Noy!i zih=bxKf;y;d))PAmxXsa?jz9mM9jgJTfkYfz-Vb0;G%+wQ+g9ER}$gqaL4=f6QJg6 z0G6zM%Yl^1MXAB;V6ZFPTYf?UyL#qUY7B`AXHXuBOV>iX3#N6f(1%}6jGx{J#maWTe zanz9F`Zg`}+p;CRhvWs{vkCXx^ml{n{mW|XY}Wnuh0S&Ubj<(b*B+Jol~D`XP=B$} zL1(>{)QjFQUish6Q4Rku^u$vyeWfEeIs3x9mHlzgCNqzdzbAl&~PIoC6U#4X=_{LYMW5J@D zoxSf($4^>zg`He^&CN#5H}a74rY0)US%?vVE2pex8<7S=GR<9j%!y~5f7xvuchc3a ze(2gaxR9bKB1c~6BxKRcnj@Yq4=%>%!UuA-&hEp5?Sce{PGHUf2RMQ^VZ@{2bAH53 zKg-!dFDZY<8T6$AO=*)(iIbv215A$yh%^lb5QykFOg)`%&U1%1`ApTMWeuUOdvvTi z5f|#4xaw?~5~LwRnah4ueCY~R1EIWnfpA{+W(mQ(!uS9N*aQ2*K`;l7g5%*-I3F%k zjZ{n3QFT{+)Ic>_MW{Jyg<7kk)IJrXlGRytS>03*)Jv7CK7b*NLvScqrU}AQEOn5l zBT;2k)LA?|BuM4S3Vuy|jKEP@P^ZKqre)5WzsEZ>gMp62wM{^fm4L_(5Aotq0cb^F zL#YWX3ssdfHX$-1SQ|Se)HMyNwdwNH_dU7g#Oz3t;OY8%ibOmesoj|xstXFDr+r<8 zgAwkg9gJA3VSUe=4fS^tTvCBi>sfHxpWDDJA-l-miOZ!bO#jfXd82+Gh`A7m zp@dQ*2&@U`WQKZ-2X1Clm&SjTAtb-#h(_!sE8ZkJiiSC*FArQCCnrKgf#HBVmHaX( zH+=Q=BbahVBZc+#2Uh%7cTNxIlb9N6PF{*KMX0u`-MwcJREJHEdrB-_tEByIYRpf| zcO9mM`Jywm0aR?-%RPV~;=7>_f+(i8A!iVv8(axWT=4*MT* z_6|5MC2=iYearOuLwz%>Q%yPAaD<`EO4tDV+scyYUm-~BpG>;$gTgw~sjUTJ3+5g@ zX;1VMQf^)pdyJ4`hDU^xPMyBp zMX~jo?RbY8>Qnm;MS>?q94J`Ap?ii8p3uk>Zb6-jvqBDJ9%dxk{^LE1berV7pY%gy zZi^*x#lQC%1$62TO&V7|{NvVLUqu5~l&28hkP4Mc5T?it@Yc8nNj4>-W+u>*?70GK z$&hCR-0Lhh-TmCR?Tj283TI`ErZJp6^@loW7OA?qw zzBCAy8q8`lBiSYXYKz6}Q3^S^Eti1Lk<~sz*X#MiBd=y&-lHeWTWi#a-S%P78DQ5h zv9+;DQ){THKAWi_P)NHGx=CZp>xaUL9zr<&zO@hkT2>=iV4aWu-A}J=*tr-6yO@z? zOX7s0>ltVWvSSJYHO~uykMX1^K~uv|KVuLX36m~_xy}sM2tfGL*o2;F&Dt2$(}=DA zsMa&4_eO@0DJP&&!Q-1e+aB z=kMQu`+XPt`EPS|*|o3!y~@xY%Nq^<3eRugG#BQCSA-qBJqaCO;NT35M4LVq>R7~u zGykq0%27PB5P4Xc>TaNatE$yD)W(P8vmd3ZvQwFbX_d7Eld$|()NFWsS2P`MnWI)> zy;JdF`IS+G(cf*RKwSN(Q&L=dN1qc?3Zms?kLM(>G*6`!sgj6M1Bz#;8Fc@_3FO;N zW_~t}V}6U7N5UgYcC!U~3^ZNp{37r`fjoHseHMfZAj52b1iBlPJo>ar^f})?8J`FpPDaAb{ z*;tcBRCO1n3~-jT$TO|zEMOUTGtlgi?JIC!$(Z4w5s>i?$DGSe^m>zitm&#bCVuzc zt+u+KAK=AZaN>5QPJdTeVnKIx^Ye-zcn?RI=OA`=7mdSSee;B!hd(kEAus*`LukRU zAm|9j-e+GjZD{o^yDB_FSBDvDIi_-*BUdE6+!Rhd$Q!%5uaapOty%j|O3Ny&vI~vZ zhLW2QMHxro|FW^jg*lXCwR~4ztuM?e%q=7*pv|gfC-0)LC{LA=%pi1twIjG@aB6L_ zet#233QDKHL+o(uPe}L83m>>auYEv0n{iQ;TiK<1sAsckB6rZAerk2xWC$6s&$g-QGTUK94$7I-^*RWW6?fDxPTMl4W8tm;j7DTHc6O>iVWDOQjZMNbWP@);z+N*X~Tlpx*2W6OFWxNhYJkL!pCefaJ(lT;8+u)9;Bs7 zhJwy8*p3~Y-9~!(tL> ztG!`8tU^DWC>!+m586SneKsfuSVQb43eqRuEXe3n*V(6gA?WDE$ed5~r@NG1*MAjJ zO?}RD7CzWd&h1bqb-MG?m zd>bp5%itW}jc4=CJ59&8fQt^fK2oMW7GVH5B&HDIs#%s$RFOg!h^d68_RO|jjwRsb zhMKf&jh0~CF-*0pFbja;`1?(!!i7U8?)eY)ly`Ly08q1nnDCGRs;*G zg$)}FQjx0Fz(DX>1leUIQKN&(G|}h$>10uV@)NpV+FOr2P zbWMv_=(aWv80x1l(2Z?~QxpX`^j5qFh8tK*q(<(=0UQMmzwqji=|p!ufFI4HWn)bC zW<_YIFwy2sWU`_`A=GByh-eEU6xDE%IY@6+r&q$9%G?3&OmAnFGUrYeaT`w~`Dg8~vFV8Ew5+aZ$iV4W%_ zMU4AS^x0abU_E-}0}B;^5i71Khxw+I#>PGsD(?+*6w2T(AU8!M^q_Lk7WnE^l5b?d zM1^RUKgaRE62I9>g5NkT{mS+nLU;5-h-$5sR*;;T#rjYVC5CP)5=v*2-oYu*%>})7 zvusFhA`Jc^eM~Ag30ub>+f8!5q&8<)H#=|N-C+e@*Ykd`gWW84b=|}1xilH4%+Q!5 zJojBko1WQNm6cviz!^wwT_;q@il4c($7D$gEF)PV-1|TVh*rc_geJnE86;PZ+*y1z zPEmYAvTbm}ODvz$Qgj1#lzN%Niu=fIy5hU8W(TrDHxK0SNmLxkq5MSoUunn5w3y`LS!dZjw3iEMfI5xpJ|=WFZb}qZ}vV z7+_?j)?u&^H7CrC2)6$DVwI1>b2sHA+P=Xe8ZGQ7j6^;<6CxbmkMaK4zfBQ-jf;eC zItZX3=>>?q>*x zClivh@0IprD9AZuO4(0)?+Es&f*HWo zK-m=@x|g*q1CmV+*f^KoE&iNKdj6jxH8K>F-5L<+OWHU*;*R^a>0RvTWh zTbG_5NQ0ytm8vb}ECO#PDCdRt%23^A) z+(v|Jz~4loLGK%{{<)g_ujT07_I?ocB3HMuq~E~NqrQIh zo-qdfCW9yb-~9N-*4D*mBrFFjob<=JnJH1%p_jYGgU7r{&FzpnI0%U6W4zUhqHEen+B*C<)yXw99`4&E zGB{gicLiOccOHMk^&9UvbBU>8jch*N%5=?+B43Ho lNc7T06yc9e^3N^dk1rG6 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 literal 0 HcmV?d00001 diff --git a/public/images/sample-visualization.gif b/public/images/sample-visualization.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e000992352af1c9476738fc0c7d871bcc751f2b GIT binary patch literal 52426 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 + + + + + + + + + + + + + + + + diff --git a/public/logo/aviasales.dark.svg b/public/logo/aviasales.dark.svg new file mode 100644 index 0000000..8ede2e8 --- /dev/null +++ b/public/logo/aviasales.dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo/aviasales.png b/public/logo/aviasales.png new file mode 100644 index 0000000000000000000000000000000000000000..611f7de8e24e541eddb76f72efb678fd7d402109 GIT binary patch literal 12445 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 + + + + + + + + + + + + + + + + diff --git a/public/logo/codengage.png b/public/logo/codengage.png new file mode 100644 index 0000000000000000000000000000000000000000..251df0c8be1990176468c99a78afda8470a1fb8c GIT binary patch literal 3826 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 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logo/foxford.svg b/public/logo/foxford.svg new file mode 100644 index 0000000..46453bc --- /dev/null +++ b/public/logo/foxford.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo/globalCtoForum.png b/public/logo/globalCtoForum.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b4d1b35345f5a81959aa08d125c571f66f6f1a GIT binary patch literal 18847 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 literal 0 HcmV?d00001 diff --git a/public/logo/healthSamurai.svg b/public/logo/healthSamurai.svg new file mode 100644 index 0000000..0362a17 --- /dev/null +++ b/public/logo/healthSamurai.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logo/intouchHealth.png b/public/logo/intouchHealth.png new file mode 100644 index 0000000000000000000000000000000000000000..de6498100be4cc9f840618f39ece2c7dad6f60da GIT binary patch literal 22384 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 z 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 literal 0 HcmV?d00001 diff --git a/public/logo/joom.svg b/public/logo/joom.svg new file mode 100644 index 0000000..c771ebb --- /dev/null +++ b/public/logo/joom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo/junto.png b/public/logo/junto.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0bb056df20664bed5c3534aea2be109477500a GIT binary patch literal 7450 zcmdUT_cz>4_%RaV&5+t>F`c+Y#@AKp1<=00;>bDxDSf`;jTDrU@s^yE+{D}u~_T{aB)F#2>_HA6qJ`8N&tI7p_{^ya=8v654g5I#l>mO%=Ulr zdn=#KeXe#s4rrFQbsJTexHX_xW-OTY6TCu6d6km#vc0TI5+5`uDA-9F%8G~&-?!4J z>#}M~Ln&DS#5EfgBt2UC;Nqf@=4MWy=Ii&@Ptb$zUfu=46x68z8{)2H084%3mP+{Z3`Jp0vKK_#6a5*9M$s~tDMYIo&7B;mz>0D=o?Kv$*Tw#0{lg?d2LJR~H zOk&Jv(PT7wValms$2$~>9uFS!+kdi8!swY7iKTwGNqR3gW{&?!_{DpY_G{fyI*F~< z$NS!gl^ZBe%YBwNd~CGJoK1A&X(MKptY827M)%ar#q|`!B^Yhnx&Ix}(E)87@}|B(*o}b0!#r$=WMdbc!?);EjUjQSmpbsq;a^-!eNJQ@5}{%Gl&Lny9O# zBRZ;Jl~(-t@0K&^Twm)WEotMZbq<`?>-x1}F0=$b6IB582}TOjM$ro!Ro#W%4Nn z&O{Fe!}fLrSOrns_Y_YZE7pzgAB4B-EYcWne_7X22G=!Bbwln>S&%zXRc>`oMiG9} z98=L!^fCBKkh)}M1{73JNyGziyGwXyw+%V ztq|`b-$T>#zY!`9!*j1qUfF^0R+4#eUBO5CF5}_*oMmm5zEZ3 zrJ}_M0|M%Z&3|N-CKpa7PsOZSB8kfVZL7q{n{}uB`Qk~~8V0v>21Jh|Rv4$gj2svk z$tFeoIWp1paLDG3PTa}c;=gL$~ zzkpH*V9=`7%#2`jV{r-&YGJ2*HqtGAJOW^Sx&5N~e&BgmwTPj$izf0W%c8N>1ZE&5 zS{JR-wV-P>C{AQ}^)xl>C(7~C{BZLQUDi1zooUG_P z67zL~NaVk{u|n)E!f&OS7O;g=x4CSW%T$_ZJ`}km8w|CrH5V^zTNm_73r4fF2^yoe z4BM$@*D%tMcztZ%p+~t(j0DCMqy$DBg?@Oknr3rry}51g28k-DDM@y)r%PtzuY%H- zXJ<#49@*;1QQKUZJkdvB8Dn!iZC)uot$;SIC__Uhe0ofE0(gg@(QQkJ6do4tM{e;t zXRW#L0uPOl!~Jf~vF80o!roh6!a zQi46G8!MhcW*(X#mu5^qDS;L*t#c@PE>6a!|k&sH>uj}8%kyU*qTku%e zkfXpujpaoV6sC5`7TESoT?Pn&Y_+j1L<7-M-Wrj#BIw-^D&{nKQ4A8?s1GWprM4(n z{7s6LedyZ*@wA&$&S++}18TeazrV1y^5f}1{7p#>OfH3%p+1Qsi|Jo$6u>Q)wI5T7 zX^5}$>`{#706m@A!q3$1z5@uKw7T3^9$WuT)8N)x2ea}D;idjST-^n3G8O<~iF*}n z?xt(%kp%xX(rxPn2;i3zD1~;t14UvQwPe{}{PK+R2`R%CAZpm&h7Yh@g~Z{=9qSeB zMlx+BEM=yBFE!1;p137CsbWun7vN|0W~<>mR|)hH4b#jkh8s(ceX#q9fMZG(Ge3!0 zPf01z%k_5M$WMqSHtm{Tj^FU1?@HUc>HbM8+~Cj2H4J2CG=k-cdKVUdwE)S3Gp>la zAy8s<%m7(l`PTHWT<~`Y>RmQh~& z)O#gjMGVnX=xe+Em9s1qL|}Wflm^%>zxjyeU^@=^HhRPI6U@JtZTu6J0O9R*N4pq$ zx7kQ4&eiAZ=n+I71nC;94QpWW5-_rFXFf0WK+kmd1v3VsCau&$%$4Q`YTsoiZmZ`_ zm!&?~c7Dg54VQPE5~_U$LI)jx9dH(W{b|I`v%NNQ1Djy|&MSfl!@^6YM@=|XUW7il zg!!#@$qr|)KjiNe}^@IYW z;rvE2MjLTX5D=>2hP`xY>Dc;#hXxlUn3O0v(0=L7$D8*hvY9t20|k@|{Y`%y&kmns zYUNSbA}1O;R^YfDam+PMg{gdC27al_fu)y!)=|ZrTSGV<^q9Ev%R?^X*DA3p{}N;z zt5*Yas`e8}dw)m>C~{>OQRo`R(+$|ygV8$HRP~D<4TrKAh(oPrQki4dM2snjI|-c| zDfT{T_CI`eNu)TfAMX7|cwrze6Y_0QRO27~>id0akn zXtU9+hD(^&H!F@(yWDcIf-#v&Q!{VGud3Z-$TIR3+{RNB0|$99L{2Ha8%xR+&(ont zY5#2`Qe2`Yi4lJjPvN=nr6i;#F2aCpZoccIKrCtA=bQg`1v1RS{UX?^QY? zv2gHS}lX1;J z@^=VtX8ul{P8hx@*lo8N0x*a5l(%fe>4PpPW*ZZpRa?elrxvb&#d2e})oa=vtR`SL zl}CuKfR{+DKB$H)oI@LUg+@MUdMrI1?}8wVyWlG;B1_5oST`_8cW&eg+zmJS4)a3I zfX)@hJ13S@aTo>RWnvGRtu}8`zbI{Y-^Rk1aZC=i0tz>z04V23$>ZF&Hl@k+X?&$K zuu-yDsdmJ#e724LN^p@3U|%Q6>NUV+9$=wWIUQN+0B!R92c(u5;aA+k3YrdtV#oBzruc zw)9j&taHV0L1{AA`|Q;V;I-C&KWK>%9J^*(4H~~4Mp|daRGA>A|Fs_8_{}>TmXF|9 zIq+5~cvuJ}&^Uhm-OtCwraDXXc%F8t0a8-DUq4b@eWK529Kn$fU$$p-FqUQX0eqii zGe~ro1U(daUvr|3F7-6-y}yjBcHmR#a@$s0a4J`=3dJEZ1yoqj3B3hywn%&@VPdGp zqPDLYKILPdN^VgV+X@kQox3EQTqqaZ43R^s9PlCu7|j_rn+W#WCnck~3C@IRq@L)p z_(p98{P7ZPO;w_#A?T_W+l8PRQ8l;3zz02;8IImsPH5N{Cmattxk`!JX#&>-Yj-w4 zt>WwX3235yE%EYK+rw^gXI@oV4OCl*V7Zx$D5$DgLjaF*+o&{bHZ%S5{8>a8APvL3 zI^r9!BcU>AO(D*6Sd>>Fg=f%g!Q<(Ggk6UAD`EgBLt2E`JyKDzo!*K zQ4X+RW@_!QTpFg7Pj~2@1wY2(DpNbJil~s9XZi5W3R}}Iad$9~6F9MP6aqf9|8&=n zS&PJ)Z7v#-KqXlBR$9+Wy8QZ7ys+cM!%|*V&<-w+mg%Z=6~!f}X4h`r9>vH>jL7)p z{mHwtSiSMwSo5l5+1?Ma`Oopw8asiA9wFPJI7t;K#+oF<{o9;{Pk$ik-ylgxFKG(t z{UNM^a_W!VcZ$=8$69$k-i)6gU=pXKyMZ1^ft|*CbKTbZyasg%M*TIzp)J|(+SG@_ zBFeS%Cb>nWJV?he{#CVaP?WQxdp7_LTeYND(VXzmVPYMNsAreT(?$OVo1>{UcqTTc zS31|9ptindkG3F;Z>9DW!W*5Cv+lk z@CvZ*Mg?`o?9!Bc$$xS%arFH?^`AN))b*+#{qH7@pl9B7 zjNmg!^P;}#@xfsOdSz~yXszJNw7Wk=l*o+8)$=e2Q^(+wM!OsAH(~p`Z$QkE^AL`lJ_iiWK-Q}5g+7LNI zzQ)Sm0#2WM>*iNrq<2uR%vsc8AOJN;k41q-mUIm+B(7uQL~~6Y%h+J)| z&YYaJ8NH>>!i)(E%T{yUYFo_i1`$>S_ckjHbS-Q07mBiT)$`%&q^ok7OfF_ooO@Ho zk9pPvzvtbGLz@0m`b$JZ*-X(^hk zH63;Gb~fqkeQT;@?KjCLM>TV;^!tjSWQrS49dsn8m9H?Qw=y)qKMmb6@=1m@=!htB zv!T?1^kL~tc5U?!JNoXigw~K3!1;){?<#`fL#?xrmM2a#L<0jWzYl=p%nmxp?oBUQf)lkNdL&AtvDy z7I&aS7wh)Y?no=v9PAOvuZ_pq4`j9b)UE6bdSVJ)W*hQuq@Oni`~t*D&+E<8!we7C z&8X_(rdigml8$HM5kHUI%92fx_t&kL{o$=iT8B>|Kv78UlgrROYX)I&yWcA7b1*d3 z)@M~eHt_R#7QaBa@kwp(!|$PBDkUK892aR?hxd-~^TqA5f(EVue2b05r~VY? z-^$MO=Znn=hvd5IGU-3lKRz7zRh!5}vL0-fk-LE!y5fdOMi!jJbi^ zS-Zr+y7gY8%^vO#cK#&NjX#!lN2KLPw;g)IJw`|{bhlYgUb1=Dvh(Vn_43kxw^AvH zUSq=TH-gYV%}U;Z+6TiD)wBi@c|-7=sc6(y+OeO~g!=lsxq3!ba?{0#vLjkQC7FxY zdE3p}6#_8)Xw1bg4S^NR218QSN8we|O>u|q{I$r^eNL@G`iBP{MgBJw)ntK!iQe(t z+HgE=sf5hzbwkox@$S|qZuV;|P-E=W;M4E>RohJ5l3t?SVRQ{yW zDKCJr@Y_*1EZ-jC`NEmZ?or zUNGPTJX}cQ#g#^d7vZzSg}OoJcT1_(e5vlvT7@x{N!-q(*z&0**TbEfdo_d%+n16_JA?`OXfN`Bc&r%#rP}3hM=$Mh4kcn(ivP|Voq~Kt5ZsTDc!%a zQC5oTKVTp{&2Tp(8KP%*N*^TQK7A;aeDt*>v`20_0%si{;D|*P!i!ZkL1Wu7t#_w% ztefq|o&BzQ#;9idn)WIfM92xQ(-Zz|!op-}z-qeMQVm-#Q6Ywr_5^O6eMYrS@Vswe z5<7Y-8R5FvSC>e4^6ST-j^5W0D2<8qE3gP<^?uc!5HTS(!AY9>jV)jDPlDv`WbrPy zNiGif-!;DgUqa5g_mW6(2M*357TB0|30GJAXYL@2rPnVVzN<6ob-WOs=4pHj!@LGr ztYHFZoit;=>=m`ab=2KCw+106eY+^3iuCI?EUTX@3bExTHq4MhB3)qm_eC@p`X4U~ zEpLtJX^S+EsCkAt-oYPBo^!V_1Ip!xR4#dL+Jl9J;ckb~n)YYcxqB){tyuo%R5jpy zkMu0MurCAn7jXuv|Gm;VCHvT_=*(->-OzR}PLI^}{p_oC(K3y{TJ|6hX)>h$a2!;`Q7)Xy0Bhn~EYiLXhVMUsZY27%h2 zZN$kn%irL?INI6^VNs-r z4&8$kKh_;{@=8eZZCBB2UtYHx^B&H!e|e?8PYJ|oR$+OyTzrb)+4$xjg$f`&i|K`f z0YB%ReD?*x?3mpXV{$pJ@db8$xxR^D6fIto<6?J%JM*A&iB4UjC2&YNY1Fk=~VQySqwu8 z-9FeF$O8rX3EB;_XS00;U;nWih~`%C)t2ct7p(8th4RPKLx&&GkvV9QbS@r( z*($Z_kvpv3LcjdUi8!{DpjTaqMo#0;Oq}>>UcO877h}I(sA)3M5!JVHw5Slv9YBl3 zT26)}+wa3jE*awA6wt*0$hiRWmf{edDZ<%D;OXj7bKd5(EcW4sAChmJW4(j#{N=R? z{Gr#qfL>2Sr<&adS$fVryDQZV(HA%&tuVLv-;y}l(Y|$lV{mN8Oo;ufB?RCa_OGjT z$}k8WJ%9C)yax;FSxqSrPwZGAz+eEk*|NTHIOgu}dt=+#c*C0!o!rADZy(7zGZ1`G z&=HNkd?KZ?jL(D+zQ5yStPN^+y6KBC85gcRkIp6+tF1A}uY0UV`o8x6S*HP0+0>(4 za;$1&>9^yP=%;>1$;m~zCuS9SLS_}ZO&%Tu=ZmvKXJ>nqIyP_Sm%q7&2^Fk*)CozS zi5KcugG{Tbn;Q_M9bQxoJ{zdNW03~sE)lzD@DlUUAP>Kk_LTn7_uWiMZ7@7U!ru7w zFzo*G{=*~pYnUg|;VvW=;~i9uOGTI3vrgL`(gUYB+g~>PN0m5KDvdnp)4Y-oPbLzq za%(YU?0O!N{TUiBJG1_GcSL6A2FaZR!zKPvUD|o_%M8hFySuOT_%V4$DVHLsYFoq1 zPoy7L^ajQIWjC#qY!9Ra$4WV{rD~#494bJH@PkrWk&7zj-K3O?di)Yc@FY?7p7P|N5TLHIlocm+79Z3JmDM(FM$tqMCR+fYq zD(ZQ4?b%Qfe&Th>=$)ual!~ajltXZS`7WQB{Is$Vqdv9dIZM5Z>yzvH4*ounZ$>46 zk{2uRuCjDOgWlMa!Q0WK!WLBAHyd_815ayq)=DS# zx*xi2zvblwzY^Na+s#>;&}8(0Ds`T{;l+DbE_Zzir}L!;js{o@@5Gtdf->bC z?Rp$(u;~I4@DN9zvyu^Tu^kYg1irFAKQj0P{j_;Hf|e8eKM+7~c25rI+aCdn5?!Ev0 z-#b-p`>bAT@6%nUYIk+4rn({)Iw?9F92}OilAQM6_T+D&M??8rCl#Qa{cVu!rQb`# z!8ImhJXs?D9lvo?G6ccFVG#UN;Nf!fN#Nk%4S_lao(AvLM66w%IW28mt!z2L&TfCv zaByN^k-uGMTTe@Bu(Oj3NCYfS`!9sZ-~K;l04?>uAfArmv_oKX6#g^)??{~1!PC=C1OV{y@!|C0<#hG12XG4u3j?@#06aV#e-RuY zUl&hHFoz3>?%yQ;k4MfHWbFZT^8~uOQ2)bgY31tWDNalKkI;XgfBWePwEO=`E};K} z^*2DkKW_lsoLqqaa{rww_K#IW!vkphSNR`)32w1}A^(r^9T`U4V?v7_;Qe6mrGcF)7@2jiVnebtPI-iN!@g|AC0=kkp@ySkJ&mZ&n^EmCMH zlRN78_-|-(CMUaYuWnaiM|r%TL_Z-B;L|)#6oPKn9qYSpRvc@)ZdV@H=qsu;l=eU7 zEbX6|-9>7%bbZ!Qp@afo(9TI9tqUKY0b5SkSh@cNp1BNd>R{KS;-`~FF6={r;{pN2>mL1vPucz9R?3S@5(E^vI;O)A?GpYhi@B;i@O`nb}=JXO$kkl zv`8eeGSq&1FLnHrJN1PhPj;1>VN(v@`0lLj>tJ^@(MITgc?@ z#kZ9ms{P93P5)ds>hZLhyP)15L2Z+5M1DI?`X>hmhSQ+uC@eDXT*e<8VoO^gyf+pE zPoOaK?#kc4f6uUIu$u4v3M`1qd9rz1UFe8{`Uqe+7E%nKI!tX4#3sj%W5c>0iYKNr ztrx7blQJI;sXO^&^z_iz=T*&uvFm?0ntCyig?Mzm$5q#p@2Y`Na`H-=I2?%lH9ULX?Rd0b#nA)T;w~g6JhuCIxX|Ozm4sr*9Rw!I zgkC%+F$tn$I@F-meb9&IH>f((*d^O_IzUC;71NF=S81SzC08`LLJ@d#&u)Cxt0ChS zX6k{Rc^(UnpLyQZbsOiJ=gF6LsS2||cmH@|DUOTMu4L|D6C9h5^kT7HSiamvOo2aS z+GvFwz9=}Jvq+wPvu6T~rtu-w%B{4_P$XHiPAm7|^)F}Gp_t4ez9K+Doe>9jv;o4b zf(d7>0_O?NyV3Lm04=(M?=Gzi+pH<;ABkwOSBVteH-IZoV-8h95olHJoQxITx}|A3?z3R?Y)`2- z#w||EIygoC{u(*FJdifLia-J08kK5(&L|en+9ixBSzk$qzWzvzaB9NP!U&&8nGwSd zhvoIKY5qj@#_ogId>8q)?G9)864vdj-`}#CT*47M>n&+J8-oS`;;A>(Qg{|?y!~H3 zbEX1D3rk$2_r5_}ySpVe6G9dLI!L&nTTB;JG{ha_sZus~^>RkjZ`4Y0V$}iB+Q;~U zNH7Q#B^c^`RoV{)dH@V`R`?wkFh%E+5}exMF#`S|sjxAkaxt?a_KYQb{BA@}-&E+* zC+)SV0^X?7XU%}RpLtdR+tcW$Mz}ok9v&YTwaGJ<&auuGa;W9DFx-;nrVB*3MBqS0%=vo55o5MIR2Y3l0Tc*Pn!T@mzJv#b@o?yt@*^Hf-}LL=!IwC3G%L1Ahdeu{GAdvw_nVy%)EL6-{cJ^$U;hZSs%h1#zhGmf@~I%Xud zBb1O^(VTQKDIHt4xxXX%mfgS&GpJyr^y$g3>ps55pz_0XP3C6B`&PGtOU3lS?|O%? zq#Eg}<}%q+N+)O>vZyChK@IQ`d63qYSp`n4g(hFZ+ps4 zU*Cr!to8G{u0!rK#?Nej7X7dusk4_RTi*$hV!)r4v!b-E3O@wwswy$Mq^g*g6fGjs zy+*!|e~MJBvickp-`!1aCV^` zdNM~@7_FY>;BbE=S#_eqLI20^P@T>_2BN;$=nPq)r{`eMD^}yxe9_C#2Rf3k>PQy_ z=`-c0HgD3j>$SfwD%Ke_JIuYg_Ise%)U&zBqAd^QdZo60KuT)@OJei|5}};dIxgNg z$47-eS-Is8kkHlGTaid0n-Ovhu$YzZZnq5By3KeWfv+84;%LjSwswzdNlcs7I^I)} z=EU%14rNqYNu?%{=O{h|*#r)k$A(n+a_OPCvMKu<+P z*=}v{mp(Fr{TRYX){Pl7t|A$x_yDH%Dyw()C@^8JwNQuZ=CkV0%{?MqTn+N%P`hR( zmFb|LhZB6XwSJy`?h4kZ?o6km28GxJCA`Zt{pYH8zp6!LO)s~+uq-3)r#OBt4}q$I z{dTV;xKU^`4h)CvRRtrLH!aqCUy7a(c#jf$>!^bbL~sr6_rZoe>MH?%_&=mSd&$bu znKSjIn>*;AS-GucU}mnxug5%X^tOp%bjtqx%|aRHjmNLBjRRaQBhMaIe~|bzcA|px zBAecdaO`(QmpsTX7wRlu;oO&lBhibH-$}7u5R^$d6`DIoMa#|>Ti-jQ3M97PH{h!P zKv-lGX#g<9Cty;4J*>YYxUa8Wn*%mhs-KujXu|T(zsKi(_c2v#o+~ z-NR+QbNmMEf~Z#C-Kb*51hvgqNoNG=o3Yy~7qO~M=4Pn&fhc_;xQG*rQpsmYK3w>X z4QI_|7hDQvO}m)rdZtZw?+u0;^1Ja#Ih!?FFj6`(pECrk%5_(ELhtN)v(V{JipeSU z>hvfa8t3`Oba;jv$fwj@OQ!clu*!_jX8 z8y5K(z*eQr@fL0;wiikhK!%w`TLb=ZYq&(iILo}t1B2b|t&w>FT3nuCNw=0r3ns>e z?>5XJvyq-T(drFhL#c(KPdyDQxsW?8-;1&;f|eFgwgZ{od%R+s(87eW)o$hKk2U;N zNcYMKB__qH%u-Sg(bhJIeQEteBc=5;ng;bayRNaDu*&>}BP-E>S`{uHL8&ErJ+>RJ z$7X~*!1Ut^?klGq=39pf3Rv6j*;9VbzQ>tt)3NiF=V75JO_gg$yFEyo8D@@(D z=VV0Nb2W)O9_s_y2xRGn^#09qminpeP3qh!*rp*1<)4%!5zx;w1)NvP*Z8&K77<1~ zM7Smme+6<)EDm~`l5sYF>F-Uy7BOhO%ry#-mjB;1%H9<6JqcSnydSn^tO0-6o}bLK}tzuh{|`d-SSV zH$^y|si}g*nN$!lAqE+h&3V>S%gT;8mEnrr97LRnTK2P{pa?|lp1(93_Fn7wCn8ED z%nHqOryO9RO=^(nmkS$?KThDPA+gA(_9qng_ro@S?aNr0V|}O_RG#k(T4S&PF4mdW zTQZBqeJ~&=MrIK5Bh*- z3|F5u8GaCI-2VFYF_7*aWvA9tz&7iHH=oA$-#6S&eKF4{r&Pl+?Ss=Isf_huL1%(H z@o^J33i$K&I5--QlE$rdTY1Oq)Qhmty?SOz>;RXHD;A-{Lc{7`({O*Hl9G}vEQ{&d z-ddX$)^;OSr@^XYBlW|ef`-b(`*EoF)A(9e$}_nc@mR2O=)vCcMa+Nh zMA{S9h4OO%BEG!JEic2>$BjEwjLAfRd?$sEz1RcGAmdWdJ1#lnd6MJeX67flt{mRO zF#}3P8d8nyqJHe#>xjISUPH!HDq;$H;NbeNg~t{-)T;ZO4Gcbp@;gN zVHGp=#J$!gaD6kc(P7KD!jQ_3!u_$WE###pZSH5?w0zFlGIZ~rw7zE-oUg`(GK0LA zf3$iqthTyC#fs;->C8^iLmIR69NnU7E@!uViaKKM7y$Ci3ISED-*=)9Gnl4su{B<^ zG%~4ceocoKCP``m3j(rfe7Hif=<;4ikM6W~uA!UI!2xL1m8Dzl$UFsMKxdD&Ah5P| zJPPYK^D)YBElgu;K=hzVg`A0hgsB4S{MF)QO&C_zHuYH_Pt|L^Q=SP8ZquspW0Pt~ zx{tkd?e#S)K)tk!)m5%gv{YvW2IH-jLHcxqCJM9`K`F)A66w$*3mAMaqK4koPdTfx zk-&vPZP1epG0SL@F5we!{C?fat>9{V;7`DHA*>{z5gFp?%RQ4eVOxZhnX`MSsCYPO z0Teu-91azynfGkJ!hgWa1cr|7=zIjw9y%mU5$b&x zl&{cTC~sQM|D={D@H5oikNo~V4PAlkl7VZR;W%y^43Ty}pleeRTINAZ7wFU+u1c-A_=;3YI4@1}AW7b@MoF0{)PItnZwam5goZ3i#Y~}(0+Y)^lLeEIL9ki zLq-S9rZMxI39g{j_9d z_e#-vK}u1kW2f;$?Y`!tMhk0w%`X8-%Il8-ylOLJml%kq?5#B7oveUXQ0|7j?~JZ* z8LlR!5JBqSU8(Yjkny&ZQQJs7@FdU8k1q_eH&I5XVoV--B+hzL>#HS9e3X)aom9i# z{^>k`=G4+o7H;5<3%h{VZqkiKFIU9tqgF22eZnoSe5;`u=Jbzizjh2hX7464cu@iq zW_1jCLIr-aE#A)o(?^*Vth8ZY-A?dEF?dDLDO=?^2H{%mU{45O5Z?lB^6<&-0D zjBuv7*{YmwReDlc%pH?g`{PlCZ};jWsQf$;XUx#2rQ+Lk!GG8WBuPj~%@RE}qLXSB z>`pBYdRXi5`NE7_UHE^DyLrujR1|}TsY^AzC3x*8PE&Wfm_o?)1Z>>t-#tgYykHrZ znY|H}5X#ms-8r=qrfq`m3H1|Yv{rrY#A6AshJLgMM2`#%lr5fwLnN>#wK$XWrXGYR z5%Qpgi~@c;%bAE^E?KnjNn^saVrpN!m)Pur-N7D`v0{;dfdQ?^@ktwAj|yg6h1Pp9 z8yMm6J<^{8=)PrCE~+}GF8GiQ>@NQf7_*=HLvJ9p@Q#qNWjSodtly)5TVa=7p1n@q()ap1Q{ zM^``g!AB)UV$j~)FYk!2mU(~UlA5|Ep~c$KC7E^A-m@XdNM2M9=aVl&KoJJfr|B1e zfBJ$&wopIskYswDFl1~ycI9u7Zmm@*IJ+FEwSIV!bL&z#5)u%vh+)8Jzd{UYAG2FA z0p|JasdTVN7S00Q>D8v;Q3a#6{Ur@fF^BSB^>2RRC3C_tFV{y1ZUUq_obd0(vQ0Kp%ZxEgxK3? z=PH@i#??Q@;|y7D-ZjzSdOj@dx>vl5;CF#9)St2l7QIVV!O4T2Kes3A;m_{g4AXZt zAAWo0C)W)`Olj?yA}HLi5j9Mqj3u%+fZy%qHizYp_-tqanet}C50NV!qfDdmQX}Fn3w|p7fTv>}|DcW((V1;J+*~l^9#LbdwNo7tflP_Lr(r*BtVZb=v zdgqRSMF%O-HXg>aVWYC6fD|XwA5i=x&@Vb%BD; zezPFKm1D9l5EZEQv)EO&_DJAj> zUdlyLLSpQ(r5-g8y)C~tB_e5-O6b1()Zp&9>9yZTdpl&sJ)?!= z!^khm!LbDiCmfNbQ>5AwjoA~$-u*5oIMq|HI)gVm#B5CXxFghe(l4TG%wT|l#ckK9_SKkzVpspd4@GSA zGvl+su{bk6Q?p5I*_u&R>CyaTB)Hg|-sBu1>flY7Q2uY(j?NK=mMYYvz%JZ0v#l&W zGr75BKFVZt8%^JEp1E_uhP|xWMP9Ib6J^MSBx}b6O2%URw%w}Rpsh$$akD{RN2U6) zP?es)LkhxH#0Hrxyl^?qY%~8Wv)~XNe5qDhBa_zod_y2wP{Y~t|>@$`>*&+At9IhT~;vzSYbMzp6 z7}q1R6YX`9*xKy;;0x-3+s{GJWE(dnO+l;H!R~%sVDst#?uB)cu`-FOY8Gd~OxiV) z&C(13pwihT1-S%g7(2yHCJdoxP2~CcQfoY@TAgs41>XPsDw+C}2X5<2(HZjZvzGLt zX3qC%c*#d*GeP?ff_GKzz zlj;21bGkl0f~{ZQcKY^($x~Ud6C2N+ZHD8x?6m!fF7&TDXyz@Bs|_<3YDs4%zns;X z&g$k`GCUT4@l!Y&WGLETRzEY1BhT600j6+9$?%OK3+=8?$5TZ#V-g>T+l_thybjp2 zrP6A*2+LVqSYfFFmqFHl&uKmT>aKA08tlClEz7pXC?{XVc@#4x}hy< znn#)82>dbGXZ2zzfNiNE5Ov;9{xzfw<`Bt1?DRO`TZ)h&F|Jk<%F*6xm9rN&QC4a= zEhj{OPuX@)eu;KrpP(JFb`!k)MS2s+d8HKW$Fr#mh-$7zF=_i5s@;18SF(ATCb3Cn zg=~vuj(0yqpu(7JD9jg3@vQeyU@$z&+=jrI?oMnyLV*JKK;KntjHwa!t?AbMeV3Pr z8Ta_=)u8{3znk0CUSVP62Fe1J!YnT8@is7~6D@G^+wc>=qYYW8z_3d z>l#0x2&>CI@-UM+|6FFnmgM_tj@PNXN5}~mqx9oQ@k~wqz5MR3=upeVp1ZCrqykZO za4)!|**3N$8Y+w^jpMs#j1Bt!QdIIpkMhWB zV*_dzgN!}KpP9M|WV2VPWKV@iIw5TA`rF`#yPEauv)m0uSHd!@e;dog`EH7;JQ`Yb zk^&2uKjS&2Rrv(_pnimQd3$RF;gxhnT`_64IG4i&NHa)#s-6i-#zwSInzpV?Jy)bP1ZJYqQ{{GI%Zd3;xb(5@_ zc3MK8$Hm&{;t~KM$l>7kn`7?9=sGcxn3j>kWg{x=gM2vM`un4*-WvgYZ@YO)vIAZ9 zj6%wsMIXregNXg^hCb~vjr!-PkR``Bm7B)!x{gmCn(3dGsrD5gAG7ZGu8Z4QgoGKhQbhJMx6)%{H}-K_E-LV|^_ zw+)iE$O6}$(Lbv>RN#3=LU1pg01eT8^$|US1FgYBo4-Rewtm55$G9cS+`E&Z1ZiyJ0P_DY)twI#y$At21e{ymu%91sy@rQCL2HETM+rz1wai=;^h zB+4-+AWo4{Ur!d~rYL1k5wD*ql%uuV7b>gjn=@_7Nt_{wE!C+0(kFE}!hCGFb})z# z=}I^>kKJu>tJ$ThpK$Du(zsso?1#iX)@O zd7=(Ad0<{Ku_`;w+mFg}_heyotk3n%ce2}m=NwA_%Bv04Uwgx1$ulx-Y2Kr^E*gn>yhWMO-A3e8Pl50v2 zMg38$2U^LAlxZ5yauQ}N=G>CqPgZADj}l5wU9uJZYTFHm*ipTWu78YoJ6;h=_eGaW zINndWQQ7NdeyzJe#QFZ&ea5bUd63l&ZHFa5;T-@cvE>6=kVK1yrAb%dSAvkzl-!tU zmYceD=6*-R2T;1Q{4Yc@Ch~>C-g(yytbQr`A5r#$ zuFtqqzYZpDj#mdJ!IRt|iA0kPH0QIvSAa0mIT;_l6IFk-fD04*RkC#*wgbJvc-5)# zL^N8t@rbmuo(_l6_A&p~n>n-w{M-lBC3PmW5&HGj#bUpfX+_D3WPkpQ=aboWLj6Hu zx~G82oYohPbo~jIErG99$)~{iqS??UDUnU>O}B2mp-pKY5~RmWMbt0XW!5&WVd$gp zHXcsrOp_3=m{DkK$KKkp9V%K92{7}Ag;>zH!aurS5aLs?PrLM@6@E0l-IVm8#tzpg zyTj5dZqj+|!K>6frOD548ombM|EyN>!d-ErE{Mjn}n(j zScc0uv!Dx&uYJ^)F6K`L{Q*Q{WJcqYqMN&3JMYrK>5*wejc0eLV#~Yee^gKJsGYvK zLlN_eACG-Yo?GktJ8W*+PO{E;1C}ntkwzv3q^$~QG}p1}5yx7aLazp(XA?xP;U<4; z#AiZ31k}pG)=J=Weehnh9Rkx6 zJ9%4Y@1%~1ZG})3p`<(7uvGADZr^Wq6 z=<2>=ajdrpk4QLZ?;ZPA(ljtW&Jl7mPI5(q`O4ONi3dq8qcl2`$uqm<4*HGdgIxyGR1n;0iQ|IDq#71p)ef|_xOyZ{4*Xt-fIXBLB z3l#%W6>QnT<8&r3KYyT6d70 zwuKJYbsx=tYbam%rgv^v7&Ti04i)IFsQo#{wT_Xz2*+zF<(_$dS<7T+20i=4O}R_Q zH8p}86I@mLoEVr=DD`Osv$Lnrdu9Szlss@Q8Q$Apq@r%U!SeYwl>5%SM1}4)(^#^L zwE)YmQS_U$e6MI>bmQ-|Y089U)lK*S}x G?0*2m0`;l@ literal 0 HcmV?d00001 diff --git a/public/logo/mts.svg b/public/logo/mts.svg new file mode 100644 index 0000000..a219222 --- /dev/null +++ b/public/logo/mts.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/public/logo/okoo.png b/public/logo/okoo.png new file mode 100644 index 0000000000000000000000000000000000000000..b68e6cf06b679f7c9360d198784a3c05256ad743 GIT binary patch literal 17071 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 JRZ`~P{~vv_8z2Ax literal 0 HcmV?d00001 diff --git a/public/logo/radity.png b/public/logo/radity.png new file mode 100644 index 0000000000000000000000000000000000000000..36618da7d4bcafc1a622fef679c9af8770c329ea GIT binary patch literal 13424 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 + + + + + + + + + + + diff --git a/public/logo/redmadrobot.png b/public/logo/redmadrobot.png new file mode 100644 index 0000000000000000000000000000000000000000..df006f3110b6ac2695bf9aee2963256a8bcbaa8c GIT binary patch literal 2654 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 literal 0 HcmV?d00001 diff --git a/public/logo/sber.png b/public/logo/sber.png new file mode 100644 index 0000000000000000000000000000000000000000..999c602863a48d6e199ad629c48d36bab0eee899 GIT binary patch literal 62737 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 literal 0 HcmV?d00001 diff --git a/public/logo/semrush.png b/public/logo/semrush.png new file mode 100644 index 0000000000000000000000000000000000000000..bce4dc6975acb6cad7e455d38fdd81cb8897901b GIT binary patch literal 85496 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

RI1#o(SAnCSHFEB7`<8 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 + + + + + + + + diff --git a/public/logo/space307.svg b/public/logo/space307.svg new file mode 100644 index 0000000..3a2f819 --- /dev/null +++ b/public/logo/space307.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/logo/stellarX.svg b/public/logo/stellarX.svg new file mode 100644 index 0000000..c721bc4 --- /dev/null +++ b/public/logo/stellarX.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/logo/stmLabs.png b/public/logo/stmLabs.png new file mode 100644 index 0000000000000000000000000000000000000000..2febd32c4f0e03db63371abb2d06070879b2c91a GIT binary patch literal 30314 zcmeHw2UJv9vu-0wPAUcjl&GYJZkkTyj7ZK=py`0bCPyWSf~X*hpddjcNfs2zARtkK zA~`A`5>>Jy@D4i8IDe_9isw)K(xxI z<+VW|5<1{nh=L6Gc>uu`2>haSJZBv zdk<+n+pnOom$@M^gfuM7|Jorf0h&;%9`Z5vq_B$*LPDF?-uOJQ?J8S&*Rt`XTXG_6 zA+Df}yo!P*>NHFX?oabj_W1shi}kg2Z^i_r1E{zhK@1cHIChtHP7=_nuedlrM-_Pm zh{UslngUd%7Fz{j3ErfilD%t6;vYm( zU=T#vfN&a=_Y_ps%0QhDqM!jmv_dZNg7*4=EE+gDJwZWtL5zy?2I8Oia~LN00Hp5b zix+dD6#`5sz)s`_27rwX!CdCW8wbR@LTJ2J3d8eZ{}7ER9sWmqG}3D+fB+K%Yk>{N?)H+Z+>O%;HXu$EH>n09MwAD6eb^YZ9zDN$1r*b?)*lM>@f3y&^gZNBS=qiuh+dWdW3X zWf~|BV%YmaNGwAQIm0N9+`Y8Q{_OPL16R4&8bcVhI8-9wr=i-Rx@>xi5j}l2q8l+WyisM$g%HxwI`#;wnwG@U18=e;6>^cyB zP>8`NM6MReb>NDe@TuY(dz2p~>%KbhO7WG0Hs_?k!&s5i$2e~__Tg;v$(h2h+7Q0<>Fywm6YtH+a1Tw9XYpRo%`OkWdGpp@}pKv9!GQUsHQS?TxF`)g&?8RcP8%A-zDl9@)h!(KNQhKb^FZi zled}qgmfQfq-G3dQ0pz|HS2~yG}F0|qo@bd8GT6kIx15yBTjQ#hgrw!p;&rwhE+OI zS1Q@pX#EPAQH^SihFr2%;v@6XvN|?uEK`A}0J|-1=4H14cX!sQ7cZ6H%O1 zsJ{P`mfYDIX}J{4ZA|o=porp^;tx6%uPf4Dv#v88F*`;aw(~8w^sb|J_S=HoyDr_u#_>?Jcyoanmr_jFe0>;Yn zh}F~QIW=>)%5PmLxo~}5f}A$EmoAglnAO+iu`{EnzUWX)>%BRt3(ps$CWWjF+Zft< zV55Zxn|W)k<8)#>l&p?e6}wzq2)TMiC9qjAT2e5Uxo)tbeC&+tlGE8Y-mjM8Vhduc zXVd$0=MZz&bHM`%FGLb}bWRwR92G|n2@e^Wzd%+!ZFt(OQA3P3zcei8$GM5y^xk|4O7rI? zu_C<^AQND+XKmH{JbPuBlxRPGIlp&S=2~L0%psZZ!0f>BXW8uM8fI=}v#(6tX^m*L zrn{u+`@XB49P>_YI{xVO}!K1c2dHJo+y zy5Cy8cq#4hL%{4&dz&mZ*Q4x{p_X05j35PFGt8PX$X%6D9S z{xqMO_syAzGPoDlb6ASNcyZ9Fhd0VpX;lYfMdJ_0xU<;{ONf?3FW!u};Ut^Eu6C=? zYRc*z!M!;Pe<^?Cxx>|`LdS2DH`*55$l7NFrYe+8eXncG)6GYoZ-qA?RJL4cLPurB z^S8{tC}`@xfxP!2VRQCC^?^4x3sWwu7=T#~-<4tWTCDUKCo$ zXWyxjIcpG|<6C~xTg^7W>{(ObvnM3B)6{xY4|LC-)i4w?8h(QLaygD!^3avg z9LD}5(TDtccm_PjnS+THvLzRAFjTUPUJ*Wzx+ zUGNqBJYdnEROmB-Z5_6uCw?elaDDSiVe{&QSeaO>>3osve18AK+kyvv{X5LPCcoS2DP^)T(DPxy&!);FapC2F(hAw7i)|YbOX2i# z`@-*rH(#c`JROgcM5EtIIj>KCO_OWGwVjMVvXQjWoO9%`knd{eba(5^J1_4?&qv>? zv_GG+K279kISQxk;1X9be)-`lBR8tkj672;sIHDz9(9_-#NJK#(aVbwn4AvI!%4UhT zvUZT*_)uEO!Dfw<;4pxzLDU@O@aL>gdpqNGyw!EF-nLjYjzdb4O59TvP+*UD#jttW z+c~(1dP;D7(<=%*Z;^#K*uK5uYAeAZvo#=_p_(R}9MKui1{Xwtu}~O_4T%H^tE;1^kdTLm zhoA>ckmzhB1Vy9KLJ(mgVPP=v2H3^R!4=~Pc5vbRuH=UvdAtkO+1k<7n&`l`r59sK zbaR#9;Mf}I_pjg9W$*a=Kn^ayVF#cn%Uaw_@k8h^}K#(|4SHMtqK2PB3qn)DTep7{ug3fobO`aZ0h?~ zivy^O$~ogPu0&^DBGFFrySe^RhyisNV4g@e9s_F!9MQvtS6t|?B7YdpAKLKp7+1U` zAPEOU5MW`rE>uKR7%B>d@k8LE5XetTzQ6ew9cq9R;V`b4A6igbS|Gx@fC`APC48}mP!eBTQSP20K zL0S^vKZf{)nr%a!wsryR&g&<81g!E~u+zai{h9iMVQ2jUGQ5zEy3}_seg}h zzX!1`nQyT{6ocIgcaqpGL&xL9h5khSV_LsU{w8Mqi|zbJ5PaAFllZ?L!{Z#@VJAoV zuIk%c|5}L)k>KiqamLG70T%Kvd|2dXAO5cO&tiX7FD|roJlI+PU)Ts2jQhX04JZN@ zZwbc%K>>oqf>CG@Bp4$Cm?HuUg<{|Ys4xtM`LWIa#x}swKjPK@+&27S#n^Kg2P-^I zQs~FZeh~gQ?HmM#!4n`zVK5qj1o9oE2o`LK$6~;61P%y@5EzaC1CEFPgaZL*1nk>M zgBBG*io!*HoDu(JJNKtU@Six)|64nUB|5m{o&O`@4+ydtAf3fKyGRn8iS}$5M@Ktr zEM_Z|3b{Mre#-}cKY`d>iEQ7GNgGEza87=Q=qDxrjb@6&J6r!pLd;LI{2eE@|80x@ zx1%Z=Y6(GDqC~(jG#m{EPC5wSn{Xr;0VN3IgfUPYp78tO`5%g^yT18*YVq5{pA(b+ zI&=NQ0k_=oZ#?#Y)<^$sb47?)TB3xZ7%&cpMgvKx2my@2qfuZC7GjCQ;ZO(ymhfYV z|7mkYi^71S<$JlYdz5_7qyO!lL!w0xXc*QKOn@V>U?fl?fl+V_P^+LJC@2bog<~K< zt@0i2|LD&BvQXUJx!)?F|Gp&PTdn;6Sq|_&zUF`1Gyhq;V%IZ&KF_}w%71QI{Ah!0 zZ*goj$$(yu{Pzr1aVxRjs0iYEl#lSu`mUc89P5$%Z1YD64f5+*M6EAme||6l`ur=t1&&r~E`w3TGplojLiN-ZlL4BCTRkzCpC-9gMs8V%EXL~3)E^9>MI!=5$)eC`S)?oq4wn~} zhXc=wG71Pqqyh?!LdpMKFGms%6G1B=6_LVnBC_&wC>aq21$mgf99j+{A}1^(0xV|d zW{{-32okNhHMkr^7%eXglNXUyP*8v&RiKDK%R>}ka9~J;EE1|HECYq1k+LF+00RLPk@;H%zwWET;7}Ca z5{Ux?MGy)wc%Y?J)I4KGyLa+pHVX)<6jiqKdzK^QFz0i%U2g~1|dxFs+vpd*eKLE!<6 zF$4$(@V>vXv>&sQfum5e!T|iTP?Q1;3YC?UQ;-LY7^Mh9A?46OSN$IyKwCQ&UV%=T-!0(fwBwN4&ZEO?ZUMklN~6#aP0ujcGfOj+cDXJ zvJ2M^;B05@!nGZf9VokS?Eubp)-GJzG1-B#3)c?dY-jDlwH=ckD7$d&0M2&SE?nC& z*@3bP*AC!pXYInZ9g`g>yKwCQ&UV%=T-!0(fwBwN4&ZEO?ZUMklN~6#aP0ujcGfOj z+cDXJvJ2M^;B05@!nGZf9VokS?Eubp)-GJzG1-B#BV1H}d;lBX0r=E458&g~$ew!4 z0w2xBhCQvV1_F6=gFyZlL7>l@!0$;A$PEGlO<90IqIW=`BgC8L&lN!+)?sCN8C}o5 zu{f`LYD=5-2`gcC$`QD`m+m~@uM}&KBG|z$H;S;oN;-c?%e*2qLHi-@y-H;E^>m!_ z@|`+_;6(waTVhuuG4hK~xbx!{)f@dr3dB zD6d?vaL>zO8ij2Q^LAduu4(7==HaIN$h%JjOM`v8r2@3iu$G!-WMNO>dS=GmW^N&~ z^Ve^8EQMz1?M($et3pM0JnHK2Pfs`IwmA3^1nD1lT@-pdAHPqOWSq)zjfsu5hmx!0 zUf62 zrlnUlG3OmPCq&<}ccW>%kff?$-j71Flu=}fm+}}$gFj>WO7moozC7upeIEmYk9){y zJ=s^)FPJuJMc=)kZh`tJlo%6iF1Jb>Fq)K586L2{k97#-5E0zr?^b1YB_{f6I;Sbg z#$q5{@9{f(&!ZoW4MI$34q3Rw%U>7zTgI^P|!2fV6;$ z(2R1rvQcMI8hZb_N?c{OvHXX`Glf-7jcre(=*;)LnQ!l|^2OIT`BR@WIV^P}$;LjQbdYXES9ewlSin;bo>%V* z{RB=NOlM7})O8dyBRNW+9-6V_f@Y1TUKKp=Pam*>R&6*nUYO`g=DAL+a_W8RAV>N( zfUJsr~8) z$#rnAKM#>zyTvN1n4gJ1fXaV^06E;`=t=t|SS757h&Y&N8kZyb; zy5s(lM8V#Gx=sHT|L1~foV_~NTlcUST(Di6$~*p%{6IhtUod^V#P4*cSgw#eI%oXMQ7Q3MeP!Jw$zMC zSF!kdjC45jz2oWWeV)-BPM!Tzv(BQz{??%x7ih|YG|BH!HJepcd<~3GvRN-6xz1F@ z4}f2LqmD5>X5J=L@buQ~REX!%A^4TeG!lipvO7mZziTU+r>L^;g7ZJ-Ca33t104cE==pH>)algSI0+=f36h# z$d*@Y!vDcpRFDLFNN-ImgH-jS=UJ^M+=6K}x0Tw{NmO0C7mDtMO)BVl@Yh2R7tyco z_dJcT(cL?C|q%z;O`Kd0jVBeNOqzHvdO)NgE~Bvs0l4O&pdy z8H7_EUoMXMp17Il5ZJgdM8k3zWR#lTr$TWl6)jkQdX7^_gr=w^f74ehu+D7+GBxz_ z^pQ*EH*c4N1a2leF}y!->)qFuMk*TiNSS!|<=4i?dyFPc5+PAHnzf0ru{iyN zQ{g>b9*Tfv<${Q$D#KJ~2flVDAFqtmeSqcA=%FErJa&Vs7Wjbbg|QL7Ok8LGQQQ}O z)dCQCl}pu#c9ol{j_xejqCy-O%`%r|>Ttn7i?HxeFzrFZ?UnIsB_6MDIIksC)izhS zWim0GYFo*1UbU!0Z&o2`Ndyi2pZa@zKrPms7+QR5kY0mz0I`g&%`n|Eykn(dgRa+I zRgY`88G06BvUZKR+Z#ji5taAldOJ7RTq9J%L{{wtc=}W6-q15ue8u2f$?1J(rH?e< z?*vTx28+K5quv_HIleZD`{{i=fG^}Qir8Ob!KS8n3e#7;?6dcCa?*W#FOs^MWT6Sq zBIeTjbdIMnrY-mU*p1OLzl%8~pzBwqyQd~|u2*)Kmew_TtDWeuUnV0fbmq<)E$Uec zUU9~^yc=92+zTkzmTY-+WOIEGG+i)Tl~mNVU~;Uw*674J((~|>u12r#B;T>@9I01i z@ly>(a+4qBL}!8{>47Pblp0k%=GT!@k~>i0^DH+$To5PZAJF+q2LTve$z&jH&J_2DHM`^Z5}B&(OXrsl z_0DxlyHJ)4v%ft&6m949sJ&)?Wg*<6aNxp$9=<~XD@85F`0M@YBPTmH_hdOGoMMnWzIv*pye%(3HAwQW2j~YxOJp(kYWQch+O1Ot-^WhTNXzn(YRw4=XCg9}_AL!&0oRo8Tk+-(SgNxx0A3v>>v1a#cs` z3A(Cs{653y?5^m*Wxc|$m67$5*DsawAx6^aO&8H$`g4Ie8as5Ubgb(&lRyPrq6Nju zAZ#31XY0Z8<$kT$yO@)06Dv{t8Z*9LMrMNd`rg*eL{=E!>j%k#&U{{=4C3&jg?PEf z5`B-Arc6&I*|_AkD%l*B4c214Q!Y?JFaI zOovB6Z`3u9`PZ~vUu(D?X1Fn&k#2lDDXa({FiKE)L-6m=Dqgy6(sAz))%&XCTT3xR zDg86eGk82Kf(bR|2)~3KoNz`1OBb^?H5BcK9}ALt1%m>U_-9I4)-du&+YdmxA4;H z?p)OEAhtg{F96Ff_EY1ypcmAFW(zjQ1{J51S3i3}f}5cZ^=@HeIa~hNeMHM-?W@4^ zK>n&8q-^ve%PqzQb_mmcR45MJ)o~8Dpcu(?2#R zDg}$4wkld$3P{Piz&!8Rb~3+2o`xqZw2#}zmd>)H)~4@L%lm3F=e3J7$rt8;_+ZAX zqu2b#fOS9H;efmscF`eU$Ub%qjm))0)(ruH!8b1Ysbu~oRfDg^SlMU^{}8cNMY{Ln zoKJ#6j|(iT$uqpB6jqB!ZJ6(ETAgwlEV(CG(8Z|GnNc#Cc26)3Yb*FPTQ=DbGHI?| zJav6GQ$v5;o6O5`2uL2%@CmSonMpR7=Oiq_0VZ3AG{5oScNAHz`Vw@5)V7|Fyu$vHqq;FqzS=YQ1)#jrd92;+Ws?APZqo`nJVD)N3l6zGO zw2$KSHd-2L5=#`jlEpl3bfRCFNIwv+{?vSoO_cY<{`@&7J{LSk0>?f&ox?;e!BNA@ z@+BizeK$Nvm{S5%7kd2@-GP{)Pbx%u2#-HY;bN#>DWyXy#-c_!vzWpU;UGKhaI>%k zSuO0On*TM{8P;U155d2?FQQArw$re5OQ zLroHI7&)@SS}pd9h8(i)sIOVLj?A+Aiq3!PjaMpYh!Gk^3z1&8neTs+$D-ay4KW4@ zU&#tH->4!}=$tyl?PwRZ$vNhJe}FFM{8&5p2z+4`2rQR7JI*?3%fMCkG^euomU1cS zn6%acA+jPdodWJQ?j6+j%&hoq`2#H>;#+ZN6?)B14nA?-{yv%r&}8};jo_Z#@^pL8 z$83i@^RZ_rs*$57M>Y?0?G>2o{M-N;VG0UYM#_sfS>Y5fMJYfPZhgt0hGhUD2Nr&D zDmg`i^s%Pytgq0yTWVTQl=knRU=>Ic+;f5I#)}EG@bzPCi{UGiQ)^AL_wtE=Bn$c|Jna*PR zsdePN@?{A7W%kI_7Ve`Vdil`@KY6W5o?{E zt}@9Y^ZKzE;l3rr$mnO=X^r=T=<--WRC%U!IQMYZnJZVsp^Cn-_Zsw@9@U(+zB7C; zp(7<7`-&kkA$ZEYGRfxY_@};5?R&IQ_be0pKQ~L~emzMhOrovz^w5v@)|V$S)lmF=OdONP=5mejeT5S0WvxVBMSN9`^1Q z(mL4L=Y0q3vcao;iQVJ}{3pJ+eo=r2vDlHvuYKtkowno*lS-g(DU0Xv;Qp0WCfJeC=#O}ZEt2|#J4l&Wp2sBf@n zJSNfpK|`Sv(e$ZeO!3N%7p(*Wv-fm9aj<{?;TsZFp-U=mKI&`+@wV+F;RzBplk-bpZi<*tLI4jrmOwYg3oO{)G)v-2r zh4V$hY4x0}SCtJ@l2Q-++aA43OShOL4#_9*W-LEWvMH4HulGeeq-o|gEXAf!lrfyv z*9E`5T!j(yb}ks>a!^W+E9D|ehB$T((urh8#S1_6F3GHjOiPFgeT8&hRlAY()hoz$ zd1dV)2RU5Xq};@r$&ciLdvL7{eX@XA07XEqLYLuQVk(X@T@*6eiQwm~cbF{M!yY)u z)qk9;IE#xnP3SzkK;x-kt1vmww2hO)y?9>rFDh|ODiUH=uOpB#hde z(6NVu-l<$@cl)FyIUJjQnXxMSHLdX6xqQ9qvQB-+Vv&ZNCl`xd~tR!}=KD_@aqs=?Z*lUtx`QcZt68ps$Xc{hpKl znK^c{H}=PP6`ruqwH<38LQ4m4a(1|V&71kyvj60eq;sJNn1`Rs(;&r88%cTRn&}O=yOMEg6*=IbFho%DA#A6EU(k*~=e*Sne)|+h@xu zHgWo)g*Qu)W4>93$RI%~RwZgdie{$N^$wG>#q4PVi(22t%Nj0ZN<@*pD4Ls89eM8> zuOb|Xuh&i`THl;Eyr|iIgj_}LgRcayd()kEd?+QO(9^RW)eO=D($03~&GeRJwY0|% z6iRp*TQ*ORtg5a_#L+yvJS{zpo<25vJ|Ei@OHp}onCr$@-X--FWwyyufr`{2iTRa$ zzEm3Lj#G#96CgTMU3O88`FT~3GTE9`snxV~v!fV&vQyt`20h6NK4q5d%GiH9SY=pK z7tFYt%j{1hos}uF-{X>T@ilBIci(zILw6BbQTfyxQY@EjWnf5THV?T^sj2TEgD(v) zZ$O+eKY7KvYU_*f0Ax&xV0WV{Gh%^1hQxBVEOGQ5}fy%FOeAuAltZt!U$;Uwe|%N_$^wF37}#>;V|?@RFh&~`J54=>3B zq<|VIlK<+rFfu-UTUg8!L)O+7wXv_=s4h5?r}$pjD3C$q-D43nR+q?1@6+MdOyCOA z8aw+`$0;;pa8@vbBA$EneVvMLMNA~O7|FwlucY-%kO#)zO(=_j4@+}`LIGUJ%B#n; zDVHen1`ZwFkE7_G43M4yvYXqk&zdSV-j$pX8!vo#WO2Bx@0HZ8lCa?YCwm<&ruHgL z1aLlf8{~?9>1QaWG&NRRxOstHVAAX1m}uA?*I6!XMkahr5)+ucJ1os`pQ+GS!9!;NYCY+3Chf4UVi+ z4>ZVwvLJc69haVuLmZ2`gnXQvneqhTc^B1MBQ@aaSN%N9HD4?8b`N?Gr(S_ezF4 zy53f}x!a^fwe@H(I+ATS%-O%|MKal^}-KU<`g~*bWA802ylt~>Jxx4I>%Axus zm|?CVy76)1%)a9$HyA85>y)*g5OAIE+JN+Z{c7U9;*c48kQ$?&?S!*vnKf;U+ToER z)jB6l|SZd+V?|UBP#%dSf_OCQLEj>1U@#yJMS$$eL`KH$16O2YC zM@*YfRLudYJXJ(y>g=P2{2TCaS?iREadLVkLp2TtG_6 zHp^e?POZ7A9_KV#9`>JG=sbHMkbYlfrEn8injQ=t zHa{lyiRkbM`i`%S1ecgF9B#HN$W0z(5F!KI9 zKBzE<{IE)MWNjg-Ifcs9<-Frd(nVuZJkJZ`3%ZcXz9lujFtYIj3^2g^Yc}`RHk>qS z69kf-(h$PSxX_GQc@%O_EnkLy{kZGbDel~wvjV)6&j$+9=>`;T5Bq!4A9g2uv+{^% ztg25Xrz#|x29ts&FDphC`RtQ`tr9lE6w7Cvy_6Z)*SHlvw+!eh6iyNs!yb%2Jo1G0 zrM9Y%JK(SDItS#^=qUS-U#AGU3LT#bN2XJ*i_Me{=NW2Bnjd)_=SL?YqknMo8iydU zL}5|z)bpn9^0Bi;r{1DXs+S%aqlJn{mCgWp=eqb=OB)OF;m9g=r;>IvbJ8yv5BbAq zY3C%#B09Y~NO`Y%%$$3jNnPDq0eiiqV0}Q(IaC6Z^x#6%NB1k`40LWfW)v!CE=WDX zSC4#Ty}(@$oqa&N^5SUwkde|;L(O+N)Qyd=jSm|nJ`LqfYm8BPz;lkhTIiXn!y6`r z&bq^|vj=O&;?2jUDZ3{mn>QcZ-F^`L^*r-bPq3$Sz1CpWko1v9$J`qO7VU2qdOv}o zN(xN%=lLLZR;TG>2ZFy&n0)k(dCV(-F%+xUOisa{?pcoNKp@N!fZfo1Y=O&;ejj- z*i&M`xT5|c^ZXoTEkn^uA61U_qre-rK&7NE+)~Nv`Kcn3+sFO#qNni`(pNF)el$9! zOgUCm#I7LlW2h+_bzbS}B=ZMzXx_R5?BZuP>ZW^c*Tt=6ic=z;m~Z%yxoEs358>)a zWv&{zNk%uq8)Q|e+^kY0i5*<7Y;9o?i+z#8PA%)lK2s@mnZ?kj<gY1t&1qqh^?AbRf%T#+)Cia`|&e?({o&|IuBlKqer)h}JH*ywdVDZNh)H^mxp zus?OcA8UTQhCKRE>If-q&8+{;13kRPM+!m{7&R^fKD05n@{IoTvFgDugpu;7M(VCe zOuNMy%l=HEAnql39+jH?f)n=K4eklRnYn+%Yb-v?iU5t48r;Kjvip-NCC#g2At`iO zW*rF)BV{*1*9*T&Bx8Uc6~vh|th;p$dDNJKH8`BzEU+{3G3C+J)SQ6=z(+XGCf6+} z7`iBWdXayC-tR1fNUS~gUl1@ZOE~K74Hy79x96Q_7c~6JWCpc*h^(FC1MKBTyBU_G zCl;NUlk3m;!_BX1O2&NBzHms7nOE-R)oF>xGRgOfnw?h}{5)0!1zDRJEW|lp*CwNZ zn}y@~SHj#lT`(!t?Os6|mq`uVQDEQtibS4R80w4i-SANY!tkVhmBC87WDUVyRcBaR8N^ug;k2wHGK8-?WDrcam42o-6F4>>Q z=27zX*Vgj*js#1f8-3SuFSTFL%Dm=A{Ao0$%FrujlKR8+AhN3Bssx0Yxo+K|qnQ2^ zjJ-xjx^5v3BR)w1g~YOP`_YQ>VWvIsCTJI&6XqDC4r)^r>#@o1=cT6&+4mm#BdL6Xfr%Hvrtu7k0gq$R+WnS|G>kE2}qv&*x{FW6J2Ra@>DKDh*cX{Mu;Bc+BEb^CZgnK>8bJ(N?~U<$ZV2>dYLn+=wxb zo8HC(0~CwR^>2F~1SA=sdUrrpi+Q2~7bxcVSh_Znk$YA_o}<+vs$}4xX&t!ubuZtZ zvF^2;lM2(JA1Ir`m!*U_sy~F{ST86}O_yayklZ?}uH?HU zrVxRgrw>x8U1cV@10Psl=SZ)DKO9A|ldr_rS$~SZwyzuV!@6;=9sD{@Im}=8;oHM)As1b0IA|WQJVUMqV=w3EUPf5AjG=Y<_hgw%|0Cy6= zHpGUQ^7aQP^qMY|C)r$J=>0^6eOJL%uOOWFkl|ibv3#&Od#vB_{n-`FJ@-uN9&Mfg Z@nlcg(N;vf1g?ca$_nc8IkFak{|DgK*&P4? literal 0 HcmV?d00001 diff --git a/public/logo/tenpixls.png b/public/logo/tenpixls.png new file mode 100644 index 0000000000000000000000000000000000000000..ed83a4bfa7cb07404719e876dd6503d8509143e2 GIT binary patch literal 22817 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 literal 0 HcmV?d00001 diff --git a/public/logo/travelpayouts.svg b/public/logo/travelpayouts.svg new file mode 100644 index 0000000..0a4d13d --- /dev/null +++ b/public/logo/travelpayouts.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/logo/unicef.svg b/public/logo/unicef.svg new file mode 100644 index 0000000..818513d --- /dev/null +++ b/public/logo/unicef.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logo/uptarget.png b/public/logo/uptarget.png new file mode 100644 index 0000000000000000000000000000000000000000..d607148c7faabe2c155ef618046e04e90253869b GIT binary patch literal 30474 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 adU)K(?W=k8xOqe8uOgNEf&T|wt-a0w literal 0 HcmV?d00001 diff --git a/public/logo/vk.svg b/public/logo/vk.svg new file mode 100644 index 0000000..53c444b --- /dev/null +++ b/public/logo/vk.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/make-scrollable-code-focusable.js b/public/make-scrollable-code-focusable.js new file mode 100644 index 0000000..6fbf1ee --- /dev/null +++ b/public/make-scrollable-code-focusable.js @@ -0,0 +1,3 @@ +Array.from(document.getElementsByTagName("pre")).forEach((element) => { + element.setAttribute("tabindex", "0"); +}); diff --git a/src/components/DropDownMenu.astro b/src/components/DropDownMenu.astro new file mode 100644 index 0000000..c9622f9 --- /dev/null +++ b/src/components/DropDownMenu.astro @@ -0,0 +1,208 @@ +--- +import { getPathParamsFromId, getTextLocalized, type LText } from "../languages"; + +interface Link { + link: string; + text: LText; +} + +interface Group { + text: LText; + links: Link[]; +} + +export interface Props { + links: (Group | Link)[]; + class?: string; +} + +const { links } = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +

+ + diff --git a/src/components/FeatureCard.astro b/src/components/FeatureCard.astro new file mode 100644 index 0000000..f319699 --- /dev/null +++ b/src/components/FeatureCard.astro @@ -0,0 +1,37 @@ +--- +interface Props { + title: string; + description: string; + link: string; +} +--- + + +
+
{Astro.props.title}
+
{Astro.props.description}
+
+ + diff --git a/src/components/Footer/Footer.astro b/src/components/Footer/Footer.astro new file mode 100644 index 0000000..fba6b4e --- /dev/null +++ b/src/components/Footer/Footer.astro @@ -0,0 +1,92 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "../../languages"; +import { FOOTER_LINKS } from "../../navigation"; +import IconExternal from "../../icons/External.astro"; +import { LINKS } from "../../consts"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +
+
+ { + FOOTER_LINKS.map((group) => { + const text = getTextLocalized(group, lang); + + return ( +
+

{text}

+ {group.items.map((link) => { + const text = getTextLocalized(link, lang); + const external = link.link.startsWith("https://") || link.link.startsWith("http://"); + const href = external ? link.link : createLink(link, lang); + + if (external) { + return ( + + ); + } + + return ( + + ); + })} +
+ ); + }) + } +
+ + zerobias & Effector Core team + + © 2018-{new Date().getFullYear()} +
+
+
+ + diff --git a/src/components/HeadCommon.astro b/src/components/HeadCommon.astro new file mode 100644 index 0000000..9ee7000 --- /dev/null +++ b/src/components/HeadCommon.astro @@ -0,0 +1,47 @@ +--- +import "../styles/theme.css"; +import "../styles/index.css"; +import "../styles/language.css"; +--- + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/HeadSEO.astro b/src/components/HeadSEO.astro new file mode 100644 index 0000000..f2209fa --- /dev/null +++ b/src/components/HeadSEO.astro @@ -0,0 +1,48 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { SITE, OPEN_GRAPH } from "../consts"; + +type DocsEntry = CollectionEntry<"docs">["data"]; +interface Props extends DocsEntry { + canonicalUrl: URL; +} + +const { ogLocale, image, title, description, canonicalUrl } = Astro.props; +const formattedContentTitle = `${title} 🚀 ${SITE.title}`; +const imageSrc = image?.src ?? OPEN_GRAPH.image.src; +const canonicalImageSrc = new URL(imageSrc, Astro.site); +const imageAlt = image?.alt ?? OPEN_GRAPH.image.alt; +--- + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Header/EffectorLogo.astro b/src/components/Header/EffectorLogo.astro new file mode 100644 index 0000000..0690f54 --- /dev/null +++ b/src/components/Header/EffectorLogo.astro @@ -0,0 +1,8 @@ +--- +type Props = { + size: number; +}; +const { size } = Astro.props; +--- + +effector comet diff --git a/src/components/Header/Header.astro b/src/components/Header/Header.astro new file mode 100644 index 0000000..6b30ebb --- /dev/null +++ b/src/components/Header/Header.astro @@ -0,0 +1,282 @@ +--- +import { + createChangeLangLinks, + createLink, + getPathParamsFromId, + getTextLocalized, + translations, +} from "../../languages"; +import { SITE } from "../../consts"; +import { DESKTOP_NAVIGATION, SOCIAL_LINKS, DOCS_VERSIONS, QUICK_MENU } from "../../navigation"; + +import MobileNavigation from "../MobileNavigation.astro"; +import DropDownMenu from "../DropDownMenu.astro"; + +import EffectorLogo from "./EffectorLogo.astro"; +import MobileMenuButton from "./MobileMenuButton.astro"; +import Search from "./Search.astro"; +import SkipToContent from "./SkipToContent.astro"; +import ThemeToggle from "./ThemeToggleButton"; + +import IconExternal from "../../icons/External.astro"; +import IconLanguage from "../../icons/Language.astro"; +import IconDots from "../../icons/Dots.astro"; + +import IconGithub from "../../icons/Github.astro"; +import IconTwitter from "../../icons/Twitter.astro"; +import IconDiscord from "../../icons/Discord.astro"; +import IconYoutube from "../../icons/Youtube.astro"; + +const socialIcons = { + github: IconGithub, + twitter: IconTwitter, + discord: IconDiscord, + youtube: IconYoutube, +}; + +type Props = { + currentPage: string; +}; + +const { lang, slug } = getPathParamsFromId(Astro.url.pathname); +const languageLinks = createChangeLangLinks({ slug }); +const homeLink = lang === "en" ? "/" : `/${lang}`; +--- + +
+ + + +
+ + + diff --git a/src/components/Header/MobileMenuButton.astro b/src/components/Header/MobileMenuButton.astro new file mode 100644 index 0000000..03fc7fc --- /dev/null +++ b/src/components/Header/MobileMenuButton.astro @@ -0,0 +1,73 @@ +--- +import IconMenu from "../../icons/Menu.astro"; + +// Animation copied from https://github.com/shuding/nextra/blob/a84ed9642e59a9f60c3cf1eaeca643b1f425bd9f/packages/nextra-theme-docs/css/hamburger.css +--- + + + + + + + + diff --git a/src/components/Header/Search.astro b/src/components/Header/Search.astro new file mode 100644 index 0000000..8f08614 --- /dev/null +++ b/src/components/Header/Search.astro @@ -0,0 +1,368 @@ +--- +import { getPathParamsFromId, getTextLocalized as t, translations } from "../../languages"; +import "@pagefind/default-ui/css/ui.css"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +const pagefindTranslations = Object.fromEntries( + Object.entries(translations.Pagefind).map(([key, value]) => [key, t(value, lang)]), +); +--- + + + + + +
+ { + import.meta.env.DEV && !import.meta.env.PUBLIC_SEARCH ? ( +
+

{t(translations.Search.devWarning, lang)}

+
+ ) : ( + +
+
+ + + + + + diff --git a/src/components/Header/SkipToContent.astro b/src/components/Header/SkipToContent.astro new file mode 100644 index 0000000..0f94c8a --- /dev/null +++ b/src/components/Header/SkipToContent.astro @@ -0,0 +1,29 @@ +--- +type Props = {}; +--- + + + + diff --git a/src/components/Header/ThemeToggleButton.css b/src/components/Header/ThemeToggleButton.css new file mode 100644 index 0000000..1e420d0 --- /dev/null +++ b/src/components/Header/ThemeToggleButton.css @@ -0,0 +1,30 @@ +.theme-toggle { + @apply flex items-center gap-1 rounded-full px-2 py-1; + background-color: var(--theme-code-inline-bg); +} + +.theme-toggle > label:focus-within { + outline: none; + color: var(--theme-text-accent); + @apply ring-1 ring-current ring-offset-2; +} + +.theme-toggle > label { + @apply relative flex cursor-pointer items-center justify-center rounded-full opacity-50; + color: var(--theme-code-inline-text); +} + +.theme-toggle .checked { + opacity: 1; + color: var(--theme-accent); +} + +input[name="theme-toggle"] { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0; + z-index: -1; +} diff --git a/src/components/Header/ThemeToggleButton.tsx b/src/components/Header/ThemeToggleButton.tsx new file mode 100644 index 0000000..dddb4aa --- /dev/null +++ b/src/components/Header/ThemeToggleButton.tsx @@ -0,0 +1,121 @@ +import type { FunctionalComponent } from "preact"; +import { useState, useEffect } from "preact/hooks"; +import "./ThemeToggleButton.css"; + +const themes = ["light", "auto", "dark"]; + +const icons = [ + + + + + , + + + + + + + + + , + + + + + + , +]; + +const ThemeToggle: FunctionalComponent = () => { + const [selectedTheme, setSelectedTheme] = useState(() => { + if (import.meta.env.SSR) { + return undefined; + } + if (typeof localStorage !== undefined && localStorage.getItem("theme")) { + return localStorage.getItem("theme"); + } + return "auto"; + }); + + useEffect(() => { + const root = document.documentElement; + function setTheme(color: string) { + if (color === "light") { + root.classList.remove("theme-dark"); + } else { + root.classList.add("theme-dark"); + } + } + + if (selectedTheme === "auto") { + const matcher = window.matchMedia("(prefers-color-scheme: dark)"); + setAutomaticTheme(); + matcher.addEventListener("change", setAutomaticTheme); + return () => matcher.removeEventListener("change", setAutomaticTheme); + function setAutomaticTheme() { + setTheme(matcher.matches ? "dark" : "light"); + } + } else { + setTheme(selectedTheme || "light"); + } + }, [selectedTheme]); + + return ( +
+ {themes.map((t, i) => { + const icon = icons[i]; + const checked = t === selectedTheme; + return ( + + ); + })} +
+ ); +}; + +export default ThemeToggle; diff --git a/src/components/Landing/Companies.astro b/src/components/Landing/Companies.astro new file mode 100644 index 0000000..c01432b --- /dev/null +++ b/src/components/Landing/Companies.astro @@ -0,0 +1,221 @@ +--- +import { getPathParamsFromId, getTextLocalized, translations } from "../../languages"; + +const companies = [ + { + url: "aviasales.png", + alt: "Aviasales", + yOffset: true, + }, + { + url: "healthSamurai.svg", + alt: "Health Samurai", + }, + { + url: "raiffeisen.svg", + alt: "Raiffeisen Bank Russia", + }, + { + url: "unicef.svg", + alt: "UNICEF (United Nations Children’s Fund)", + }, + { + url: "joom.svg", + alt: "Joom Group", + }, + { + url: "sber.png", + alt: "Sber", + }, + { + url: "avito.svg", + alt: "Avito", + scale: 1.4, + }, + { + url: "mts.svg", + alt: "MTS", + }, + { + url: "docsvision.png", + alt: "Docsvision", + scale: 1.2, + }, + { + url: "okoo.png", + alt: "Okoo", + yOffset: true, + }, + { + url: "space307.svg", + alt: "space307", + }, + { + url: "redmadrobot.png", + alt: "REDMADROBOT", + yOffset: true, + }, + { + url: "travelpayouts.svg", + alt: "Travelpayouts", + }, + { + url: "junto.png", + alt: "Junto", + }, + { + url: "automationhero.svg", + alt: "automation hero", + }, + { + url: "radity.png", + alt: "Radity", + }, + { + url: "globalCtoForum.png", + alt: "Global CTO Forum", + }, + { + url: "express24.svg", + alt: "Express24", + scale: 1.4, + }, + { + url: "stellarX.svg", + alt: "StellarX", + }, + { + url: "stmLabs.png", + alt: "STM Labs", + }, + { + url: "tenpixls.png", + alt: "TenPixls", + }, + { + url: "uptarget.png", + alt: "Uptarget", + }, + { + url: "smartomato.svg", + alt: "смартомато", + }, + { + url: "foxford.svg", + alt: "Фоксфорд", + }, + { + url: "codengage.png", + alt: "Codengage", + }, + { + url: "lunatask.png", + alt: "Lunatask", + }, + { + url: "semrush.png", + alt: "Semrush", + }, + { + url: "intouchHealth.png", + alt: "Intouch Health, a Teladoc company", + }, +]; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +
+

+ {getTextLocalized(translations.Landing.Companies.title, lang)} +

+
    + { + companies.map(({ url, alt, yOffset, scale }) => { + return ( +
  • + {alt} +
  • + ); + }) + } +
+
+ + {getTextLocalized(translations.Landing.Companies.wantToAppear, lang)} + + + {getTextLocalized(translations.Landing.Companies.tellUs, lang)} + +
+
+ + diff --git a/src/components/Landing/Feature.astro b/src/components/Landing/Feature.astro new file mode 100644 index 0000000..ac71d2d --- /dev/null +++ b/src/components/Landing/Feature.astro @@ -0,0 +1,59 @@ +--- +interface Props { + kind?: "major" | "minor"; + emoji?: string; + title: string; +} + +const { kind, emoji, title } = Astro.props; +--- + +
+
{emoji}
+
{title}
+

+
+ + diff --git a/src/components/Landing/FeaturesGrid.astro b/src/components/Landing/FeaturesGrid.astro new file mode 100644 index 0000000..3bac2e5 --- /dev/null +++ b/src/components/Landing/FeaturesGrid.astro @@ -0,0 +1,14 @@ +
+
+ +
+
+ + diff --git a/src/components/Landing/Hero.astro b/src/components/Landing/Hero.astro new file mode 100644 index 0000000..23fe375 --- /dev/null +++ b/src/components/Landing/Hero.astro @@ -0,0 +1,110 @@ +--- +import IconChevron from "@icons/Chevron.astro"; + +interface Props { + subtitle: string; +} + +/** + * Pass any content without slot to be a description. + * Add `slot="links"` to appear in the links section. + * Many links allowed. Only class `.primary` is supported now + */ +--- + +
+
effector
+
{Astro.props.subtitle}
+

+ +

+ +
+ + diff --git a/src/components/Landing/Stats.astro b/src/components/Landing/Stats.astro new file mode 100644 index 0000000..2232116 --- /dev/null +++ b/src/components/Landing/Stats.astro @@ -0,0 +1,257 @@ +--- +import { Octokit } from "@octokit/rest"; +import { promisify } from "node:util"; +import * as childProcess from "node:child_process"; + +import { GITHUB_REPO } from "../../consts"; +import IconCopy from "../../icons/Copy.astro"; +import { getPathParamsFromId, getTextLocalized } from "../../languages"; +import { translations } from "src/languages"; + +const exec = promisify(childProcess.exec); + +const { lang } = getPathParamsFromId(Astro.url.pathname); + +const [owner, repo] = GITHUB_REPO.split("/"); +const repoInfo = { owner, repo }; + +const octokit = new Octokit({ auth: import.meta.env.GITHUB_TOKEN }); + +const formatDate = (date: Date) => { + const month = (date.getMonth() + 1).toString().padStart(2, "0"); + const day = date.getDate().toString().padStart(2, "0"); + return `${date.getUTCFullYear()}-${month}-${day}`; +}; + +async function getNpmStats() { + const to = new Date(); + const from = new Date("2018-01-17T03:17:09.763Z"); + const fromDateString = formatDate(from); + const toDateString = formatDate(to); + + const downloadCounts = await fetch( + `https://npm-stat.com/api/download-counts?package=effector&from=${fromDateString}&until=${toDateString}`, + ).then((r) => r.json()); + + const result = await exec("npm info effector --json"); + const npm = JSON.parse(result.stdout); + const latest = npm["dist-tags"].latest; + + const totalDownloads = + Object.values(downloadCounts.effector) + .slice(-30) + .reduce((total, count) => total + count) / 1000; + + return { + latest, + downloads: `${totalDownloads.toFixed(0)}K`, + }; +} + +async function getRepoStats() { + const { data: repo } = await octokit.repos.get(repoInfo); + + let contributorsCount = 0; + let page = 1; + while (true) { + const { data: pageContributors } = await octokit.repos.listContributors({ + ...repoInfo, + per_page: 100, + page, + }); + contributorsCount += pageContributors.length; + + if (pageContributors.length < 100) { + break; + } + page++; + } + + return { + stars: repo.stargazers_count.toLocaleString("en-US"), + contributors: contributorsCount, + license: repo.license?.spdx_id, + }; +} + +async function getGzipSize() { + try { + const response = await fetch("https://bundlephobia.com/api/size?package=effector@latest"); + + if (response.ok) { + const { gzip } = await response.json(); + + if (!gzip) { + throw new Error("No gzip size in the bundlephobia answer"); + } + + return { + size: `${(gzip / 1024).toFixed(1)} kB`, + }; + } else { + console.error(`Bundlephobia answer is not OK: ${response.statusText}`); + return { size: "11.9 kB" }; + } + } catch (error) { + console.error("Failed to fetch gzip size:", error); + } +} + +const statsMeta = { + size: { + label: getTextLocalized(translations.Landing.Stats.size, lang), + link: "https://bundlephobia.com/package/effector@latest", + }, + contributors: { + label: getTextLocalized(translations.Landing.Stats.contributors, lang), + link: "https://github.com/effector/effector/graphs/contributors", + }, + stars: { + label: getTextLocalized(translations.Landing.Stats.stars, lang), + link: "https://star-history.com/#effector/effector&Date", + }, + downloads: { + label: getTextLocalized(translations.Landing.Stats.downloads, lang), + link: "https://npmtrends.com/effector", + }, + latest: { + label: getTextLocalized(translations.Landing.Stats.latest, lang), + link: "https://github.com/effector/effector/releases", + }, + license: { + label: getTextLocalized(translations.Landing.Stats.license, lang), + link: "https://raw.githubusercontent.com/effector/effector/master/LICENSE", + }, +}; + +const gettingStartedText = getTextLocalized( + translations.Landing.Stats.StartByAddingEffectorAsDependency, + lang, +); + +const stats = await Promise.all([getRepoStats(), getNpmStats(), getGzipSize()]).then( + ([repo, npm, size]) => ({ ...repo, ...npm, ...size }), +); +--- + +
+

+ {getTextLocalized(translations.Landing.Stats.title, lang)} +

+
+
+ { + Object.entries(stats).map(([name, counter]) => { + return ( + + {counter} + {statsMeta[name as keyof typeof stats].label} + + ); + }) + } +
+
+ {gettingStartedText}: +
+ + npm install effector + + + + +
+
+
+
+ + + + diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro new file mode 100644 index 0000000..7c1c97a --- /dev/null +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -0,0 +1,160 @@ +--- +import type { MarkdownHeading } from "astro"; +import { getPathParamsFromId } from "../../languages"; +import { + getLocalizedSidebar, + getSidebarForSlug, + markActiveNavigation, + MOBILE_NAVIGATION, +} from "../../navigation"; +import NestedLinks from "../NestedLinks.astro"; + +type Props = { + currentPage: string; + headings: MarkdownHeading[]; +}; + +const { currentPage } = Astro.props; +const currentPageMatch = currentPage.endsWith("/") ? currentPage.slice(0, -1) : currentPage; + +const { slug, lang } = getPathParamsFromId(Astro.url.pathname); +const baseSidebar = await getLocalizedSidebar(slug, lang); +// TODO: add collapsible groups +--- + + + + + + + + diff --git a/src/components/LiveDemo.jsx b/src/components/LiveDemo.jsx new file mode 100644 index 0000000..d82dd09 --- /dev/null +++ b/src/components/LiveDemo.jsx @@ -0,0 +1,23 @@ +import {Sandpack} from '@codesandbox/sandpack-react' + +const customSetup = { + dependencies: { + effector: 'latest' + }, +} + +export default function LiveDemo({demoFile, layout = 'console'}) { + const files = { + '/index.js': demoFile, + } + + return ( + + ) +} diff --git a/src/components/MobileNavigation.astro b/src/components/MobileNavigation.astro new file mode 100644 index 0000000..d3b8d43 --- /dev/null +++ b/src/components/MobileNavigation.astro @@ -0,0 +1,117 @@ +--- +import { markActiveNavigation, MOBILE_NAVIGATION, SOCIAL_LINKS } from "../navigation"; +import { createChangeLangLinks, getPathParamsFromId, getTextLocalized } from "../languages"; + +import NestedLinks from "./NestedLinks.astro"; + +import IconGithub from "../icons/Github.astro"; +import IconTwitter from "../icons/Twitter.astro"; +import IconDiscord from "../icons/Discord.astro"; +import IconYoutube from "../icons/Youtube.astro"; + +const socialIcons = { + github: IconGithub, + twitter: IconTwitter, + discord: IconDiscord, + youtube: IconYoutube, +}; + +const { slug, lang } = getPathParamsFromId(Astro.url.pathname); +const languageLinks = createChangeLangLinks({ slug }); +const activeNavigation = markActiveNavigation(`/${slug.replace(/\/$/, "")}`, MOBILE_NAVIGATION); +--- + + + + + + diff --git a/src/components/NestedLinks.astro b/src/components/NestedLinks.astro new file mode 100644 index 0000000..b4b3280 --- /dev/null +++ b/src/components/NestedLinks.astro @@ -0,0 +1,201 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "../languages"; +import { isNavGroup, isNavLink, isNavLinkGroup, type LMobileNavItem } from "../navigation"; + +import IconChevronRight from "../icons/Chevron.astro"; +import IconExternal from "../icons/External.astro"; +import { nanoid } from "nanoid"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); + +interface Props { + items: LMobileNavItem[]; + firstLevel?: boolean; + expandDefault?: boolean; +} + +const { firstLevel = false, expandDefault, items } = Astro.props; +const instanceId = nanoid(5); +--- + +
    + { + items.map((item) => { + const isExpandable = isNavLinkGroup(item) || isNavGroup(item); + const isLink = isNavLink(item) || isNavLinkGroup(item); + const text = getTextLocalized(item, lang); + const expanded = expandDefault ? expandDefault : item.active; + + if (isLink) { + const external = item.link.startsWith("https://") || item.link.startsWith("http://"); + return ( +
  • +
    + {isExpandable ? ( + + ) : null} + + {text} + {external ? : null} + +
    + {isExpandable ? ( +
    + +
    + ) : null} +
  • + ); + } + + if (isExpandable) { + return ( +
  • +
    + +
    +
    + +
    +
  • + ); + } + + return ( +
  • +
    + {text} +
    +
  • + ); + }) + } +
+ + + + diff --git a/src/components/NotTranslatedYet.astro b/src/components/NotTranslatedYet.astro new file mode 100644 index 0000000..bf7090c --- /dev/null +++ b/src/components/NotTranslatedYet.astro @@ -0,0 +1,29 @@ +--- +import { GITHUB_BRANCH, GITHUB_DOCS_CONTENT_DIR, GITHUB_REPO } from "../consts"; +import { getTextLocalized, translations } from "../languages"; + +interface Props { + lang: string; +} + +const { lang } = Astro.props; + +const DOCS_LINK = `https://github.com/${GITHUB_REPO}/tree/${GITHUB_BRANCH}/${GITHUB_DOCS_CONTENT_DIR}/${lang}`; +--- + +
+
+ + {getTextLocalized(translations.ThisPageIsNotTranslatedYet, lang)} + +
+
+

+ {getTextLocalized(translations.PleaseOpenPRWithTranslations, lang)} + {getTextLocalized(translations.usingThisLink, lang)}. +

+

+ {getTextLocalized(translations.ShowingContentForDefaultLanguage, lang)}. +

+
+
diff --git a/src/components/PageContent/Announcement.astro b/src/components/PageContent/Announcement.astro new file mode 100644 index 0000000..27ffefa --- /dev/null +++ b/src/components/PageContent/Announcement.astro @@ -0,0 +1,50 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "src/languages"; +import { ANNOUNCEMENT } from "../../consts"; + +const { lang = "en" } = getPathParamsFromId(Astro.url.pathname); +function isRemote(link: string) { + return link.startsWith("http://") || link.startsWith("https://"); +} +--- + +{ + ANNOUNCEMENT ? ( +
+
{getTextLocalized({ text: ANNOUNCEMENT.title }, lang)}
+
{getTextLocalized(ANNOUNCEMENT, lang)}
+ {ANNOUNCEMENT.button ? ( + + ) : null} +
+ ) : null +} + + diff --git a/src/components/PageContent/Contributors.astro b/src/components/PageContent/Contributors.astro new file mode 100644 index 0000000..e1ebc84 --- /dev/null +++ b/src/components/PageContent/Contributors.astro @@ -0,0 +1,208 @@ +--- +import { Octokit } from "@octokit/rest"; +import { + GITHUB_COMMITS_URL, + GITHUB_DOCS_CONTENT_DIR, + GITHUB_DOCS_ROOT, + GITHUB_REPO, +} from "../../consts"; +import { getPathParamsFromId, getTextLocalized, translations } from "src/languages"; + +// fetch all commits for just this page's path +type Props = { + documentId: string; +}; +const { documentId } = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); + +const fullFilePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); +const commitsURL = [GITHUB_COMMITS_URL, fullFilePath].join(""); + +const [owner, repo] = GITHUB_REPO.split("/"); + +const octokit = new Octokit({ auth: import.meta.env.GITHUB_TOKEN }); + +async function loadContributors() { + if (!import.meta.env.GITHUB_TOKEN) { + return []; + } + const filePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); + const { data: commits } = await octokit.repos.listCommits({ + owner, + repo, + path: filePath, + per_page: 100, + }); + + interface Contributor { + id: number; + login: string; + avatar: string; + commits: number; + } + + const contributors = new Map(); + + function add(user: { id: number; login: string; avatar: string }) { + const exist = contributors.get(user.id); + // Let's count total amount of commits + if (exist) { + exist.commits++; + } else { + contributors.set(user.id, { ...user, commits: 1 }); + } + } + commits.forEach((commit) => { + if (commit.author) { + add({ + id: commit.author.id, + login: commit.author.login, + avatar: commit.author.avatar_url, + }); + } + if (commit.committer) { + add({ + id: commit.committer.id, + login: commit.committer.login, + avatar: commit.committer.avatar_url, + }); + } + }); + return Array.from(contributors.values()) + .filter((user) => user.login !== "web-flow") + .sort((a, b) => b.commits - a.commits); +} + +const contributors = await loadContributors().catch((error) => { + if (!import.meta.env.GITHUB_TOKEN) { + console.info("Provide GITHUB_TOKEN env with Personal Access Token."); + } + console.info("Failed to load contributors. Skipping..."); + console.error(error); + return []; +}); + +const recentContributors = contributors.slice(0, 5).sort((a, b) => a.commits - b.commits); // only show avatars for the 3 most recent contributors +const additionalContributors = contributors.length - recentContributors.length; // list the rest of them as # of extra contributors +--- + +
+ {getTextLocalized(translations.Contributors, lang)} +
+ + +
+ { + recentContributors.length > 0 && ( +
    + {recentContributors.map((contributor) => ( +
  • + + {`Contributor + +
  • + ))} +
+ ) + } + { + additionalContributors > 0 && ( + + {`and ${additionalContributors} additional contributor${ + additionalContributors > 1 ? "s" : "" + }.`} + + ) + } + Commits +
+ + diff --git a/src/components/PageContent/PageContent.astro b/src/components/PageContent/PageContent.astro new file mode 100644 index 0000000..d8d5ea8 --- /dev/null +++ b/src/components/PageContent/PageContent.astro @@ -0,0 +1,182 @@ +--- +import type { MarkdownHeading } from "astro"; +import { getPathParamsFromId } from "../../languages"; +import MoreMenu from "../RightSidebar/MoreMenu.astro"; +import TableOfContents from "../RightSidebar/TableOfContents"; + +type Props = { + title: string; + headings: MarkdownHeading[]; + translations: { lang: string; slug: string }[]; + breadcrumbs?: { title: string; path: string }[]; + documentId: string; + pagefindWeight?: number; + indexing: boolean; +}; + +const { + title, + headings, + indexing, + documentId, + translations = [], + breadcrumbs = [], + pagefindWeight = 0, +} = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +
+
+ + + +
+ +
+ + diff --git a/src/components/RightSidebar/MoreMenu.astro b/src/components/RightSidebar/MoreMenu.astro new file mode 100644 index 0000000..ffb297f --- /dev/null +++ b/src/components/RightSidebar/MoreMenu.astro @@ -0,0 +1,61 @@ +--- +import clsx from "clsx"; +import { + COMMUNITY_INVITE_URL, + GITHUB_DOCS_CONTENT_DIR, + GITHUB_DOCS_ROOT, + GITHUB_EDIT_URL, +} from "../../consts"; +import { getPathParamsFromId, getTextLocalized, translations } from "../../languages"; + +import IconDiscordLined from "../../icons/DiscordLined.astro"; +import IconEditPencil from "../../icons/EditPencil.astro"; + +import styles from "./TableOfContents.module.css"; + +type Props = { + documentId: string; +}; + +const { documentId } = Astro.props; +const showMoreSection = Boolean(COMMUNITY_INVITE_URL); +const { lang } = getPathParamsFromId(Astro.url.pathname); +const editFilePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); +const editUrl = [GITHUB_EDIT_URL, editFilePath].join(""); +--- + +{ + showMoreSection && ( +

+ {getTextLocalized(translations.More, lang)} +

+ ) +} + + + diff --git a/src/components/RightSidebar/RightSidebar.astro b/src/components/RightSidebar/RightSidebar.astro new file mode 100644 index 0000000..d3fa832 --- /dev/null +++ b/src/components/RightSidebar/RightSidebar.astro @@ -0,0 +1,42 @@ +--- +import type { MarkdownHeading } from "astro"; +import TableOfContents from "./TableOfContents"; +import MoreMenu from "./MoreMenu.astro"; + +type Props = { + headings: MarkdownHeading[]; + documentId: string; + lang: string; +}; + +const { headings, documentId, lang } = Astro.props; +--- + + + + diff --git a/src/components/RightSidebar/TableOfContents.module.css b/src/components/RightSidebar/TableOfContents.module.css new file mode 100644 index 0000000..1fb5aef --- /dev/null +++ b/src/components/RightSidebar/TableOfContents.module.css @@ -0,0 +1,108 @@ +.title { + @apply m-0 mb-2 border-0 p-0 uppercase; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; + font-family: + Lexend Deca, + sans-serif; +} + +.contents { + @apply pr-3 text-sm; +} + +.link { + @apply relative m-0 max-w-full; +} + +.link a { + @apply scroll-py-6 py-1; +} + +:global(.content) ul.contents { + list-style-type: none; + @apply text-base; +} + +.link::before { + content: ""; + @apply absolute bottom-0 right-0 top-0 w-8; + background: linear-gradient(90deg, transparent, var(--theme-bg, white)); +} + +.link a { + @apply flex overflow-clip whitespace-nowrap; +} + +.link a:hover { + color: var(--theme-text-dark); + text-decoration: underline; +} + +.link.active a { + color: var(--theme-text-accent); +} + +.level1:not(:first-child) a { + @apply pt-6; +} + +.level1 a { + @apply font-bold; + color: var(--theme-text); +} + +.level2 { + @apply pl-3; +} + +.level2:not(:first-of-type) a { + @apply pt-3; +} + +.level2 a { + @apply font-medium; + color: var(--theme-text); +} + +.level3 { + @apply pl-7; +} + +.level3 a { + @apply font-normal; + color: var(--theme-text-light); +} + +.expandDetails { + @apply block min-w-max select-none flex-nowrap overflow-hidden text-ellipsis; +} + +.expandDetails summary { + display: inline-block; + -webkit-tap-highlight-color: transparent; + list-style: none; +} + +.expandDetails summary::-webkit-details-marker /* Safari */, +.expandDetails summary::marker /* Latest Chrome, Edge, Firefox */ { + display: none; +} + +.expandDetails summary span { + background-color: var(--theme-code-inline-bg); + color: var(--theme-code-inline-text); + @apply inline-block cursor-pointer rounded-xl px-5 py-2 text-base uppercase; +} + +.expandDetails[open] summary span { + @apply rounded-b-none; +} + +.expandContent { + background-color: var(--theme-code-inline-bg); + --theme-bg: var(--theme-code-inline-bg); + max-width: 52ch; + @apply rounded-2xl rounded-tl-none px-1 py-3; +} diff --git a/src/components/RightSidebar/TableOfContents.tsx b/src/components/RightSidebar/TableOfContents.tsx new file mode 100644 index 0000000..30370c7 --- /dev/null +++ b/src/components/RightSidebar/TableOfContents.tsx @@ -0,0 +1,119 @@ +import type { MarkdownHeading } from "astro"; +import type { FunctionalComponent } from "preact"; +import { useState, useEffect, useRef } from "preact/hooks"; +import { unescape } from "html-escaper"; +import clsx from "clsx"; + +import { getTextLocalized, translations } from "../../languages"; +import styles from "./TableOfContents.module.css"; + +type ItemOffsets = { + id: string; + topOffset: number; +}; + +const TableOfContents: FunctionalComponent<{ + headings: MarkdownHeading[]; + collapsed?: boolean; + lang: string; +}> = ({ headings = [], collapsed = false, lang }) => { + const toc = useRef(null); + const onThisPageID = "on-this-page-heading"; + const itemOffsets = useRef([]); + const [currentID, setCurrentID] = useState("overview"); + useEffect(() => { + const getItemOffsets = () => { + const titles = document.querySelectorAll("article :is(h1, h2, h3, h4)"); + itemOffsets.current = Array.from(titles).map((title) => ({ + id: title.id, + topOffset: title.getBoundingClientRect().top + window.scrollY, + })); + }; + + getItemOffsets(); + window.addEventListener("resize", getItemOffsets); + + return () => { + window.removeEventListener("resize", getItemOffsets); + }; + }, []); + + useEffect(() => { + if (!toc.current) return; + + const setCurrent: IntersectionObserverCallback = (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + const { id } = entry.target; + if (id === onThisPageID) continue; + setCurrentID(entry.target.id); + break; + } + } + }; + + const observerOptions: IntersectionObserverInit = { + // Negative top margin accounts for `scroll-margin`. + // Negative bottom margin means heading needs to be towards top of viewport to trigger intersection. + rootMargin: "-100px 0% -66%", + threshold: 1, + }; + + const headingsObserver = new IntersectionObserver(setCurrent, observerOptions); + + // Observe all the headings in the main page content. + document.querySelectorAll("article :is(h1,h2,h3)").forEach((h) => headingsObserver.observe(h)); + + // Stop observing when the component is unmounted. + return () => headingsObserver.disconnect(); + }, [toc.current]); + + const onLinkClick: React.MouseEventHandler = (e) => { + setCurrentID(e.currentTarget.getAttribute("href")?.replace("#", "")!); + }; + + if (headings.length === 0) return null; + + const items = ( +
    + {headings + .filter(({ depth }) => depth > 0 && depth < 4) + .map((heading) => { + const linkClass = clsx(styles.link, styles[`level${heading.depth}`], { + [styles.active]: currentID === heading.slug, + }); + + return ( +
  • + + {unescape(heading.text)} + +
  • + ); + })} +
+ ); + + // When component setup as collapsed by default + if (collapsed) { + return ( +
+ + {getTextLocalized(translations.OnThisPage, lang)} + +
{items}
+
+ ); + } + + return ( + <> +

+ {getTextLocalized(translations.OnThisPage, lang)} +

+ {items} + + ); +}; + +export default TableOfContents; diff --git a/src/components/TranslationDisclaimer.astro b/src/components/TranslationDisclaimer.astro new file mode 100644 index 0000000..e34365a --- /dev/null +++ b/src/components/TranslationDisclaimer.astro @@ -0,0 +1,21 @@ +--- +import { getTextLocalized, translations } from "../languages"; + +type Props = { + lang: string; +}; + +const { lang } = Astro.props; +--- + +
+
+ + {getTextLocalized(translations.TranslationDisclaimer.title, lang)} + +
+
+

{getTextLocalized(translations.TranslationDisclaimer.firstLine, lang)}

+

{getTextLocalized(translations.TranslationDisclaimer.secondLine, lang)}

+
+
diff --git a/src/consts.ts b/src/consts.ts new file mode 100644 index 0000000..a98b197 --- /dev/null +++ b/src/consts.ts @@ -0,0 +1,97 @@ +import type { LText } from "./languages"; + +export const SITE = { + title: "effector", + description: "Business logic with ease.", + defaultLanguage: "en", +} as const; + +export const OPEN_GRAPH = { + image: { + src: "/banner.png", + alt: "effector logo is a comet moving away", + }, + twitter: "effectorjs", +}; + +export const KNOWN_LANGUAGES = { + English: "en", + Russian: "ru", + "O'zbekcha": "uz", +} as const; +export const KNOWN_LANGUAGE_CODES = Object.values(KNOWN_LANGUAGES); + +// TODO: update this urls +export const GITHUB_REPO = "effector/effector"; +export const GITHUB_BRANCH = "master"; + +// It is useful when documentation package located in a subdirectory +// There would be 'beta/'. Slash at the end is required +export const GITHUB_DOCS_ROOT = "documentation/"; + +// Used to convert pathname into file path in the repository +// It is where the docs are located related to the docs package.json file +export const GITHUB_DOCS_CONTENT_DIR = "src/content/docs/"; + +// @see https://developer.stackblitz.com/codeflow/integrating-web-publisher +// Format: https://pr.new/github.com/{repo-owner's-username}/{repo}/edit/{branch}/{file-path-in-the-repo} +// export const GITHUB_EDIT_URL = `https://pr.new/github.com/${GITHUB_REPO}/edit/${GITHUB_BRANCH}/`; +// If there will be function, we can add `initialPath` parameter + +export const GITHUB_EDIT_URL = `https://github.com/${GITHUB_REPO}/edit/${GITHUB_BRANCH}/`; +export const GITHUB_COMMITS_URL = `https://github.com/${GITHUB_REPO}/commits/${GITHUB_BRANCH}/`; + +export const LINKS = { + github: "https://github.com/effector/effector", + discord: "https://discord.gg/yHcMcuRWeC", + twitter: `https://twitter.com/${OPEN_GRAPH.twitter}`, + blog: "https://patreon.com/zero_bias", + repl: "https://share.effector.dev", + changelog: "https://changelog.effector.dev", + + community: "https://community.effector.dev/", + telegramRU: "https://t.me/effector_ru", + telegramEN: "https://t.me/effector_en", + devTo: "https://dev.to/effector", + reddit: "https://www.reddit.com/r/effectorjs/", + youtube: "https://youtube.com/@effectorjs", + linesOfCode: "https://t.me/lines_of_code_diagrams", + + zerobias: "https://github.com/zerobias", +}; + +export const COMMUNITY_INVITE_URL = LINKS.discord; + +// See "Algolia" section of the README for more information. +export const ALGOLIA = { + indexName: "effector-beta", + appId: "ARB8LV9Z4L", + apiKey: import.meta.env.ALGOLIA_API_KEY!, +}; + +export const ANNOUNCEMENT: Announcement | null = { + title: { en: "Pay attention", ru: "Обратите внимание", uz: "Etibor bering" }, + text: { + en: "This documentation is for the as yet unreleased version of effector Spacewatch 23.0.", + ru: "Эта версия документации предназначена для еще не вышедшего релиза effector Spacewatch 23.0.", + uz: "Bu hujjat hali chiqmagan effector Spacewatch 23.x versiyasiga tegishli", + }, + button: { + text: { + en: "View actual documentation", + ru: "Посмотреть актуальную документацию", + uz: "Aktual hujjatni ko'rish", + }, + link: "https://effector.dev", + }, +}; + +export interface Announcement { + title: LText; + text: LText; + button?: { + text: LText; + // Slug without language or the absolute URL. + link: string; + }; +} diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..3ff7c1b --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,23 @@ +import { defineCollection, z } from "astro:content"; +import { SITE } from "../consts"; + +const docs = defineCollection({ + schema: z.object({ + title: z.string().default(SITE.title), + description: z.string().default(SITE.description), + lang: z + .union([z.literal("en"), z.literal("ru"), z.literal("uz")]) + .default(SITE.defaultLanguage), + dir: z.union([z.literal("ltr"), z.literal("rtl")]).default("ltr"), + image: z + .object({ + src: z.string(), + alt: z.string(), + }) + .optional(), + ogLocale: z.string().optional(), + redirectFrom: z.array(z.string()).optional(), + }), +}); + +export const collections = { docs }; diff --git a/src/content/docs/en/FAQ.md b/src/content/docs/en/FAQ.md new file mode 100644 index 0000000..e603ff7 --- /dev/null +++ b/src/content/docs/en/FAQ.md @@ -0,0 +1,12 @@ +--- +title: FAQ +description: Frequent questions and answers about effector +redirectFrom: + - /FAQ + - /docs/faq +--- + +## Why do we need to give names to events, effects etc. ? + +This will help in the future, in the development of the effector devtools, and now it is used in the [playground](https://share.effector.dev) on the left sidebar. +If you don't want to do it, you can use the [babel plugin](https://www.npmjs.com/package/@effector/babel-plugin). It will automatically generate the name for events and effects from the variable name. diff --git a/src/content/docs/en/api/effector-react/Gate.md b/src/content/docs/en/api/effector-react/Gate.md new file mode 100644 index 0000000..878e520 --- /dev/null +++ b/src/content/docs/en/api/effector-react/Gate.md @@ -0,0 +1,92 @@ +--- +title: Effector React Gate +redirectFrom: + - /api/effector-react/Gate + - /docs/api/effector-react/Gate +--- + +_Gate_ is a hook for conditional rendering, based on the current value (or values) in props. It can solve problems such as compiling all required data when a component mounts, or showing an alternative component if there is insufficient data in props. Gate is also useful for routing or animations, similar to ReactTransitionGroup. + +This enables the creation of a feedback loop by sending props back to a _Store_. + +Gate can be integrated via the [useGate](/en/api/effector-react/useGate) hook or as a component with props. Gate stores and events function as standard units within an application. + +Gate has two potential states: + +- **Opened**, indicating the component is mounted. +- **Closed**, indicating the component is unmounted. + +
+ +**Example of using Gate as a component:** + +```tsx + +``` + +# Properties (#properties) + +## `.state` Store (#properties-state) + +:::warning{title="Important"} +Do not modify the `state` value! It is a [derived store](/en/api/effector/Store#readonly) and should remain in a predictable state. +::: + +`Store`: [DerivedStore](/en/api/effector/Store#readonly) containing the current state of the gate. This state derives from the second argument of [useGate](/en/api/effector-react/useGate) and from props when rendering the gate as a component. + +### Example (#properties-state-example) + +```tsx +const Gate = createGate(); + +Gate.state.watch((state) => console.info("gate state updated", state)); + +function App() { + useGate(Gate, { props: "yep" }); + return
Example
; +} + +ReactDOM.render(, root); +// => gate state updated { props: "yep" } +``` + +## `.open` Event (#properties-open) + +:::info{title="Important"} +Do not manually invoke this event. It is an event that is triggered based on the gate's state. +::: + +[Event](/en/api/effector/Event): Event fired upon gate mounting. + +## `.close` Event (#properties-close) + +:::info{title=Important} +Do not manually invoke this event. It is an event that is triggered based on the gate's state. +::: + +[Event](/en/api/effector/Event): Event fired upon gate unmounting. + +## `.status` Store (#properties-status) + +:::warning{title="Important"} +Do not modify the `status` value! It is a [derived store](/en/api/effector/Store#readonly) and should remain in a predictable state. +::: + +[Store](/en/api/effector/Store): Boolean [DerivedStore](/en/api/effector/Store#readonly) indicating whether the gate is mounted. + +### Example (#properties-status-example) + +```tsx +const Gate = createGate(); + +Gate.status.watch((opened) => console.info("is Gate opened?", opened)); +// => is Gate opened? false + +function App() { + useGate(Gate); + return
Example
; +} + +ReactDOM.render(, root); +// => is Gate opened? true +``` diff --git a/src/content/docs/en/api/effector-react/Provider.md b/src/content/docs/en/api/effector-react/Provider.md new file mode 100644 index 0000000..288244d --- /dev/null +++ b/src/content/docs/en/api/effector-react/Provider.md @@ -0,0 +1,86 @@ +--- +title: Provider +description: Effector React +redirectFrom: + - /api/effector-react/Provider + - /docs/api/effector-react/Provider +--- + +React `Context.Provider` component, which takes any [Scope](/en/api/effector/Scope) in its `value` prop and makes all hooks in the subtree work with this scope: + +- `useUnit($store)` (and etc.) will read the state and subscribe to updates of the `$store` in this scope +- `useUnit(event)` (and etc.) will [bind](/en/api/effector/scopeBind) provided event or effect to this scope + +# Usage (#usage) + +## Example Usage (#usage-example) + +Here is an example of `` usage. + +```tsx +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; +import { render } from "react-dom"; + +const buttonClicked = createEvent(); +const $count = createStore(0); + +$count.on(buttonClicked, (counter) => counter + 1); + +const App = () => { + const [count, handleClick] = useUnit([$count, buttonClicked]); + + return ( + <> +

Count: {count}

+ + + ); +}; + +const myScope = fork({ + values: [[$count, 42]], +}); + +render( + + + , + document.getElementById("root"), +); +``` + +The `` component is placed in the subtree of ``, so its `useUnit([$count, inc])` call will return + +- State of the `$count` store in the `myScope` +- Version of `buttonClicked` event, which is bound to the `myScope`, which, if called, updates the `$count` state in the `myScope` + +## Multiple Providers Usage (#usage-multiple-providers) + +There can be as many `` instances in the tree, as you may need. + +```tsx +import { fork } from "effector"; +import { Provider } from "effector-react"; +import { App } from "@/app"; + +const scopeA = fork(); +const scopeB = fork(); + +const ParallelWidgets = () => ( + <> + + + + + + + +); +``` + +# Provider Properties (#properties) + +## `value` (#properties-value) + +`Scope`: any [Scope](/en/api/effector/Scope). All hooks in the subtree will work with this scope. diff --git a/src/content/docs/en/api/effector-react/connect.md b/src/content/docs/en/api/effector-react/connect.md new file mode 100644 index 0000000..1b90b0d --- /dev/null +++ b/src/content/docs/en/api/effector-react/connect.md @@ -0,0 +1,52 @@ +--- +title: connect +redirectFrom: + - /api/effector-react/connect + - /docs/api/effector-react/connect +--- + +```ts +import { connect } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +Consider using [hooks api](/en/api/effector-react/index#hooks) in modern projects. +::: + +Wrapper for [useStore](/en/api/effector-react/useStore) to use during migration from redux and class-based projects. Will merge store value fields to component props. + +# Methods (#methods) + +## `connect($store)(Component)` (#methods-connect-store-component) + +### Formulae (#methods-connect-store-component-formulae) + +```ts +connect($store: Store)(Component): Component +``` + +### Arguments (#methods-connect-store-component-arguments) + +1. `$store` ([Store](/en/api/effector/Store)): store or object with stores + +### Returns (#methods-connect-store-component-returns) + +`(Component) => Component`: Function, which accepts react component and return component with store fields merged into props + +## `connect(Component)($store)` (#methods-connect-component-store) + +### Formulae (#methods-connect-component-store-formulae) + +```ts +connect(Component)($store: Store): Component +``` + +### Arguments (#methods-connect-component-store-arguments) + +1. `Component` (React.ComponentType): react component + +### Returns (#methods-connect-component-store-returns) + +`($store: Store) => Component`: Function, which accepts a store and returns component with store fields merged into props diff --git a/src/content/docs/en/api/effector-react/createComponent.md b/src/content/docs/en/api/effector-react/createComponent.md new file mode 100644 index 0000000..104b4f2 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createComponent.md @@ -0,0 +1,57 @@ +--- +title: createComponent +description: Creates a store-based React component +redirectFrom: + - /api/effector-react/createComponent + - /docs/api/effector-react/createComponent +--- + +```ts +import { createComponent } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +You can use [hooks api](/en/api/effector-react/index#hooks) in `createComponent` since [effector-react@20.3.0](https://changelog.effector.dev/#effector-20-3-0). +::: + +# Methods (#methods) + +## `createComponent($store, render)` (#createComponent-store-render) + +Creates a store-based React component. The `createComponent` method is useful for transferring logic and data of state to your View component. + +### Arguments (#createComponent-store-render-arguments) + +1. `$store` (_Store | Object_): `Store` or object of `Store` +2. `render` (_Function_): Render function which will be called with props and state + +### Returns (#createComponent-store-render-returns) + +(_`React.Component`_): Returns a React component. + +### Example (#createComponent-store-render-example) + +```jsx +import { createStore, createEvent } from "effector"; +import { createComponent } from "effector-react"; + +const increment = createEvent(); + +const $counter = createStore(0).on(increment, (n) => n + 1); + +const MyCounter = createComponent($counter, (props, state) => ( +
+ Counter: {state} + +
+)); + +const MyOwnComponent = () => { + // any stuff here + return ; +}; +``` + +[Try it](https://share.effector.dev/kJoLGB6g) diff --git a/src/content/docs/en/api/effector-react/createGate.md b/src/content/docs/en/api/effector-react/createGate.md new file mode 100644 index 0000000..9366d25 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createGate.md @@ -0,0 +1,84 @@ +--- +title: createGate +description: Creates a gate to consume data from view +redirectFrom: + - /api/effector-react/createGate + - /docs/api/effector-react/createGate +--- + +```ts +import { createGate, type Gate } from "effector-react"; +``` + +# Methods (#methods) + +## `createGate(name?)` (#methods-createGate-name) + +Creates a [_Gate_](/en/api/effector-react/Gate) + +### Formulae (#methods-createGate-name-formulae) + +```ts +createGate(name?: string): Gate +``` + +### Arguments (#methods-createGate-name-arguments) + +1. `name?` (_string_): Optional name which will be used as the name of a created React component + +### Returns (#methods-createGate-name-returns) + +[`Gate`](/en/api/effector-react/Gate) + +### Examples (#methods-createGate-name-examples) + +#### Basic Usage (#methods-createGate-name-examples-basic) + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createGate } from "effector-react"; + +const Gate = createGate("gate with props"); + +const App = () => ( +
+ +
+); + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state {} + +ReactDOM.render(, document.getElementById("root")); +// => current state {foo: 'bar'} + +ReactDOM.unmountComponentAtNode(document.getElementById("root")); +// => current state {} +``` + +[Try it](https://share.effector.dev/mMZSQclh) + +## `createGate(config?)` (#methods-createGate-config) + +Creates a [_Gate_](/en/api/effector-react/Gate), if `defaultState` is defined, [Gate.state](/en/api/effector-react/Gate#properties-state) will be created with passed value. + +### Formulae (#methods-createGate-config-formulae) + +```ts +createGate({ defaultState?: T, domain?: Domain, name?: string }): Gate +``` + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-react/Gate#properties-state) +- `domain?` ([_Domain_](/en/api/effector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-react/Gate#properties-open) event, [Gate.state](/en/api/effector-react/Gate#properties-state) store, and so on) +- `name?` (_string_): Optional name which will be used as the name of a created React component + +### Returns (#methods-createGate-config-returns) + +[`Gate`](/en/api/effector-react/Gate) diff --git a/src/content/docs/en/api/effector-react/createStoreConsumer.md b/src/content/docs/en/api/effector-react/createStoreConsumer.md new file mode 100644 index 0000000..ba9e102 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createStoreConsumer.md @@ -0,0 +1,46 @@ +--- +title: createStoreConsumer +description: Creates store-based component with render-props +redirectFrom: + - /api/effector-react/createStoreConsumer + - /docs/api/effector-react/createStoreConsumer +--- + +```ts +import { createStoreConsumer } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +Consider using [hooks api](/en/api/effector-react/index#hooks) in modern projects. +::: + +# Methods (#methods) + +## `createStoreConsumer($store)` (#methods-createStoreConsumer-store) + +Creates a store-based React component which is watching for changes in the store. Based on _Render Props_ technique. + +### Arguments (#methods-createStoreConsumer-store-arguments) + +1. `$store` ([`Store`](/en/api/effector/Store)) + +### Returns (#methods-createStoreConsumer-store-returns) + +(`React.Component`) + +### Examples (#methods-createStoreConsumer-store-examples) + +```jsx +import { createStore } from "effector"; +import { createStoreConsumer } from "effector-react"; + +const $firstName = createStore("Alan"); + +const FirstName = createStoreConsumer($firstName); + +const App = () => {(name) =>

{name}

}
; +``` + +[Try it](https://share.effector.dev/HbH1tpzQ) diff --git a/src/content/docs/en/api/effector-react/index.md b/src/content/docs/en/api/effector-react/index.md new file mode 100644 index 0000000..21f4cc8 --- /dev/null +++ b/src/content/docs/en/api/effector-react/index.md @@ -0,0 +1,39 @@ +--- +title: effector-react +redirectFrom: + - /api/effector-react + - /docs/api/effector-react +--- + +Effector bindings for ReactJS. + +# Hooks (#hooks) + +- [useUnit(units)](/en/api/effector-react/useUnit) +- [useList(store, renderItem)](/en/api/effector-react/useList) +- [useStoreMap({ store, keys, fn })](/en/api/effector-react/useStoreMap) +- [useStore(store)](/en/api/effector-react/useStore) +- [useEvent(unit)](/en/api/effector-react/useEvent) + +# Components (#components) + +- [Provider](/en/api/effector-react/Provider) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-react/Gate) +- [createGate()](/en/api/effector-react/createGate) +- [useGate(GateComponent, props)](/en/api/effector-react/useGate) + +# Higher Order Components API (#higher-order-components-api) + +- [createComponent(store, render)](/en/api/effector-react/createComponent) +- [createStoreConsumer(store)](/en/api/effector-react/createStoreConsumer) renders props style +- [connect(store)(Component)](/en/api/effector-react/connect) "connect" style + +# Import map (#import-map) + +Package `effector-react` provides couple different entry points for different purposes: + +- [effector-react/compat](/en/api/effector-react/module/сompat) +- [effector-react/scope](/en/api/effector-react/module/scope) diff --git a/src/content/docs/en/api/effector-react/module/scope.md b/src/content/docs/en/api/effector-react/module/scope.md new file mode 100644 index 0000000..5805f84 --- /dev/null +++ b/src/content/docs/en/api/effector-react/module/scope.md @@ -0,0 +1,103 @@ +--- +title: effector-react/scope +description: Deprecated separate module of effector-react that enforces library to use Scope +--- + +```ts +import {} from "effector-react/scope"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using main module of `effector-react` instead. +::: + +Provides all exports from [effector-react](/en/api/effector-react), but enforces application to use [Scope](/en/api/effector/scope) for all components. + +## Usage (#usage) + +You can use this module in the same way as [effector-react](/en/api/effector-react), but it will require passing [Scope](/en/api/effector/scope) to [Provider](/en/api/effector-react/Provider) component. + +```jsx +// main.js +import { fork } from "effector"; +import { Provider } from "effector-react/scope"; + +import React from "react"; +import ReactDOM from "react-dom/client"; + +const scope = fork(); +const root = ReactDOM.createRoot(document.getElementById("root")); + +root.render( + + + , +); +``` + +## Migration (#migration) + +Since `effector-react/scope` is deprecated, it is better to migrate to [effector-react](/en/api/effector-react) by removing `scope` from import path. + +```diff ++ import { Provider } from "effector-react"; +- import { Provider } from "effector-react/scope"; +``` + +:::warning{title="Continues migration"} +`effector-react` and `effector-react/scope` do not share any code, so you have to migrate all your code to `effector-react` in the same time, because otherwise you will get runtime errors. These errors will be thrown because `effector-react` and `effector-react/scope` will use different instances `Provider` and do not have access to each other's `Provider`. +::: + +If you use [Babel](https://babeljs.io/), you need to remove parameter [`reactSsr`](/en/api/effector/babel-plugin#reactssr) from `babel-plugin` configuration. + +```diff +{ + "plugins": [ + [ + "effector/babel-plugin", + { +- "reactSsr": true + } + ] + ] +} +``` + +If you use [SWC](/en/api/effector/swc-plugin), you need to remove [`bindings.react.scopeReplace`](https://github.com/effector/swc-plugin#bindings) parameter from `@effector/swc-plugin` configuration. + +```diff +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "experimental": { + "plugins": [ + "@effector/swc-plugin", + { + "bindings": { + "react": { +- "scopeReplace": true + } + } + } + ] + } + } +} +``` + +## Scope Enforcement (#scope-enforcement) + +All modern hooks of `effector-react` are designed to work with [Scope](/en/api/effector/scope). If you want to imitate the behavior of `effector-react/scope` module, you can use the second parameter of hooks with an option `forceScope: true`. In this case, the hook will throw an error if the [Scope](/en/api/effector/scope) is not passed to [Provider](/en/api/effector-react/Provider). + +```diff +- import { useUnit } from 'effector-react/scope' ++ import { useUnit } from 'effector-react' + + +function Example() { +- const { text } = useUnit({ text: $text }) ++ const { text } = useUnit({ text: $text }, { forceScope: true }) + + return

{text}

+} +``` diff --git "a/src/content/docs/en/api/effector-react/module/\321\201ompat.md" "b/src/content/docs/en/api/effector-react/module/\321\201ompat.md" new file mode 100644 index 0000000..c0f39ff --- /dev/null +++ "b/src/content/docs/en/api/effector-react/module/\321\201ompat.md" @@ -0,0 +1,94 @@ +--- +title: effector-react/compat +description: Separate module of effector-react with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices) +--- + +```ts +import {} from "effector-react/compat"; +``` + +The library provides a separate module with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices). + +:::warning{title="Bundler, Not Transpiler"} +Since third-party libraries can import `effector-react` directly, you **should not** use transpilers like Babel to replace `effector-react` with `effector-react/compat` in your code because by default, Babel will not transform third-party code. + +**Use a bundler instead**, as it will replace `effector-react` with `effector-react/compat` in all modules, including those from third parties. + +::: + +Since `effector-react` uses `effector` under the hood, you need to use the compat-version of `effector` as well. Please, read [`effector/compat`](/en/api/effector/module/compat) for details. + +## Required Polyfills (#required-polyfills) + +You need to install polyfills for these objects: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` +- `Map` +- `Set` + +In most cases, a bundler can automatically add polyfills. + +### Vite (#required-polyfills-vite) + +
+Vite Configuration Example + +```js +import { defineConfig } from "vite"; +import legacy from "@vitejs/plugin-legacy"; + +export default defineConfig({ + plugins: [ + legacy({ + polyfills: ["es.promise", "es.object.assign", "es.array.flat", "es.map", "es.set"], + }), + ], +}); +``` + +
+ +# Usage (#usage) + +## Manual Usage (#usage-manual) + +You can use it instead of the `effector-react` package if you need to support old browsers. + +```diff +- import {useUnit} from 'effector-react' ++ import {useUnit} from 'effector-react/compat' +``` + +## Automatic Replacement (#usage-automatic-replacement) + +However, you can set up your bundler to automatically replace `effector` with `effector/compat` in your code. + +### Webpack (#usage-automatic-replacement-webpack) + +```js +module.exports = { + resolve: { + alias: { + effector: "effector/compat", + "effector-react": "effector-react/compat", + }, + }, +}; +``` + +### Vite (#usage-automatic-replacement-vite) + +```js +import { defineConfig } from "vite"; + +export default defineConfig({ + resolve: { + alias: { + effector: "effector/compat", + "effector-react": "effector-react/compat", + }, + }, +}); +``` diff --git a/src/content/docs/en/api/effector-react/useEvent.md b/src/content/docs/en/api/effector-react/useEvent.md new file mode 100644 index 0000000..007bc21 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useEvent.md @@ -0,0 +1,128 @@ +--- +title: useEvent +redirectFrom: + - /api/effector-react/useEvent + - /docs/api/effector-react/useEvent +--- + +```ts +import { useEvent } from "effector-react"; +``` + +:::info{title="since"} +`useEvent` introduced in [effector-react 20.9.0](https://changelog.effector.dev/#effector-20-9-0) +::: + +:::warning{title="This is API is deprecated"} + +Prefer [`useUnit`](/api/effector-react/useUnit) hook instead. +::: + +Bind event to current [_scope_](/en/api/effector/Scope) to use in dom event handlers.
+Only `effector-react/scope` version works this way, `useEvent` of `effector-react` is a no-op and does not require `Provider` with scope. + +:::info{title="Note"} +Useful only if you have server-side rendering or writing tests for React-components. +::: + +# Methods (#methods) + +## `useEvent(unit)` (#methods-useEvent-unit) + +### Arguments (#methods-useEvent-unit-arguments) + +1. `unit` ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Event or effect which will be bound to current `scope` + +### Returns (#methods-useEvent-unit-returns) + +(Function): Function to pass to event handlers. Will trigger a given unit in the current scope. + +### Examples (#methods-useEvent-unit-examples) + +#### Basic Usage (#methods-useEvent-unit-examples-basic) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (counter) => counter + 1); + +const App = () => { + const count = useStore($count); + const handleIncrement = useEvent(incremented); + + return ( + <> +

Count: {count}

+ + + ); +}; + +const scope = fork(); + +ReactDOM.render( + + + , + document.getElementById("root"), +); +``` + +[Try it](https://share.effector.dev/GyiJvLdo) + +## `useEvent(shape)` (#methods-useEvent-shape) + +### Arguments (#methods-useEvent-shape-arguments) + +1. `shape` Object or array of ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Events or effects as values which will be bound to the current `scope` + +### Returns (#methods-useEvent-shape-returns) + +(Object or Array): List of functions with the same names or keys as an argument to pass to event handlers. Will trigger a given unit in the current scope. + +### Examples (#methods-useEvent-shape-examples) + +#### Object Usage (#methods-useEvent-shape-examples-object) + +```jsx +import ReactDOM from "react-dom"; +import { createStore, createEvent, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0); + +$count.on(incremented, (counter) => counter + 1); +$count.on(decremented, (counter) => counter - 1); + +const App = () => { + const counter = useStore($count); + const handler = useEvent({ incremented, decremented }); + // or + const [handleIncrement, handleDecrement] = useEvent([incremented, decremented]); + + return ( + <> +

Count: {counter}

+ + + + ); +}; + +const scope = fork(); + +ReactDOM.render( + + + , + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-react/useGate.md b/src/content/docs/en/api/effector-react/useGate.md new file mode 100644 index 0000000..e7ae202 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useGate.md @@ -0,0 +1,57 @@ +--- +title: useGate +description: Hook for passing data to Gate +redirectFrom: + - /api/effector-react/useGate + - /docs/api/effector-react/useGate +--- + +```ts +import { useGate } from "effector-react"; +``` + +# Methods (#methods) + +## `useGate(Gate, props?)` (#methods-useGate-Gate-props) + +Hook for passing data to [_Gate_](/en/api/effector-react/Gate). + +### Formulae (#methods-useGate-Gate-props-formulae) + +```ts +const CustomGate: Gate; + +useGate(CustomGate, props?: T): void; +``` + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate` ([`Gate`](/en/api/effector-react/Gate)) +2. `props` (`T`) + +### Returns (#methods-useGate-Gate-props-returns) + +(`void`) + +### Examples (#methods-useGate-Gate-props-examples) + +#### Basic (#methods-useGate-Gate-props-examples-basic) + +```js +import { createGate, useGate } from "effector-react"; +import { Route } from "react-router"; + +const PageGate = createGate("page"); + +PageGate.state.watch(({ match }) => { + console.log(match); +}); + +const Home = (props) => { + useGate(PageGate, props); + + return
Home
; +}; + +const App = () => ; +``` diff --git a/src/content/docs/en/api/effector-react/useList.md b/src/content/docs/en/api/effector-react/useList.md new file mode 100644 index 0000000..e68fe6f --- /dev/null +++ b/src/content/docs/en/api/effector-react/useList.md @@ -0,0 +1,225 @@ +--- +title: useList +redirectFrom: + - /api/effector-react/useList + - /docs/api/effector-react/useList +--- + +```ts +import { useList } from "effector-react"; +``` + +:::info{title="since"} +`useList` introduced in [effector-react 20.1.1](https://changelog.effector.dev/#effector-react-20-1-1) +::: + +Hook function for efficient rendering of list store. +Every item will be memoized and updated only when their data change. + +# Methods (#methods) + +## `useList($store, fn)` (#methods-useList-store-fn) + +Using `index` as `key` for each element in the list. + +### Formulae (#methods-useList-store-fn-formulae) + +```ts +useList( + $store: Store, + fn: (value: T, index: number) => React.ReactNode, +): React.ReactNode; +``` + +### Arguments (#methods-useList-store-fn-arguments) + +1. `$store` ([`Store`](/en/api/effector/Store)): Store with an array of items +2. `fn` (_Function_): Render function which will be called for every item in list + +### Returns (#methods-useList-store-fn-returns) + +(`React.Node`) + +### Examples (#methods-useList-store-fn-examples) + +#### Basic (#methods-useList-store-fn-examples-basic) + +```jsx +import { createStore } from "effector"; +import { useList } from "effector-react"; + +const $users = createStore([ + { id: 1, name: "Yung" }, + { id: 2, name: "Lean" }, + { id: 3, name: "Kyoto" }, + { id: 4, name: "Sesh" }, +]); + +const App = () => { + // we don't need keys here any more + const list = useList($users, ({ name }, index) => ( +
  • + [{index}] {name} +
  • + )); + + return
      {list}
    ; +}; +``` + +[Try it](https://share.effector.dev/dV9dmuz3) + +#### With store updates (#methods-useList-store-fn-examples-with-store-updates) + +```jsx +import { createStore, createEvent } from "effector"; +import { useList, useUnit } from "effector-react"; + +const todoSubmitted = createEvent(); +const todoToggled = createEvent(); + +const $todoList = createStore([ + { text: "write useList example", done: true }, + { text: "update readme", done: false }, +]); + +$todoList.on(todoToggled, (list, id) => + list.map((todo, index) => { + if (index === id) + return { + ...todo, + done: !todo.done, + }; + return todo; + }), +); + +$todoList.on(todoSubmitted, (list, text) => [...list, { text, done: false }]); + +todoSubmitted.watch((e) => { + e.preventDefault(); +}); + +const TodoList = () => { + const [onTodoToggle] = useUnit([todoToggled]); + return useList($todoList, ({ text, done }, index) => { + const todo = done ? ( + + {text} + + ) : ( + {text} + ); + + return
  • onTodoToggle(index)}>{todo}
  • ; + }); +}; + +const App = () => { + const [onTodoSubmit] = useUnit([todoSubmitted]); + + function handleSubmit(e) { + e.preventDefault(); + onTodoSubmit(e.currentTarget.elements.content.value); + } + + return ( +
    +

    todo list

    +
    + + + +
    +
      + +
    +
    + ); +}; +``` + +[Try it](https://share.effector.dev/dUay9F3U) + +## `useList($store, config)` (#methods-useList-store-config) + +Used when you need to pass dependencies to react (to update items when some of its dependencies are changed). + +By default, `useList` rerenders only when some of its items were changed. +However, sometimes we need to update items when some external value (e.g. props field or state of another store) changes. +In such case, we need to tell React about our dependencies and pass keys explicitly. + +### Formulae (#methods-useList-store-config-formulae) + +```ts +useList( + $store: Store, + config: { + keys: any[], + getKey?: (value: T) => React.Key, + fn: (value: T, index: number) => React.ReactNode, + placeholder?: React.ReactNode, + } +): React.ReactNode; +``` + +### Arguments (#methods-useList-store-config-arguments) + +1. `$store` ([`Store`](/en/api/effector/Store)): Store with an array of items +2. `config` (`Object`) + - `keys` (`Array`): Array of dependencies, which will be passed to react by `useList` + - `fn` (`(value: T) => React.ReactNode`): Render function which will be called for every item in list + - `getKey` (`(value) => React.Key`): Optional function to compute key for every item of list + - `placeholder` (`React.ReactNode`): Optional react node to render instead of an empty list + +:::info{title="since"} +`getKey` option introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +:::info{title="since"} +`placeholder` option introduced in [effector-react@22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +### Returns (#methods-useList-store-config-returns) + +(`React.Node`) + +### Examples (#methods-useList-store-config-examples) + +#### Basic (#methods-useList-store-config-examples-config) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, restore } from "effector"; +import { useUnit, useList } from "effector-react"; + +const renameUser = createEvent(); + +const $user = createStore("alice"); +const $friends = createStore(["bob"]); + +$user.on(renameUser, (_, name) => name); + +const App = () => { + const user = useUnit($user); + + return useList($friends, { + keys: [user], + fn: (friend) => ( +
    + {friend} is a friend of {user} +
    + ), + }); +}; + +ReactDOM.render(, document.getElementById("root")); +// =>
    bob is a friend of alice
    + +setTimeout(() => { + renameUser("carol"); + // =>
    bob is a friend of carol
    +}, 500); +``` + +[Try it](https://share.effector.dev/ijRS5TYh) diff --git a/src/content/docs/en/api/effector-react/useProvidedScope.md b/src/content/docs/en/api/effector-react/useProvidedScope.md new file mode 100644 index 0000000..34397af --- /dev/null +++ b/src/content/docs/en/api/effector-react/useProvidedScope.md @@ -0,0 +1,47 @@ +--- +title: useProvidedScope +description: Effector React +redirectFrom: + - /api/effector-react/useProvidedScope + - /docs/api/effector-react/useProvidedScope +--- + +```ts +import { useProvidedScope } from "effector-react"; +``` + +Low-level React Hook, which returns current [Scope](/api/effector/Scope) from [Provider](/api/effector-react/Provider). + +:::warning{title="This is a Low-Level API"} +The `useProvidedScope` hook is a low-level API for library developers and **is not intended to be used in production code** directly. + +For production `effector-react` usage, see the [`useUnit`](/api/effector-react/useUnit) hook. +::: + +# Methods (#methods) + +## `useProvidedScope()` (#methods-useProvidedScope) + +### Formulae (#methods-useProvidedScope-formulae) + +```ts +useProvidedScope(): Scope | null +``` + +### Returns (#methods-useProvidedScope-returns) + +([`Scope | null`](/api/effector/Scope)) — if no Scope provided, returns `null`. + +### Examples (#methods-useProvidedScope-examples) + +This hook can be used in library internals to handle various edge-cases, where `createWatch` and `scopeBind` APIs are also needed. + +For production code usage, see the [`useUnit`](/api/effector-react/useUnit) hook instead. + +```tsx +const useCustomLibraryInternals = () => { + const scope = useProvidedScope(); + + // ... +}; +``` diff --git a/src/content/docs/en/api/effector-react/useStore.md b/src/content/docs/en/api/effector-react/useStore.md new file mode 100644 index 0000000..29d4907 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useStore.md @@ -0,0 +1,64 @@ +--- +title: useStore +redirectFrom: + - /api/effector-react/useStore + - /docs/api/effector-react/useStore +--- + +```ts +import { useStore } from "effector-react"; +``` + +React hook, which subscribes to a [store](/en/api/effector/Store) and returns its current value, so when the store is updated, the component will update automatically. + +:::warning{title="This is API is deprecated"} + +Prefer [`useUnit`](/api/effector-react/useUnit) hook instead. +::: + +# Methods (#methods) + +## `useStore($store): State` (#methods-useStore-store) + +### Formulae (#methods-useStore-store-formulae) + +```ts +useStore($store: Store): State +``` + +### Arguments (#methods-useStore-store-arguments) + +1. `$store`: [Store](/en/api/effector/Store) + +### Returns (#methods-useStore-store-returns) + +(_`State`_): The value from the store + +### Examples (#methods-useStore-store-examples) + +```jsx +import { createStore } from "effector"; +import { useStore, useEvent } from "effector-react"; + +const $counter = createStore(0); + +const { incrementClicked, decrementClicked } = createApi($counter, { + incrementClicked: (state) => state + 1, + decrementClicked: (state) => state - 1, +}); + +const App = () => { + const counter = useStore($counter); + const [onIncrement, onDecrement] = useEvent([incrementClicked, decrementClicked]); + + return ( +
    + {counter} + + +
    + ); +}; +``` + +[Try it](https://share.effector.dev/DHzp3z4r) diff --git a/src/content/docs/en/api/effector-react/useStoreMap.md b/src/content/docs/en/api/effector-react/useStoreMap.md new file mode 100644 index 0000000..f924147 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useStoreMap.md @@ -0,0 +1,140 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-react/useStoreMap + - /docs/api/effector-react/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-react"; +``` + +:::info{title="since"} +`useStoreMap` introduced in [effector-react 19.1.2](https://changelog.effector.dev/#effector-react-19-1-2) +::: + +React hook, which subscribes to a [store](/en/api/effector/Store) and transforms its value with a given function. The component will update only when the selector function result will change. + +You can read the motivation in the [issue](https://github.com/effector/effector/issues/118). + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +:::info{title="since"} +Short version of `useStoreMap` introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +Common use case: subscribe to changes in selected part of store only + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store, + fn: (state: State) => Result, +): Result +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store`](/en/api/effector/Store) +2. `fn` (`(state: State) => Result`): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`Result`): Value from the `fn` function call. + +### Examples (#methods-useStoreMap-store-fn-examples) + +TBD + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +Overload used when you need to pass dependencies to react (to update items when some of its dependencies are changed) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store, + keys: any[], + fn: (state: State, keys: any[]) => Result, + updateFilter?: (newResult: Result, oldResult: Result) => boolean, + defaultValue?: Result, +}): Result; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `config` (_Object_): Configuration object + - `store`: Source [`Store`](/en/api/effector/Store) + - `keys` (_Array_): This argument will be passed to React.useMemo to avoid unnecessary updates + - `fn` (`(state: State, keys: any[]) => Result`): Selector function to receive part of source store + - `updateFilter` (`(newResult, oldResult) => boolean`): _Optional_ function used to compare old and new updates to prevent unnecessary rerenders. Uses [createStore updateFilter](/en/api/effector/createStore) option under the hood + - `defaultValue`: Optional default value, used whenever `fn` returns undefined + +:::info{title="since"} +`updateFilter` option introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +:::info{title="since"} +`defaultValue` option introduced in [effector-react@22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +### Returns (#methods-useStoreMap-config-returns) + +(`Result`): Value from the `fn` function call, or the `defaultValue`. + +### Examples (#methods-useStoreMap-config-examples) + +#### Basic (#methods-useStoreMap-config-examples-basic) + +This hook is useful for working with lists, especially with large ones + +```jsx +import { createStore } from "effector"; +import { useList, useStoreMap } from "effector-react"; + +const usersRaw = [ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]; + +const $users = createStore(usersRaw); +const $ids = createStore(usersRaw.map(({ id }) => id)); + +const User = ({ id }) => { + const user = useStoreMap({ + store: $users, + keys: [id], + fn: (users, [userId]) => users.find(({ id }) => id === userId) ?? null, + }); + + return ( +
    + [{user.id}] {user.name} +
    + ); +}; + +const UserList = () => { + return useList($ids, (id) => ); +}; +``` + +[Try it](https://share.effector.dev/cAZWHCit) diff --git a/src/content/docs/en/api/effector-react/useUnit.md b/src/content/docs/en/api/effector-react/useUnit.md new file mode 100644 index 0000000..2445dc1 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useUnit.md @@ -0,0 +1,192 @@ +--- +title: useUnit +description: Effector React +redirectFrom: + - /api/effector-react/useUnit + - /docs/api/effector-react/useUnit +--- + +```ts +import { useUnit } from "effector-react"; +``` + +:::info{title="since"} +`useUnit` introduced in [effector-react 22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +React hook, which takes any unit or shape of units. + +In the case of [stores](/en/api/effector/Store), it subscribes the component to the provided [store](/en/api/effector/Store) and returns its current value, so when the store updates, the component will update automatically. + +In the case of [events](/en/api/effector/Event)/[effects](/en/api/effector/Effect) – it binds to the current [_scope_](/en/api/effector/Scope) to use in DOM event handlers. +Only the `effector-react/scope` version works this way; the `useUnit` of `effector-react` is no-op for events and does not require a `Provider` with scope. + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +Creates function that calls original unit but bounded to [`Scope`](/en/api/effector/Scope) if provided. + +### Formulae (#methods-useUnit-unit-formulae) + +```ts +useUnit(event: EventCallable): (payload: T) => T; +useUnit(effect: Effect): (payload: Params) => Promise; +``` + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([`EventCallable`](/en/api/effector/Event#eventCallable) or [`Effect`](/en/api/effector/Effect)): Event or effect which will be bound to the current `scope`. + +### Returns (#methods-useUnit-unit-returns) + +(Function): Function to pass to event handlers. Will trigger the given unit in the current scope. + +### Examples (#methods-useUnit-unit-examples) + +#### Basic (#methods-useUnit-unit-examples-basic) + +```jsx +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; +import { render } from "react-dom"; + +const incrementClicked = createEvent(); +const $count = createStore(0); + +$count.on(incrementClicked, (count) => count + 1); + +const App = () => { + const [count, onIncrement] = useUnit([$count, incrementClicked]); + + return ( + <> +

    Count: {count}

    + + + ); +}; + +const scope = fork(); + +render( + () => ( + + + + ), + document.getElementById("root"), +); +``` + +## `useUnit($store)` (#methods-useUnit-store) + +Reads value from the `$store` and rerenders component when `$store` updates in [`Scope`](/en/api/effector/Scope) if provided. + +### Formulae (#methods-useUnit-store-formulae) + +```ts +useUnit($store: Store): T; +``` + +### Arguments (#methods-useUnit-store-arguments) + +1. `$store`: effector ([_Store_](/en/api/effector/Store)) + +### Returns (#methods-useUnit-store-returns) + +Current value of the store. + +### Examples (#methods-useUnit-store-examples) + +#### Basic (#methods-useUnit-store-examples-basic) + +```js +import { createStore, createApi } from "effector"; +import { useUnit } from "effector-react"; + +const $counter = createStore(0); + +const { incrementClicked, decrementClicked } = createApi($counter, { + incrementClicked: (count) => count + 1, + decrementClicked: (count) => count - 1, +}); + +const App = () => { + const counter = useUnit($counter); + const [onIncrement, onDecrement] = useUnit([incrementClicked, decrementClicked]); + + return ( +
    + {counter} + + +
    + ); +}; +``` + +## `useUnit(shape)` (#methods-useUnit-shape) + +### Formulae (#methods-useUnit-shape-formulae) + +```ts +useUnit({ a: Store, b: Event, ... }): { a: A, b: (payload: B) => B; ... } + +useUnit([Store, Event, ... ]): [A, (payload: B) => B, ... ] +``` + +### Arguments (#methods-useUnit-shape-arguments) + +1. `shape`: Object or array of ([`EventCallable`](/en/api/effector/Event#eventCallable), [`Effect`](/en/api/effector/Effect), or [`Store`](/en/api/effector/Store)) + +### Returns (#methods-useUnit-shape-returns) + +(`Object` or `Array`): + +- If passed `EventCallable` or `Effect`: Functions with the same names or keys as the argument to pass to event handlers. Will trigger the given unit in the current scope.
    + _Note: events or effects will be bound to `Scope` **only** if component wrapped into [`Provider`](/en/api/effector-react/Provider)._ +- If passed `Store`: The current value of the store. + +### Examples (#methods-useUnit-shape-examples) + +#### Basic (#methods-useUnit-shape-examples-basic) + +```jsx +import { createStore, createEvent, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +$count.on(decremented, (count) => count - 1); + +const App = () => { + const count = useUnit($count); + const on = useUnit({ incremented, decremented }); + // or + const [a, b] = useUnit([incremented, decremented]); + + return ( + <> +

    Count: {count}

    + + + + ); +}; + +const scope = fork(); + +render( + () => ( + + + + ), + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-solid/Gate.md b/src/content/docs/en/api/effector-solid/Gate.md new file mode 100644 index 0000000..50f4f02 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/Gate.md @@ -0,0 +1,55 @@ +--- +title: Effector Solid Gate +description: Effector Solid +redirectFrom: + - /api/effector-solid/Gate + - /docs/api/effector-solid/gate +--- + +_Gate_ is a hook for conditional rendering, based on current value (or values) in props. +An example of a problem that Gate can solve – you can put together all required data when component was mounted, or show another component if there is not enough data in props. +Gate also looks good for Routing or animation. + +This allows you to send props back to _Store_ to create a feedback loop. + +Gate can be used via the [useGate](/en/api/effector-solid/useGate) hook or as a component with props (``). +Gate stores and events can be used in the application as regular units. + +Gate can have two states: + +- **Open**, which means mounted +- **Closed**, which means unmounted + +# Properties (#properties) + +## `.state` Store (#properties-state) + +:::warning{title="Important"} +Do not modify the `state` value! It is a [derived store](/en/api/effector/Store#readonly) and should be kept in a predictable state. +::: + +`Store`: [Derived Store](/en/api/effector/Store#readonly) with the current state of the given gate. The state comes from the second argument of [useGate](/en/api/effector-solid/useGate) and from props when rendering the gate as a component. + +## `.open` Event (#properties-open) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate's state. +::: + +[Event](/en/api/effector/Event): Event which will be called during the gate's mounting. + +## `.close` Event (#properties-close) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate's state. +::: + +[Event](/en/api/effector/Event): Event which will be called during the gate's unmounting. + +## `.status` Store (#properties-status) + +:::warning{title="Important"} +Do not modify the `status` value! It is a [derived store](/en/api/effector/Store#readonly) and should be in a predictable state. +::: + +`Store`: Boolean [Derived Store](/en/api/effector/Store#readonly), which shows if the given gate is mounted. diff --git a/src/content/docs/en/api/effector-solid/createGate.md b/src/content/docs/en/api/effector-solid/createGate.md new file mode 100644 index 0000000..676faa9 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/createGate.md @@ -0,0 +1,77 @@ +--- +title: createGate +description: Creates a gate to consume data from view +redirectFrom: + - /api/effector-solid/createGate + - /docs/api/effector-solid/createGate +--- + +# Methods (#methods) + +## `createGate(config)` (#methods-createGate-config) + +### Formulae (#methods-createGate-config-formulae) + +```ts +createGate(config): Gate +``` + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-solid/Gate#state) +- `domain?` ([_Domain_]/apieffector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-solid/Gate#open) event, [Gate.state](/en/api/effector-solid/Gate#state) store and so on) +- `name?` (_string_): Optional name which will be used as name of a created Solid component + +### Returns (#methods-createGate-config-returns) + +[_Gate_](/en/api/effector-solid/Gate) + +### Examples (#methods-createGate-config-examples) + +TBD + +## `createGate(name?)` (#methods-createGate-name) + +### Formulae (#methods-createGate-name-formulae) + +```ts +createGate(name): Gate +``` + +### Arguments (#methods-createGate-name-arguments) + +1. `name?` (_string_): Optional name which will be used as name of a created Solid component + +### Returns (#methods-createGate-name-returns) + +[_Gate_](/en/api/effector-solid/Gate) + +### Examples (#methods-createGate-name-examples) + +#### Basic usage (#methods-createGate-name-examples-basic) + +```js +import { createGate } from "effector-solid"; +import { render } from "solid-js/web"; + +const Gate = createGate("gate with props"); + +const App = () => ( +
    + +
    +); + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state {} + +const unmount = render(() => , document.getElementById("root")); +// => current state {foo: 'bar'} + +unmount(); +// => current state {} +``` diff --git a/src/content/docs/en/api/effector-solid/index.md b/src/content/docs/en/api/effector-solid/index.md new file mode 100644 index 0000000..e8038af --- /dev/null +++ b/src/content/docs/en/api/effector-solid/index.md @@ -0,0 +1,25 @@ +--- +title: effector-solid +redirectFrom: + - /api/effector-solid + - /docs/api/effector-solid +--- + +Effector bindings for SolidJS. + +# Reactive Helpers (#reactive-helpers) + +- [useUnit(unit)](/en/api/effector-solid/useUnit) +- [useStoreMap({ store, keys, fn })](/en/api/effector-solid/useStoreMap) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-solid/Gate) +- [createGate()](/en/api/effector-solid/createGate) +- [useGate(GateComponent, props)](/en/api/effector-solid/useGate) + +# Import Map (#import-map) + +Package `effector-solid` provides couple different entry points for different purposes: + +- [effector-solid/scope](/en/api/effector-solid/module/scope) diff --git a/src/content/docs/en/api/effector-solid/module/scope.md b/src/content/docs/en/api/effector-solid/module/scope.md new file mode 100644 index 0000000..714290b --- /dev/null +++ b/src/content/docs/en/api/effector-solid/module/scope.md @@ -0,0 +1,64 @@ +--- +title: effector-solid/scope +description: Deprecated separate module of effector-solid that enforces library to use Scope +--- + +```ts +import {} from "effector-solid/scope"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using the main module of `effector-solid` instead. +::: + +Provides all exports from [effector-solid](/en/api/effector-solid), but enforces the application to use [Scope](/en/api/effector/scope) for all components. + +## Usage (#usage) + +You can use this module in the same way as [effector-solid](/en/api/effector-solid), but it will require passing [Scope](/en/api/effector/scope) to [Provider](/en/api/effector-solid/Provider) component. + +```jsx +// main.js +import { fork } from "effector"; +import { Provider } from "effector-solid/scope"; +import { render } from "solid-js/web"; + +const scope = fork(); + +render( + + + , + document.getElementById("root"), +); +``` + +## Migration (#migration) + +Since `effector-solid/scope` is deprecated, it is recommended to migrate to [effector-solid](/en/api/effector-solid) by removing `scope` from the import path. + +```diff ++ import { Provider } from "effector-solid"; +- import { Provider } from "effector-solid/scope"; +``` + +:::warning{title="Continued migration"} +`effector-solid` and `effector-solid/scope` do not share any code, so you have to migrate all your code to `effector-solid` at the same time, because otherwise, you will get runtime errors. These errors will occur because `effector-solid` and `effector-solid/scope` will use different instances of `Provider` and do not have access to each other's `Provider`. +::: + +## Scope enforcement (#scope-enforcement) + +All modern hooks of `effector-solid` are designed to work with [Scope](/en/api/effector/scope). If you want to imitate the behavior of the `effector-solid/scope` module, you can pass a second parameter to hooks with an option `forceScope: true`. In this case, the hook will throw an error if the [Scope](/en/api/effector/scope) is not passed to [Provider](/en/api/effector-solid/Provider). + +```diff +- import { useUnit } from 'effector-solid/scope' ++ import { useUnit } from 'effector-solid' + + +function MyComponent() { +- const { test } = useUnit({ text: $text }) ++ const { test } = useUnit({ text: $text }, { forceScope: true }) + + return

    {text}

    +} +``` diff --git a/src/content/docs/en/api/effector-solid/useGate.md b/src/content/docs/en/api/effector-solid/useGate.md new file mode 100644 index 0000000..b44bd94 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useGate.md @@ -0,0 +1,58 @@ +--- +title: useGate +description: Function for passing data to Gate +redirectFrom: + - /api/effector-solid/useGate + - /docs/api/effector-solid/useGate +--- + +```ts +import { useGate } from "effector-solid"; +``` + +Function for passing data to [_Gate_](/en/api/effector-solid/Gate). + +# Methods (#methods) + +## `useGate(Gate, props)` (#methods-useGate-Gate-props) + +### Formulae (#methods-useGate-Gate-props-formulae) + +```ts +useGate(Gate: Gate, props: Props): void; +``` + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate` ([`Gate`](/en/api/effector-solid/Gate)) +2. `props` (_Props_) + +### Returns (#methods-useGate-Gate-props-returns) + +(`void`) + +### Examples (#methods-useGate-Gate-props-examples) + +#### Basic Usage (#methods-useGate-Gate-props-examples-basic-usage) + +```jsx +import { createGate, useGate } from "effector-solid"; +import { Route, Routes } from "solid-app-router"; + +const PageGate = createGate("page"); + +const Home = (props) => { + useGate(PageGate, props); + return
    Home
    ; +}; + +PageGate.state.watch(({ match }) => { + console.log(match); +}); + +const App = () => ( + + } /> + +); +``` diff --git a/src/content/docs/en/api/effector-solid/useStoreMap.md b/src/content/docs/en/api/effector-solid/useStoreMap.md new file mode 100644 index 0000000..fe852e3 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useStoreMap.md @@ -0,0 +1,117 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-solid/useStoreMap + - /docs/api/effector-solid/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-solid"; +``` + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +Function, which subscribes to a [store](/en/api/effector/Store) and transforms its value with a given function. Signal will update only when the selector function result will change. + +Common use case: subscribe to changes in selected part of store only. + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store, + fn: (state: State) => Result, +): Accessor; +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store`](/en/api/effector/Store) +2. `fn` (`(state: T) => Result`): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`Result`) + +### Examples (#methods-useStoreMap-store-fn-examples) + +TBD + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store, + keys: any[], + fn: (state: State, keys: any[]) => Result, + updateFilter? (newResult, oldResult) => boolean, +}): Result; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `params` (_Object_): Configuration object + - `store`: Source [store](/en/api/effector/Store) + - `keys` (_Array_): Will be passed to `fn` selector + - `fn` (_(state, keys) => result_): Selector function to receive part of the source store + - `updateFilter` (_(newResult, oldResult) => boolean_): _Optional_ function used to compare old and new updates to prevent unnecessary rerenders. Uses [createStore updateFilter](/en/api/effector/createStore#methods-createStore-defaultState-config-formulae) option under the hood + +### Returns (#methods-useStoreMap-config-returns) + +(`Accessor`) + +### Examples (#methods-useStoreMap-config-examples) + +This hook is very useful for working with lists, especially large ones. + +```jsx +import { createStore } from "effector"; +import { useUnit, useStoreMap } from "effector-solid"; +import { For } from "solid-js/web"; + +const usersRaw = [ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]; + +const $users = createStore(usersRaw); +const $ids = createStore(usersRaw.map(({ id }) => id)); + +const User = ({ id }) => { + const user = useStoreMap({ + store: $users, + keys: [id], + fn: (users, [userId]) => users.find(({ id }) => id === userId) ?? null, + }); + + return ( +
    + [{user()?.id}] {user()?.name} +
    + ); +}; + +const UserList = () => { + const ids = useUnit($ids); + + return {(id) => }; +}; +``` diff --git a/src/content/docs/en/api/effector-solid/useUnit.md b/src/content/docs/en/api/effector-solid/useUnit.md new file mode 100644 index 0000000..6701ae9 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useUnit.md @@ -0,0 +1,175 @@ +--- +title: useUnit +description: Effector Solid +redirectFrom: + - /api/effector-solid/useUnit + - /docs/api/effector-solid/useUnit +--- + +```ts +import { useUnit } from "effector-solid"; +``` + +Binds effector stores to the Solid reactivity system or, in the case of events/effects – binds to current [_scope_](/en/api/effector/Scope) to use in dom event handlers. +Only `effector-solid/scope` version works this way, `useUnit` of `effector-solid` is no-op for events and does not require `Provider` with scope. + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +### Arguments (#methods-useUnit-unit-arguments) + +```ts +useUnit(event: EventCallable): (payload: T) => T; +useUnit(effect: Effect): (payload: Params) => Promise; +``` + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([`EventCallable`](/en/api/effector/Event#eventCallable) or [`Effect`](/en/api/effector/Effect)): Event or effect which will be bound to current `scope`. + +### Returns (#methods-useUnit-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger the given unit in the current scope. + +### Example (#methods-useUnit-unit-example) + +A basic Solid component using `useUnit` with events and stores. + +```jsx +import { render } from "solid-js/web"; +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-solid"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); + +const App = () => { + const [count, handleIncrement] = useUnit([$count, incremented]); + + return ( + <> +

    Count: {count()}

    + + + ); +}; + +const scope = fork(); + +render( + () => ( + + + + ), + document.getElementById("root"), +); +``` + +## `useUnit(store)` (#methods-useUnit-store) + +### Formulae (#methods-useUnit-store-formulae) + +```ts +useUnit($store: Store): Accessor; +``` + +### Arguments (#methods-useUnit-store-arguments) + +1. `$store` effector ([_Store_](/en/api/effector/Store)). + +### Returns (#methods-useUnit-store-returns) + +(`Accessor`) which will subscribe to store state. + +### Example (#methods-useUnit-store-example) + +```jsx +import { createStore, createApi } from "effector"; +import { useUnit } from "effector-solid"; + +const $counter = createStore(0); + +const { incremented, decremented } = createApi($counter, { + incremented: (count) => count + 1, + decremented: (count) => count - 1, +}); + +const App = () => { + const counter = useUnit($counter); + const [handleIncrement, handleDecrement] = useUnit([incremented, decremented]); + + return ( +
    + {counter()} + + +
    + ); +}; +``` + +## `useUnit(shape)` (#methods-useUnit-shape) + +### Formulae (#methods-useUnit-shape-formulae) + +```ts +useUnit({ a: Store
    , b: Event, ... }): { a: Accessor, b: (payload: B) => B; ... } + +useUnit([Store, Event, ... ]): [Accessor, (payload: B) => B, ... ] +``` + +### Arguments (#methods-useUnit-shape-arguments) + +1. `shape` Object or array of ([`EventCallable`](/en/api/effector/Event#eventCallable), [`Effect`](/en/api/effector/Effect), or [`Store`](/en/api/effector/Store)): Events, or effects, or stores as accessors which will be bound to the current `scope`. + +### Returns (#methods-useUnit-shape-returns) + +(`Object` or `Array`): + +- If `EventCallable` or `Effect`: functions with the same names or keys as argument to pass to event handlers. Will trigger given unit in current scope _Note: events or effects will be bound **only** if `useUnit` is imported from `effector-solid/scope`_. +- If `Store`: accessor signals which will subscribe to the store state. + +### Examples (#methods-useUnit-shape-examples) + +```jsx +import { render } from "solid-js/web"; +import { createStore, createEvent, fork } from "effector"; +import { useUnit, Provider } from "effector-solid/scope"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0) + .on(incremented, (count) => count + 1) + .on(decremented, (count) => count - 1); + +const App = () => { + const count = useUnit($count); + const on = useUnit({ incremented, decremented }); + // or + const [a, b] = useUnit([incremented, decremented]); + + return ( + <> +

    Count: {count()}

    + + + + ); +}; + +const scope = fork(); + +render( + () => ( + + + + ), + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-vue/ComponentOptions.md b/src/content/docs/en/api/effector-vue/ComponentOptions.md new file mode 100644 index 0000000..bf09980 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/ComponentOptions.md @@ -0,0 +1,63 @@ +--- +title: ComponentOptions +redirectFrom: + - /api/effector-vue/ComponentOptions + - /docs/api/effector-vue/component-options +--- + +# ComponentOptions (#ComponentOptions) + +## `effector` (#ComponentOptions-effector) + +### Returns (#ComponentOptions-effector-returns) + +(_`Function | Object | Store`_): `Store` or object of `Store`'s, or function which will be called with the Component instance as `this`. + +### Examples (#ComponentOptions-effector-examples) + +#### Basic Usage (#ComponentOptions-effector-examples-basic) + +```js +import Vue from "vue"; +import { createStore, combine } from "effector"; + +const counter = createStore(0); + +new Vue({ + data() { + return { + foo: "bar", + }; + }, + effector() { + // would create `state` in template + return combine( + this.$store(() => this.foo), + counter, + (foo, counter) => `${foo} + ${counter}`, + ); + }, +}); +``` + +#### Using Object Syntax (#ComponentOptions-effector-examples-object) + +```js +import { counter } from "./stores"; + +new Vue({ + effector: { + counter, // would create `counter` in template + }, +}); +``` + +#### Using Store Directly (#ComponentOptions-effector-examples-direct) + +```js +import { counter } from "./stores"; + +new Vue({ + effector: counter, // would create `state` in template +}); +``` diff --git a/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md b/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md new file mode 100644 index 0000000..77a85a4 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md @@ -0,0 +1,34 @@ +--- +title: EffectorScopePlugin +--- + +The Plugin provides a general scope which needs for read and update effector's stores, call effector's events. Required for SSR. + +# Plugins (#plugins) + +## `EffectorScopePlugin({ scope, scopeName })` (#plugins-EffectorScopePlugin-scope-scopeName) + +### Arguments (#plugins-EffectorScopePlugin-scope-scopeName-arguments) + +1. `scope` [Scope](/en/api/effector/Scope) +2. `scopeName?` custom scopeName (default: `root`) + +### Examples (#plugins-EffectorScopePlugin-scope-scopeName-examples) + +#### Basic Usage (#plugins-EffectorScopePlugin-scope-scopeName-examples-basic) + +```js +import { createSSRApp } from "vue"; +import { EffectorScopePlugin } from "effector-vue"; +import { fork } from "effector"; + +const app = createSSRApp(AppComponent); +const scope = fork(); + +app.use( + EffectorScopePlugin({ + scope, + scopeName: "app-scope-name", + }), +); +``` diff --git a/src/content/docs/en/api/effector-vue/Gate.md b/src/content/docs/en/api/effector-vue/Gate.md new file mode 100644 index 0000000..be29294 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/Gate.md @@ -0,0 +1,52 @@ +--- +title: Effector Vue Gate +description: Effector Vue +redirectFrom: + - /api/effector-vue/Gate + - /docs/api/effector-vue/gate +--- + +_Gate_ is a hook for conditional rendering, based on current value (or values) in props. An example of a problem that Gate can solve – you can put together all required data, when component was mounted. + +This allows you to send props back to _Store_ to create feedback loop. + +Gate can be used via [useGate](/en/api/effector-vue/useGate) hook. Gate stores and events can be used in the application as regular units + +Gate can have two states: + +- **Open**, which means mounted +- **Closed**, which means unmounted + +# Gate Properties (#properties) + +## `.state` (#properties-state) + +:::warning{title="Important"} +Do not modify `state` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +`Store`: [DerivedStore](/en/api/effector/Store#readonly) with current state of the given gate. The state comes from the second argument of [useGate](/en/api/effector-vue/useGate) and from props when rendering gate as a component. + +## `.open` (#properties-open) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate state. +::: + +[Event](/en/api/effector/Event): Event which will be called during gate mounting + +## `.close` (#properties-close) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate state. +::: + +[Event](/en/api/effector/Event): Event which will be called during a gate unmounting. + +## `.status` (#properties-status) + +:::warning{title="Important"} +Do not modify `status` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +`Store`: Boolean [DerivedStore](/en/api/effector/Store#readonly), which show if given gate is mounted. diff --git a/src/content/docs/en/api/effector-vue/VueEffector.md b/src/content/docs/en/api/effector-vue/VueEffector.md new file mode 100644 index 0000000..ef34fe2 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/VueEffector.md @@ -0,0 +1,36 @@ +--- +title: VueEffector +description: effector-vue plugin for vue 2 +redirectFrom: + - /api/effector-vue/VueEffector + - /docs/api/effector-vue/vue-effector +--- + +```ts +import { VueEffector } from "effector-vue"; +``` + +`effector-vue` plugin for vue 2 + +# Methods (#methods) + +## `VueEffector(Vue, options?)` (#methods-VueEffector-Vue-options) + +### Arguments (#methods-VueEffector-Vue-options-arguments) + +1. `Vue` (_class Vue_): Vue class +2. `options` (_Object_): Plugin options + - TBD + +### Returns (#methods-VueEffector-Vue-options-returns) + +(_`void`_) + +### Examples (#methods-VueEffector-Vue-options-examples) + +```js +import Vue from "vue"; +import { VueEffector } from "effector-vue"; + +Vue.use(VueEffector); +``` diff --git a/src/content/docs/en/api/effector-vue/VueSSRPlugin.md b/src/content/docs/en/api/effector-vue/VueSSRPlugin.md new file mode 100644 index 0000000..8e88f54 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/VueSSRPlugin.md @@ -0,0 +1,41 @@ +--- +title: VueSSRPlugin +redirectFrom: + - /api/effector-vue/VueSSRPlugin + - /docs/api/effector-vue/VueSSRPlugin +--- + +The Plugin provides a general scope which needs for read and update effector's stores, call effector's events. Required for SSR. + +# Plugins (#plugins) + +## `VueSSRPlugin({ scope, scopeName })` (#plugins-VueSSRPlugin-scope-scopeName) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) `VueSSRPlugin` is deprecated. Use [`EffectorScopePlugin`](./EffectorScopePlugin) instead. +::: + +## Arguments (#plugins-VueSSRPlugin-scope-scopeName-arguments) + +1. `scope` [Scope](/en/api/effector/Scope) +2. `scopeName?` custom scopeName (default: `root`) + +## Examples (#plugins-VueSSRPlugin-scope-scopeName-examples) + +### Basic usage (#plugins-VueSSRPlugin-scope-scopeName-examples-basicUsage) + +```js +import { createSSRApp } from "vue"; +import { VueSSRPlugin } from "effector-vue/ssr"; +import { fork } from "effector"; + +const app = createSSRApp(AppComponent); +const scope = fork(); + +app.use( + VueSSRPlugin({ + scope, + scopeName: "app-scope-name", + }), +); +``` diff --git a/src/content/docs/en/api/effector-vue/createComponent.md b/src/content/docs/en/api/effector-vue/createComponent.md new file mode 100644 index 0000000..f52b438 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/createComponent.md @@ -0,0 +1,49 @@ +--- +title: createComponent +redirectFrom: + - /api/effector-vue/createComponent +--- + +# Methods (#methods) + +## `createComponent(options, store?)` (#methods-createComponent-options-store) + +### Arguments (#methods-createComponent-options-store-arguments) + +1. `options` (_Object_): component options (hooks, methods, computed properties) +2. `store` (_Object_): Store object from effector + +### Returns (#methods-createComponent-options-store-returns) + +(_`vue component`_) + +### Example (#methods-createComponent-options-store-example) + +```html + +``` + +```js +// component.vue +import { createComponent } from "effector-vue"; + +const $counter = createStore(0); +const { update } = createApi($counter, { + update: (_, value: number) => value, +}); + +export default createComponent( + { + name: "Counter", + + methods: { + update, + handleClick() { + const value = this.$counter + 1; // this.$counter <- number ( typescript tips ) + this.update(value); + }, + }, + }, + { $counter }, +); +``` diff --git a/src/content/docs/en/api/effector-vue/createGate.md b/src/content/docs/en/api/effector-vue/createGate.md new file mode 100644 index 0000000..5fb1049 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/createGate.md @@ -0,0 +1,80 @@ +--- +title: createGate +description: Creates a gate to consume data from view. Designed for vue 3 +redirectFrom: + - /api/effector-vue/createGate + - /docs/api/effector-vue/createGate +--- + +Creates a [_Gate_](/apieffector-vue/Gate) to consume data from view, designed for vue 3. If `defaultState` is defined, [Gate.state](/apieffector-vue/Gate#state) will be created with passed value. + +# Methods (#methods) + +## `createGate(config?: {defaultState?, domain?, name?})` (#methods-createGate-config) + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-vue/Gate#state) +- `domain?` ([_Domain_](/en/api/effector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-vue/Gate#open) event, [Gate.state](/en/api/effector-vue/Gate#state) store, and so on) +- `name?` (_string_): Optional name which will be used as the name of a created Vue component + +### Returns (#methods-createGate-config-returns) + +[_Gate_](/en/api/effector-vue/Gate) + +### Examples (#methods-createGate-config-examples) + +#### Basic Usage (#methods-createGate-config-examples-basic) + +```js +import { createGate, useGate } from "effector-vue/composition"; + +const ListGate = createGate({ + name: "Gate with required props", +}); + +const ListItem = { + template: ` +
    + {{id}} +
    + `, + props: { + id: { + type: String, + required: true, + }, + }, + setup(props) { + useGate(ListGate, () => props.id); + }, +}; + +const app = { + template: ` +
    + +
    + `, + components: { + ListItem, + }, + setup() { + const id = ref("1"); + return { id }; + }, +}; + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state null + +app.mount("#app"); +// => current state 1 + +app.unmount(); +// => current state null +``` diff --git a/src/content/docs/en/api/effector-vue/index.md b/src/content/docs/en/api/effector-vue/index.md new file mode 100644 index 0000000..d952456 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/index.md @@ -0,0 +1,38 @@ +--- +title: effector-vue +redirectFrom: + - /api/effector-vue + - /docs/api/effector-vue +--- + +Effector binginds for Vue. + +# Top-Level Exports (#top-level-exports) + +- [VueEffector(Vue, options?)](/en/api/effector-vue/VueEffector) +- [createComponent(ComponentOptions, store?)](/en/api/effector-vue/createComponent) +- [EffectorScopePlugin({scope, scopeName?})](/en/api/effector-vue/EffectorScopePlugin) + +# ComponentOptions API (#componentOptions-api) + +- [ComponentOptions\](/en/api/effector-vue/ComponentOptions) + +# Hooks (#hooks) + +- [useUnit(shape)](/en/api/effector-vue/useUnit) +- [useStore(store)](/en/api/effector-vue/useStore) +- [useStoreMap({store, keys, fn})](/en/api/effector-vue/useStoreMap) +- [useVModel(store)](/en/api/effector-vue/useVModel) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-vue/Gate) +- [createGate()](/en/api/effector-vue/createGate) +- [useGate(GateComponent, props)](/en/api/effector-vue/useGate) + +# Import map (#import-map) + +Package `effector-vue` provides couple different entry points for different purposes: + +- [effector-vue/composition](/en/api/effector-vue/module/composition) +- [effector-vue/ssr](/en/api/effector-vue/module/ssr) diff --git a/src/content/docs/en/api/effector-vue/module/composition.md b/src/content/docs/en/api/effector-vue/module/composition.md new file mode 100644 index 0000000..b7bc175 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/module/composition.md @@ -0,0 +1,17 @@ +--- +title: effector-vue/composition +description: Separate module of effector-vue that provides additional API for composition API +--- + +```ts +import {} from "effector-vue/composition"; +``` + +Provides additional API for [effector-vue](/en/api/effector-vue) that allows to use [Composition API](https://v3.vuejs.org/guide/composition-api-introduction.html) + +## APIs (#api) + +- [useUnit(shape)](/en/api/effector-vue/useUnit) +- [useStore($store)](/en/api/effector-vue/useStore) +- [useStoreMap({ store, keys, fn })](/en/api/effector-vue/useStoreMap) +- [useVModel($store)](/en/api/effector-vue/useVModel) diff --git a/src/content/docs/en/api/effector-vue/module/ssr.md b/src/content/docs/en/api/effector-vue/module/ssr.md new file mode 100644 index 0000000..6322212 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/module/ssr.md @@ -0,0 +1,19 @@ +--- +title: effector-vue/ssr +description: Deprecated separate module of effector-vue that enforces library to use Scope +--- + +```ts +import {} from "effector-vue/ssr"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using main module of `effector-vue` of `effector-vue/composition` instead. +::: + +Provides additional API for [effector-vue](/en/api/effector-vue) that enforces library to use [Scope](/en/api/effector/scope) + +## APIs + +- [useEvent(event)](../useEvent) +- [VueSSRPlugin](../VueSSRPlugin) diff --git a/src/content/docs/en/api/effector-vue/useEvent.md b/src/content/docs/en/api/effector-vue/useEvent.md new file mode 100644 index 0000000..5a8fb71 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useEvent.md @@ -0,0 +1,54 @@ +--- +title: useEvent +redirectFrom: + - /api/effector-vue/useEvent + - /docs/api/effector-vue/useEvent +--- + +```ts +import { useEvent } from "effector-vue/ssr"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) `useEvent` is deprecated. Use [`useUnit`](./useUnit#useUnit) instead. +::: + +Bind event to current fork instance to use in dom event handlers. Used **only** with ssr, in application without forks `useEvent` will do nothing + +# Methods (#methods) + +## `useEvent(unit)` (#methods-useEvent-unit) + +### Arguments (#methods-useEvent-unit-arguments) + +1. `unit` ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Event or effect which will be bound to current `scope` + +### Returns (#methods-useEvent-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger a given unit in current scope + +### Examples (#methods-useEvent-unit-examples) + +#### Basic (#methods-useEvent-unit-examples-basic) + +```js +import { createStore, createEvent } from "effector"; +import { useEvent } from "effector-vue/ssr"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (x) => x + 1); + +export default { + setup() { + const counter = useStore($count); + const onIncrement = useEvent(incremented); + + return { + onIncrement, + counter, + }; + }, +}; +``` diff --git a/src/content/docs/en/api/effector-vue/useGate.md b/src/content/docs/en/api/effector-vue/useGate.md new file mode 100644 index 0000000..41bc1a5 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useGate.md @@ -0,0 +1,30 @@ +--- +title: useGate +description: Using a gate to consume data from view. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useGate + - /docs/api/effector-vue/useGate +--- + +```ts +import { useGate } from "effector-vue/composition"; +``` + +# Methods (#methods) + +## `useGate(Gate, props)` (#methods-useGate-Gate-props) + +Using a [`Gate`](/en/api/effector-vue/Gate) to consume data from view. Designed for Vue 3 + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate` ([_Gate_](/en/api/effector-vue/Gate)) +2. `props` (_Props_) + +### Returns (#methods-useGate-Gate-props-returns) + +(_`void`_) + +### Examples (#methods-useGate-Gate-props-examples) + +[See example](/en/api/effector-vue/Gate) diff --git a/src/content/docs/en/api/effector-vue/useStore.md b/src/content/docs/en/api/effector-vue/useStore.md new file mode 100644 index 0000000..babc3bb --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useStore.md @@ -0,0 +1,49 @@ +--- +title: useStore +description: Hook function, which subscribes to watcher, that observes changes in store. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useStore + - /docs/api/effector-vue/useStore +--- + +```ts +import { useStore } from "effector-vue/composition"; +``` + +A hook function, which subscribes to watcher, that observes changes in the current **readonly** store, so when recording results, the component will update automatically. You can mutate the store value **only via [createEvent](/en/api/effector/createEvent)**. Designed for vue 3 + +## `useStore($store)` (#useStore-store) + +### Arguments (#useStore-store-arguments) + +1. `$store` ([`Store`](/en/api/effector/Store)) + +### Returns (#useStore-store-returns) + +(`readonly(State)`) + +### Example (#useStore-store-example) + +```js +import { createStore, createApi } from "effector"; +import { useStore } from "effector-vue/composition"; + +const $counter = createStore(0); + +const { incremented, decremented } = createApi($counter, { + incremented: (count) => count + 1, + decremented: (count) => count - 1, +}); + +export default { + setup() { + const counter = useStore($counter); + + return { + counter, + incremented, + decremented, + }; + }, +}; +``` diff --git a/src/content/docs/en/api/effector-vue/useStoreMap.md b/src/content/docs/en/api/effector-vue/useStoreMap.md new file mode 100644 index 0000000..d50f303 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useStoreMap.md @@ -0,0 +1,130 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-vue/useStoreMap + - /docs/api/effector-vue/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-vue/composition"; +``` + +Function, which subscribes to [store](/en/api/effector/Store) and transforms its value with a given function. Signal will update only when the selector function result will change + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store, + fn: (state: State) => Result, +): ComputedRef; +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store`](/en/api/effector/Store) +2. `fn` (_(state) => result_): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`ComputedRef`) + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store, + keys?: () => Keys, + fn: (state: State, keys: Keys) => Result, + defaultValue?: Result, +}): ComputedRef; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `params` (_Object_): Configuration object + - `store`: Source [store](/en/api/effector/Store) + - `keys` (`() => Keys`): Will be passed to `fn` selector + - `fn` (`(state: State, keys: Keys) => Result`): Selector function to receive part of source store + - `defaultValue` (`Result`): Optional default value if `fn` returned `undefined` + +### Returns (#methods-useStoreMap-config-returns) + +(`ComputedRef`) + +### Examples (#methods-useStoreMap-config-examples) + +This hook is very useful for working with lists, especially with large ones + +##### User.vue (#methods-useStoreMap-config-example-userVue) + +```js +import { createStore } from "effector"; +import { useUnit, useStoreMap } from "effector-vue/composition"; + +const $users = createStore([ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]); + +export default { + props: { + id: Number, + }, + setup(props) { + const user = useStoreMap({ + store: $users, + keys: () => props.id, + fn: (users, userId) => users.find(({ id }) => id === userId), + }); + + return { user }; + }, +}; +``` + +```jsx +
    + [{user.id}] {user.name} +
    +``` + +##### App.vue (#methods-useStoreMap-config-examples-appVue) + +```js +const $ids = createStore(data.map(({ id }) => id)); + +export default { + setup() { + const ids = useStore($ids); + + return { ids }; + }, +}; +``` + +```jsx +
    + +
    +``` diff --git a/src/content/docs/en/api/effector-vue/useUnit.md b/src/content/docs/en/api/effector-vue/useUnit.md new file mode 100644 index 0000000..029303a --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useUnit.md @@ -0,0 +1,150 @@ +--- +title: useUnit +description: TDB +redirectFrom: + - /docs/api/effector-vue/useUnit +--- + +```ts +import { useUnit } from "effector-vue/composition"; +``` + +Bind [_Stores_](../effector/Store) to Vue reactivity system or, in the case of [_Events_](../effector/Event)/[_Effects_](../effector/Effect) - bind to current [_Scope_](../effector/Scope) to use in DOM event handlers. + +**Designed for Vue 3 and Composition API exclusively.** + +:::info{title="Future"} +This API can completely replace the following APIs: + +- [useStore($store)](./useStore) +- [useEvent(event)](./useEvent) + +In the future, these APIs can be deprecated and removed. + +::: + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([_Event_](../effector/Event) or [_Effect_](../effector/Effect)): Event or effect which will be bound to current [_Scope_](../effector/Scope) + +### Returns (#methods-useUnit-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger given unit in current scope + +### Examples (#methods-useUnit-unit-examples) + +#### Basic Usage (#methods-useUnit-unit-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + + + + +``` + +### `useUnit($store)` (#methods-useUnit-store) + +#### Arguments (#methods-useUnit-store-arguments) + +1. `$store` ([_Store_](../effector/Store)): Store which will be bound to Vue reactivity system + +#### Returns (#methods-useUnit-store-returns) + +Reactive value of given [_Store_](../effector/Store) + +#### Examples (#methods-useUnit-store-examples) + +##### Basic Usage (#methods-useUnit-store-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + + + + +``` + +### `useUnit(shape)` (#methods-useUnit-shape) + +#### Arguments (#methods-useUnit-shape-arguments) + +1. `shape` Object or array of ([_Events_](../effector/Event) or [_Effects_](../effector/Effect) or [_Stores_](../effector/Store)): Every unit will be processed by `useUnit` and returned as a reactive value in case of [_Store_](../effector/Store) or as a function to pass to event handlers in case of [_Event_](../effector/Event) or [_Effect_](../effector/Effect). + +#### Returns (#methods-useUnit-shape-returns) + +(Object or Array): + +- if [_Event_](../effector/Event) or [_Effect_](../effector/Effect): functions with the same names or keys as argument to pass to event handlers. Will trigger given unit in current [_Scope_](../effector/Scope). +- if [_Store_](../effector/Store): reactive value of given [_Store_](../effector/Store) with the same names or keys as argument. + +#### Examples (#methods-useUnit-shape-examples) + +##### Basic Usage (#methods-useUnit-shape-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + + + + +``` diff --git a/src/content/docs/en/api/effector-vue/useVModel.md b/src/content/docs/en/api/effector-vue/useVModel.md new file mode 100644 index 0000000..fd949c4 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useVModel.md @@ -0,0 +1,108 @@ +--- +title: useVModel +description: hook function, which subscribes to watcher, that observes changes in the current store. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useVModel + - /docs/api/effector-vue/useVModel +--- + +```ts +import { useVModel } from "effector-vue/composition"; +``` + +A hook function, which subscribes to a watcher that observes changes in the current store, so when recording results, the component will automatically update. It is primarily used when working with forms (`v-model`) in Vue 3. + +# Methods (#methods) + +## `useVModel($store)` (#methods-useVModel-store) + +### Formulae (#methods-useVModel-store-formulae) + +```ts +useVModel($store: Store): Ref>; +``` + +Designed for Vue 3. + +### Arguments (#methods-useVModel-store-arguments) + +1. `$store` ([_Store_](/en/api/effector/Store)) +2. `shape of Stores` ([_Store_](/en/api/effector/Store)) + +### Returns (#methods-useVModel-store-returns) + +(`State`) + +### Examples (#methods-useVModel-examples) + +#### Single Store (#methods-useVModel-examples-singleStore) + +```js +import { createStore, createApi } from "effector"; +import { useVModel } from "effector-vue/composition"; + +const $user = createStore({ + name: "", + surname: "", + skills: ["CSS", "HTML"], +}); + +export default { + setup() { + const user = useVModel($user); + + return { user }; + }, +}; +``` + +```html +
    + + + +
    + + + +
    +
    +``` + +#### Store Shape (#methods-useVModel-examples-storeShape) + +```js +import { createStore, createApi } from "effector"; +import { useVModel } from "effector-vue/composition"; + +const $name = createStore(""); +const $surname = createStore(""); +const $skills = createStore([]); + +const model = { + name: $name, + surname: $surname, + skills: $skills, +}; + +export default { + setup() { + const user = useVModel(model); + + return { user }; + }, +}; +``` + +```html +
    + + + +
    + + + +
    +
    +``` diff --git a/src/content/docs/en/api/effector/Domain.md b/src/content/docs/en/api/effector/Domain.md new file mode 100644 index 0000000..e22026e --- /dev/null +++ b/src/content/docs/en/api/effector/Domain.md @@ -0,0 +1,299 @@ +--- +title: Domain +description: Domain, its methods and properties +redirectFrom: + - /api/effector/Domain + - /docs/api/effector/domain +--- + +```ts +import { type Domain } from "effector"; +``` + +Domain is a namespace for your events, stores and effects. + +Domain can subscribe to event, effect, store or nested domain creation with `onCreateEvent`, `onCreateStore`, `onCreateEffect`, `onCreateDomain` methods. + +It is useful for logging or other side effects. + +# Unit creators (#unit-creators) + +:::info{title="since"} +[effector 20.7.0](https://changelog.effector.dev/#effector-20-7-0) +::: + +## `createEvent(name?)` (#unit-creators-createEvent-name) + +### Arguments (#unit-creators-createEvent-name-arguments) + +1. `name`? (_string_): event name + +### Returns (#unit-creators-createEvent-name-returns) + +[_Event_](/en/api/effector/Event): New event + +## `createEffect(handler?)` (#unit-creators-createEffect-handler) + +Creates an [effect](/en/api/effector/Effect) with given handler. + +### Arguments (#unit-creators-createEffect-handler-arguments) + +1. `handler`? (_Function_): function to handle effect calls, also can be set with [use(handler)](#use) + +### Returns (#unit-creators-createEffect-handler-returns) + +[_Effect_](/en/api/effector/Effect): A container for async function. + +:::info{title="since"} +[effector 21.3.0](https://changelog.effector.dev/#effector-21-3-0) +::: + +## `createEffect(name?)` (#unit-creators-createEffect-name) + +### Arguments (#unit-creators-createEffect-name-arguments) + +1. `name`? (_string_): effect name + +### Returns (#unit-creators-createEffect-name-returns) + +[_Effect_](/en/api/effector/Effect): A container for async function. + +## `createStore(defaultState)` (#unit-creators-createStore-defaultState) + +### Arguments (#unit-creators-createStore-defaultState-arguments) + +1. `defaultState` (_State_): store default state + +### Returns (#unit-creators-createStore-defaultState-returns) + +[_Store_](/en/api/effector/Store): New store + +## `createDomain(name?)` (#unit-creators-createDomain-name) + +### Arguments (#unit-creators-createDomain-name-arguments) + +1. `name`? (_string_): domain name + +### Returns (#unit-creators-createDomain-name-returns) + +[_Domain_](/en/api/effector/Domain): New domain + +## Aliases (#unit-creators-aliases) + +### `event(name?)` (#unit-creators-aliases-event-name) + +An alias for [domain.createEvent](/en/api/effector/Domain#createevent-name) + +### `effect(name?)` (#unit-creators-aliases-effect-name) + +An alias for [domain.createEffect](/en/api/effector/Domain#createeffect-name) + +### `store(defaultState)` (#unit-creators-aliases-store-defaultState) + +An alias for [domain.createStore](/en/api/effector/Domain#createstore-defaultstate) + +### `domain(name?)` (#unit-creators-aliases-domain-name) + +An alias for [domain.createDomain](/en/api/effector/Domain#createdomain-name) + +# Domain Properties (#properties) + +## `.history` (#unit-creators-history) + +Contains mutable read-only sets of units inside a domain. + +:::info{title="since"} +[effector 20.3.0](https://changelog.effector.dev/#effector-20-3-0) +::: + +### Formulae (#unit-creators-history-formulae) + +```ts +interface DomainHistory { + stores: Set>; + events: Set>; + domains: Set; + effects: Set>; +} + +const { stores, events, domains, effects } = domain.history; +``` + +When any kind of unit created inside a domain, it appears in a set with the name of type(stores, events, domains, effects) in the same order as created. + +### Examples (#unit-creators-history-examples) + +#### Basic (#unit-creators-history-examples-basic) + +```js +import { createDomain } from "effector"; +const domain = createDomain(); +const eventA = domain.event(); +const $storeB = domain.store(0); +console.log(domain.history); +// => {stores: Set{storeB}, events: Set{eventA}, domains: Set, effects: Set} +``` + +[Try it](https://share.effector.dev/flIV7Fja) + +# Domain hooks (#domain-hooks) + +## `onCreateEvent(callback)` (#domain-hooks-onCreateEvent-callback) + +### Formulae (#domain-hooks-onCreateEvent-callback-formulae) + +```ts +domain.onCreateEvent((event: Event) => {}); +``` + +- Function passed to `onCreateEvent` called every time, as new event created in `domain` +- Function called with `event` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateEvent-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Event](/en/api/effector/Event) and will be called during every [domain.createEvent](/en/api/effector/Domain#unit-creators-createEvent-name) call + +### Returns (#domain-hooks-onCreateEvent-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateEvent-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateEvent((event) => { + console.log("new event created"); +}); + +const a = domain.createEvent(); +// => new event created + +const b = domain.createEvent(); +// => new event created +``` + +[Try it](https://share.effector.dev/QCQpga6u) + +## `onCreateEffect(callback)` (#domain-hooks-onCreateEffect-callback) + +### Formulae (#domain-hooks-onCreateEffect-callback-formulae) + +```ts +domain.onCreateEffect((effect: Effect) => {}); +``` + +- Function passed to `onCreateEffect` called every time, as new effect created in `domain` +- Function called with `effect` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateEffect-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Effect](/en/api/effector/Effect) and will be called during every [domain.createEffect](/en/api/effector/Domain#unit-creators-createEffect-handler) call + +### Returns (#domain-hooks-onCreateEffect-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateEffect-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateEffect((effect) => { + console.log("new effect created"); +}); + +const fooFx = domain.createEffect(); +// => new effect created + +const barFx = domain.createEffect(); +// => new effect created +``` + +[Try it](https://share.effector.dev/uT6f8vv9) + +## `onCreateStore(callback)` (#domain-hooks-onCreateStore-callback) + +### Formulae (#domain-hooks-onCreateStore-callback-formulae) + +```ts +domain.onCreateStore(($store: Store) => {}); +``` + +- Function passed to `onCreateStore` called every time, as new store created in `domain` +- Function called with `$store` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateStore-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Store](/en/api/effector/Store) and will be called during every [domain.createStore](/en/api/effector/Domain#unit-creators-createStore-defaultState) call + +### Returns (#domain-hooks-onCreateStore-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateStore-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateStore((store) => { + console.log("new store created"); +}); + +const $a = domain.createStore(null); +// => new store created +``` + +[Try it](https://share.effector.dev/OGlYOtfz) + +## `onCreateDomain(callback)` (#domain-hooks-onCreateDomain-callback) + +### Formulae (#domain-hooks-onCreateDomain-callback-formulae) + +```ts +domain.onCreateDomain((domain) => {}); +``` + +- Function passed to `onCreateDomain` called every time, as subdomain created in `domain` +- Function called with `domain` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateDomain-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Domain](/en/api/effector/Domain) and will be called during every [domain.createDomain](/en/api/effector/Domain#unit-creators-createDomain-name) call + +### Returns (#domain-hooks-onCreateDomain-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateDomain-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateDomain((domain) => { + console.log("new domain created"); +}); + +const a = domain.createDomain(); +// => new domain created + +const b = domain.createDomain(); +// => new domain created +``` + +[Try it](https://share.effector.dev/dvBLiwHf) + +[_watcher_]: /en/explanation/glossary#watcher +[_subscription_]: /en/explanation/glossary#subscription diff --git a/src/content/docs/en/api/effector/Effect.md b/src/content/docs/en/api/effector/Effect.md new file mode 100644 index 0000000..6d1c936 --- /dev/null +++ b/src/content/docs/en/api/effector/Effect.md @@ -0,0 +1,583 @@ +--- +title: Effect +description: Effect, its methods and properties +redirectFrom: + - /api/effector/Effect + - /docs/api/effector/effect +--- + +```ts +import { type Effect } from "effector"; +``` + +**Effect** is a container for async function or any throwing function. + +It can be safely used in place of the original async function. + +# Methods (#methods) + +## `.use(handler)` (#methods-use-handler) + +Provides a function, which will be called when the effect is triggered. + +### Formulae (#methods-use-handler-formulae) + +```ts +effect.use(fn); +``` + +- Set handler `fn` for `effect` +- If effect already had an implementation at the time of the call, it will be replaced by a new one + +> Hint: current handler can be extracted with [effect.use.getCurrent()](#methods-use-getCurrent). + +You must provide a handler either through [.use](#methods-use-handler) method or `handler` property in [createEffect](/en/api/effector/createEffect), otherwise effect will throw with `no handler used in _%effect name%_` error when effect will be called. + +:::tip{title="See also"} +[Testing api calls with effects and stores](https://www.patreon.com/posts/testing-api-with-32415095) +::: + +### Arguments (#methods-use-handler-arguments) + +1. `handler` (_Function_): Function, that receives the first argument passed to an effect call. + +### Returns (#methods-use-handler-returns) + +([_Effect_](/en/api/effector/Effect)): The same effect + +### Examples (#methods-use-handler-examples) + +```js +const fetchUserReposFx = createEffect(); + +fetchUserReposFx.use(async (params) => { + console.log("fetchUserReposFx called with", params); + + const url = `https://api.github.com/users/${params.name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx({ name: "zerobias" }); +// => fetchUserRepos called with {name: 'zerobias'} +``` + +[Try it](https://share.effector.dev/TlYuDeve) + +## `.use.getCurrent()` (#methods-use-getCurrent) + +Returns current handler of effect. Useful for testing. + +### Formulae (#methods-use-getCurrent-formulae) + +```ts +fn = effect.use.getCurrent(); +``` + +- Returns current handler `fn` for `effect` +- If no handler was assigned to `effect`, default handler will be returned ([that throws an error](https://share.effector.dev/8PBjt3TL)) + +> Hint: to set a new handler use [effect.use(handler)](#methods-use-handler) + +### Returns (#methods-use-getCurrent-returns) + +(_Function_): Current handler, defined by `handler` property or via `.use` call. + +### Examples (#methods-use-getCurrent-examples) + +```js +const handlerA = () => "A"; +const handlerB = () => "B"; + +const fx = createEffect(handlerA); + +console.log(fx.use.getCurrent() === handlerA); +// => true + +fx.use(handlerB); +console.log(fx.use.getCurrent() === handlerB); +// => true +``` + +[Try it](https://share.effector.dev/CM6hgtOM) + +## `.watch(watcher)` (#methods-watch-watcher) + +Subscribe to effect calls. + +### Formulae (#methods-watch-watcher-formulae) + +```ts +const unwatch = effect.watch(watcher); +``` + +- Call `watcher` on each `effect` call, pass payload of `effect` as argument to `watcher` +- When `unwatch` is called, stop calling `watcher` + +### Arguments (#methods-watch-watcher-arguments) + +1. `watcher` ([_Watcher_](/en/explanation/glossary#watcher)): A function that receives `payload`. + +### Returns (#methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +### Examples (#methods-watch-watcher-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((params) => params); + +fx.watch((params) => { + console.log("effect called with value", params); +}); + +await fx(10); +// => effect called with value 10 +``` + +[Try it](https://share.effector.dev/VN1ef0TZ) + +## `.prepend(fn)` (#methods-prepend-fn) + +Creates an event, upon trigger it sends transformed data into the source event. +Works kind of like reverse `.map`. +In case of `.prepend` data transforms **before the original event occurs** and in the case of `.map`, data transforms **after original event occurred**. + +### Formulae (#methods-prepend-fn-formulae) + +```ts +const event = effect.prepend(fn); +``` + +- When `event` is triggered, call `fn` with payload from `event`, then trigger `effect` with the result of `fn()` +- `event` will have `EventCallable` type, so can be used as `target` in methods like `sample()` + +### Arguments (#methods-prepend-fn-arguments) + +1. `fn` (_Function_): A function that receives `payload`, [should be **pure**](/en/explanation/glossary#purity). + +### Returns (#methods-prepend-fn-returns) + +[_Event_](/en/api/effector/Event): New event. + +## `.map(fn)` (#methods-map-fn) + +Creates a new event, which will be called after the original effect is called, applying the result of a `fn` as a payload. It is a special function which allows you to decompose dataflow, extract or transform data. + +### Formulae (#methods-map-fn-formulae) + +```ts +const second = first.map(fn); +``` + +- When `first` is triggered, pass payload from `first` to `fn` +- Trigger `second` with the result of the `fn()` call as payload +- `second` event will have `Event` type, so it CAN NOT be used as `target` in methods like `sample()` + +### Arguments (#methods-map-fn-arguments) + +1. `fn` (_Function_): A function that receives `payload`, [should be **pure**](/en/explanation/glossary#purity). + +### Returns (#methods-map-fn-returns) + +[_Event_](/en/api/effector/Event): New event. + +### Examples (#methods-map-fn-examples) + +```js +import { createEffect } from "effector"; + +const userUpdate = createEffect(({ name, role }) => { + console.log(name, role); +}); +const userNameUpdated = userUpdate.map(({ name }) => name); // you may decompose dataflow with .map() method +const userRoleUpdated = userUpdate.map(({ role }) => role.toUpperCase()); // either way you can transform data + +userNameUpdated.watch((name) => console.log(`User's name is [${name}] now`)); +userRoleUpdated.watch((role) => console.log(`User's role is [${role}] now`)); + +await userUpdate({ name: "john", role: "admin" }); +// => User's name is [john] now +// => User's role is [ADMIN] now +// => john admin +``` + +[Try it](https://share.effector.dev/MmBBKXZe) + +# Properties (#properties) + +You are not supposed to use parts of effect (like `.done` and `.pending`) as a `target` in [sample](/en/api/effector/sample) (even though they are events and stores), since effect is a complete entity on its own. This behavior will not be supported. + +In the examples below constant `effect` has this signature: + +```ts +effect: Effect; +``` + +## `.done` Event (#properties-done) + +[_Event_](/en/api/effector/Event), which is triggered when _handler_ is _resolved_. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-done-formulae) + +```ts +effect.done: Event<{ params: Params; done: Done }>; +``` + +### Properties (#properties-done-properties) + +Event triggered with an object of `params` and `result`: + +1. `params` (_Params_): An argument passed to the effect call +2. `result` (_Done_): A result of the resolved handler + +### Examples (#properties-done-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.done.watch(({ params, result }) => { + console.log("Call with params", params, "resolved with value", result); +}); + +await fx(2); +// => Call with params 2 resolved with value 3 +``` + +[Try it](https://share.effector.dev/VogsNaDn) + +## `.doneData` Event (#properties-doneData) + +:::info{title="since"} +[effector 20.12.0](https://changelog.effector.dev/#effector-20-12-0) +::: + +Event, which is triggered by the result of the effect execution. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on the effect. +::: + +### Formulae (#properties-doneData-formulae) + +```ts +effect.doneData: Event; +``` + +- `doneData` is an event, that triggered when `effect` is successfully resolved with `result` from [.done](#properties-done) + +[_Event_](/en/api/effector/Event) triggered when _handler_ is _resolved_. + +### Examples (#properties-doneData-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.doneData.watch((result) => { + console.log(`Effect was successfully resolved, returning ${result}`); +}); + +await fx(2); +// => Effect was successfully resolved, returning 3 +``` + +[Try it](https://share.effector.dev/rNesMDtw) + +## `.fail` Event (#properties-fail) + +[_Event_](/en/api/effector/Event), which is triggered when handler is rejected or throws error. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-fail-formulae) + +```ts +effect.fail: Event<{ params: Params; error: Fail }>; +``` + +### Properties (#properties-fail-properties) + +Event triggered with an object of `params` and `error`: + +1. `params` (_Params_): An argument passed to effect call +2. `error` (_Fail_): An error caught from the handler + +### Examples (#properties-fail-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.fail.watch(({ params, error }) => { + console.log("Call with params", params, "rejected with error", error.message); +}); + +fx(2); +// => Call with params 2 rejected with error 1 +``` + +[Try it](https://share.effector.dev/hCPCHQ5N) + +## `.failData` Event (#properties-failData) + +:::info{title="since"} +[effector 20.12.0](https://changelog.effector.dev/#effector-20-12-0) +::: + +Event, which is triggered with error thrown by the effect. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-failData-formulae) + +```ts +effect.failData: Event; +``` + +- `failData` is an event, that triggered when `effect` is rejected with `error` from [.fail](#properties-fail) + +[_Event_](/en/api/effector/Event) triggered when handler is rejected or throws error. + +### Examples (#properties-failData-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.failData.watch((error) => { + console.log(`Execution failed with error ${error.message}`); +}); + +fx(2); +// => Execution failed with error 1 +``` + +[Try it](https://share.effector.dev/rNU3tqEx) + +## `.finally` Event (#properties-finally) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +Event, which is triggered when handler is resolved, rejected or throws error. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Properties (#properties-finally-properties) + +```ts +type Success = { status: 'done'; params: Params; result: Done } +type Failure = { status: 'fail'; params: Params; error: Fail } + +effect.finally: Event; +``` + +### Properties (#properties-finally-properties) + +[_Event_](/en/api/effector/Event), which is triggered with an object of `status`, `params` and `error` or `result`: + +1. `status` (_string_): A status of effect (`done` or `fail`) +2. `params` (_Params_): An argument passed to effect call +3. `error` (_Fail_): An error caught from the handler +4. `result` (_Done_): A result of the resolved handler + +### Examples (#properties-finally-examples) + +```js +import { createEffect } from "effector"; + +const fetchApiFx = createEffect(async ({ time, ok }) => { + await new Promise((resolve) => setTimeout(resolve, time)); + if (ok) return `${time} ms`; + throw Error(`${time} ms`); +}); + +fetchApiFx.finally.watch((value) => { + switch (value.status) { + case "done": + console.log("Call with params", value.params, "resolved with value", value.result); + break; + case "fail": + console.log("Call with params", value.params, "rejected with error", value.error.message); + break; + } +}); + +await fetchApiFx({ time: 100, ok: true }); +// => Call with params {time: 100, ok: true} +// resolved with value 100 ms + +fetchApiFx({ time: 100, ok: false }); +// => Call with params {time: 100, ok: false} +// rejected with error 100 ms +``` + +[Try it](https://share.effector.dev/f90vETOc) + +## `.pending` Store (#properties-pending) + +Store contains `true` when effect is called but not resolved yet. Useful to show loaders. + +:::warning{title="Important"} +Do not modify store value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +### Formulae (#properties-pending-formulae) + +```ts +effect.pending: Store; +``` + +- [Store](/en/api/effector/Store) will update when `done` or `fail` are triggered +- [Store](/en/api/effector/Store) contains `true` value until the effect is resolved or rejected + +### Returns (#properties-pending-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): Store that represents current state of the effect + +### Examples (#properties-pending-examples) + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect } from "effector"; +import { useUnit } from "effector-react"; + +const fetchApiFx = createEffect((ms) => new Promise((resolve) => setTimeout(resolve, ms))); + +fetchApiFx.pending.watch(console.log); + +const Loading = () => { + const loading = useUnit(fetchApiFx.pending); + + return
    {loading ? "Loading..." : "Load complete"}
    ; +}; + +ReactDOM.render(, document.getElementById("root")); + +fetchApiFx(3000); +``` + +[Try it](https://share.effector.dev/wDMQKqhl) + +It's property is a shorthand for common use case: + +```js +import { createEffect, createStore } from "effector"; + +const fetchApiFx = createEffect(); + +// now you can use fetchApiFx.pending instead +const $isLoading = createStore(false) + .on(fetchApiFx, () => true) + .on(fetchApiFx.done, () => false) + .on(fetchApiFx.fail, () => false); +``` + +## `.inFlight` Store (#properties-inFlight) + +:::info{title="since"} +[effector 20.11.0](https://changelog.effector.dev/#effector-20-11-0) +::: + +Shows how many effect calls aren't settled yet. Useful for rate limiting. + +:::warning{title="Important"} +Do not modify `$count` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +### Formulae (#properties-inFlight-formulae) + +```ts +effect.inFlight: Store; +``` + +- The [store](/en/api/effector/Store) will be `0` if no calls of `effect` in pending state, its default state +- On each call of `effect` state in the store will be increased +- When effect resolves to any state(done or fail) state in the store will be decreased + +### Returns (#properties-inFlight-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): Store that represents count of the running effects + +### Examples (#properties-inFlight-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(() => new Promise((rs) => setTimeout(rs, 500))); + +fx.inFlight.watch((amount) => { + console.log("in-flight requests:", amount); +}); +// => 0 + +const req1 = fx(); +// => 1 + +const req2 = fx(); +// => 2 + +await Promise.all([req1, req2]); + +// => 1 +// => 0 +``` + +[Try it](https://share.effector.dev/XsM8fZXa) + +# Types (#types) + +```ts +import { type EffectParams, type EffectResult, type EffectError } from "effector"; +``` + +## `EffectParams` (#types-EffectParams) + +Allows to extract type of Params from `effect`. + +```ts +const effect: Effect; +type Params = EffectParams; +``` + +## `EffectResult` (#types-EffectResult) + +Allows to extract type of result from `effect`. + +```ts +const effect: Effect; +type Done = EffectResult; +``` + +## `EffectError` (#types-EffectError) + +Allows to extract type of error from `effect`. + +```ts +const effect: Effect; +type Fail = EffectError; +``` diff --git a/src/content/docs/en/api/effector/Event.md b/src/content/docs/en/api/effector/Event.md new file mode 100644 index 0000000..2cc25ae --- /dev/null +++ b/src/content/docs/en/api/effector/Event.md @@ -0,0 +1,893 @@ +--- +title: Event +keywords: + - event + - unit +description: Event, its methods and properties +redirectFrom: + - /api/effector/Event + - /docs/api/effector/event +--- + +```ts +import { type Event, type EventCallable } from "effector"; +``` + +The **Event** in effector represents a user action, a step in the application process, a command to execute, or an intention to make modifications, among other things. +This unit is designed to be a carrier of information/intention/state within the application, not the holder of a state. + +# `EventCallable` (#eventCallable) + +## Construction (#eventCallable-construction) + +There are many ways to create an event: + +- The most common [`createEvent`](/en/api/effector/createEvent) +- Using [Domain `createEvent`](/en/api/effector/Domain#unit-creators-createEvent-name) +- Via [Event's methods](#eventCallable-methods) and it's supertype [EventCallable's methods](#eventCallable-methods) +- Some [Effect's methods](/en/api/effector/Effect#methods) return new events and readonly events +- Operators such as: [`createApi`](/en/api/effector/createApi) + +### Declaring types (#eventCallable-declaringTypes) + +Event carries some data and in a TypeScript ecosystem each data should have a defined type. When an event is explicitly created by [`createEvent`](/en/api/effector/createEvent), type of the argument must be provided as a Generic type argument: + +```ts +import { createEvent } from "effector"; + +interface ItemAdded { + id: string; + title: string; +} + +const itemAdded = createEvent(); +``` + +In most cases, there is no reason to use `void` with another type (~~`Event`~~). Use `void` only to declare the Event or EventCallable without the argument at all. That's why it is possible to send data from an event with an argument into an event without an argument. + +```ts +sample({ + clock: withData, // Event + target: withoutData, // Event +}); +``` + +We **strongly recommend** using `null` for empty values when intended: + +```ts +import { createEvent } from "effector"; + +const maybeDataReceived = createEvent(); +// maybeDataReceived: EventCallable +``` + +[Read more in the explanation section](/en/explanation/events#typescript). + +## Call as function `event(argument)` (#eventCallable-call-argument) + +Initiates an event with the provided argument, which in turn activates any registered subscribers. + +[Read more in the explanation section](/en/explanation/events#event-calling). + +### Formulae (#eventCallable-call-argument-formulae) + +```ts +const event: EventCallable; +event(argument: T): T; +``` + +- `event` called as a function always returns its `argument` as is +- all subscribers of event receives the `argument` passed into +- when `T` is `void`, `event` can be called without arguments +- `T` by default is `void`, so generic type argument can be omitted + +:::warning{title="Important"} + +In Effector, any event supports only **a single argument**. +It is not possible to call an event with two or more arguments, as in `someEvent(first, second)`. + +All arguments beyond the first will be ignored. +The core team has implemented this rule for specific reasons related to the design and functionality. +::: + +### Arguments (#eventCallable-call-argument-arguments) + +1. `argument` is a value of `T`. It's optional if the event is defined as `EventCallable`. + +### Throws (#eventCallable-call-argument-throws) + +#### call of readonly event is not supported, use createEvent instead (#eventCallable-call-argument-throws-call-of-readonly-event) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +When user tried to call `Event`. In the most cases it happens when you tried to call derived event: + +```ts +const numberReceived = createEvent(); // EventCallable +const stringifiedReceived = numberReceived.map((number) => String(number)); // Event + +stringifiedReceived("123"); // THROWS! +``` + +The same for all methods returning `Event`. + +To fix it create separate event via `createEvent`, and connect them by `sample`: + +```ts +const numberReceived = createEvent(); +const stringifiedReceived = createEvent(); + +sample({ + clock: numberReceived, + fn: (number) => String(number), + target: stringifiedReceived, +}); + +stringifiedReceived("123"); // OK +``` + +#### unit call from pure function is not supported, use operators like sample instead (#eventCallable-call-argument-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent(); +const another = createEvent(); + +const derived = someHappened.map((number) => { + another(); // THROWS! + return String(number); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent(); +const another = createEvent(); +const derived = createEvent(); + +sample({ + clock: someHappened, + target: another, +}); + +// The same as .map(), but using `target` +sample({ + clock: someHappened, + fn: (number) => String(number), + target: derived, +}); +``` + +### Returns (#eventCallable-call-argument-returns) + +`T`: Represents the same value that is passed into the `event`. + +### Types (#eventCallable-call-argument-types) + +```ts +import { createEvent, Event } from "effector"; + +const someHappened = createEvent(); +// someHappened: EventCallable +someHappened(1); + +const anotherHappened = createEvent(); +// anotherHappened: EventCallable +anotherHappened(); +``` + +An event can be specified with a single generic type argument. By default, this argument is set to void, indicating that the event does not accept any parameters. + +## Methods (#eventCallable-methods) + +Since the `createEvent` factory creates `EventCallable` for you, its methods will be described first, even though it is a extension of the `Event` type. + +All the methods and properties from [Event](#event-methods) are also available on `EventCallable` instance. + +:::tip +You can think of the EventCallable and Event as type and its super type: + +`EventCallable extends Event` +::: + +### `.prepend(fn)` (#eventCallable-methods-prepend-fn) + +Creates a new `EventCallable`, that should be called, upon trigger it sends transformed data into the original event. + +Works kind of like reverse `.map`. In case of `.prepend` data transforms **before the original event occurs** and in the +case of `.map`, data transforms **after original event occurred**. + +If the original event belongs to some [domain](/en/api/effector/Domain), then a new event will belong to it as well. + +#### Formulae (#eventCallable-methods-prepend-fn-formulae) + +```ts +const first: EventCallable; +const second: EventCallable = first.prepend(fn); +``` + +- When `second` event is triggered +- Call `fn` with argument from the `second` event +- Trigger `first` event with the result of `fn()` + +#### Arguments (#eventCallable-methods-prepend-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and should be **pure**. + +#### Throws (#eventCallable-methods-prepend-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#eventCallable-methods-prepend-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent(); +const another = createEvent(); + +const reversed = someHappened.prepend((input: number) => { + another(input); // THROWS! + return String(input); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent(); +const another = createEvent(); +const reversed = createEvent(); + +// The same as .prepend(), but using `sample` +sample({ + clock: reversed, + fn: (input) => String(input), + target: someHappened, +}); + +sample({ + clock: reversed, + target: another, +}); +``` + +#### Returns (#eventCallable-methods-prepend-fn-returns) + +[`EventCallable`](/en/api/effector/Event): New event. + +#### Types (#eventCallable-methods-prepend-fn-types) + +There TypeScript requires explicitly setting type of the argument of `fn` function: + +```ts +import { createEvent } from "effector"; + +const original = createEvent<{ input: string }>(); + +const prepended = original.prepend((input: string) => ({ input })); +// ^^^^^^ here +``` + +Type of the `original` event argument and the resulting type of the `fn` must be the same. + +#### Examples (#eventCallable-methods-prepend-fn-examples) + +##### Basic (#eventCallable-methods-prepend-fn-examples-basic) + +```js +import { createEvent } from "effector"; + +const userPropertyChanged = createEvent(); + +userPropertyChanged.watch(({ field, value }) => { + console.log(`User property "${field}" changed to ${value}`); +}); + +const changeName = userPropertyChanged.prepend((name) => ({ + field: "name", + value: name, +})); +const changeRole = userPropertyChanged.prepend((role) => ({ + field: "role", + value: role.toUpperCase(), +})); + +changeName("john"); +// => User property "name" changed to john + +changeRole("admin"); +// => User property "role" changed to ADMIN + +changeName("alice"); +// => User property "name" changed to alice +``` + +[Try it](https://share.effector.dev/XGxlG4LD) + +##### Meaningful example (#eventCallable-methods-prepend-fn-examples-meaningful) + +You can think of this method like a wrapper function. Let's assume we have function with not ideal API, but we want to +call it frequently: + +```ts +import { sendAnalytics } from "./analytics"; + +export function reportClick(item: string) { + const argument = { type: "click", container: { items: [arg] } }; + return sendAnalytics(argument); +} +``` + +This is exactly how `.prepend()` works: + +```ts +import { sendAnalytics } from "./analytics"; + +export const reportClick = sendAnalytics.prepend((item: string) => { + return { type: "click", container: { items: [arg] } }; +}); + +reportClick("example"); +// reportClick triggered "example" +// sendAnalytics triggered { type: "click", container: { items: ["example"] } } +``` + +Check all other methods on [Event](#event-methods). + +# `Event` (#event) + +A **Event** is a super type of `EventCallable` with different approach. Firstly, invoking a Event is not +allowed, and it cannot be used as a `target` in the `sample` operator, and so on. + +The primary purpose of a Event is to be triggered by internal code withing the effector library or ecosystem. +For instance, the `.map()` method returns a Event, which is subsequently called by the `.map()` method itself. + +:::info +There is no need for user code to directly invoke such an Event. + +If you find yourself needing to call a Event, it may be necessary to reevaluate and restructure your +application's logic. +::: + +All the functionalities provided by an Event are also supported in an EventCallable. + +## Construction (#event-construction) + +There is no way to manually create Event, but some methods and operators returns derived events, they are return +`Event` type: + +- Event's methods like: [`.map(fn)`](#event-map-fn), [`.filter({fn})`](#event-methods-filterMap-fn), and so on +- Store's property: ['.updates'](/en/api/effector/Store#updates) +- Effect's [methods](/en/api/effector/Effect#effect) and [properties](/en/api/effector/Effect#properties) +- operators like: [`sample`](/en/api/effector/sample), [`merge`](/en/api/effector/merge) + +## Throws (#event-throws) + +- **Errors related to incorrect usage**: More details in specific method sections. + +## Declaring types (#event-types) + +It becomes necessary in cases where a factory or library requires an event to subscribe to its updates, ensuring proper +integration and interaction with the provided functionality: + +```ts +const event: Event; +``` + +## Methods (#event-methods) + +### `.map(fn)` (#event-methods-map-fn) + +Creates a new derived Event, which will be called after the original event is called, using the result of the fn +function as its argument. This special function enables you to break down and manage data flow, as well as extract or +transform data within your business logic model. + +#### Formulae (#event-methods-map-fn-formulae) + +```ts +const first: Event | EventCallable; +const second: Event = first.map(fn); +``` + +- When `first` is triggered, pass payload from `first` to `fn`. +- Trigger `second` with the result of the `fn()` call as payload. +- The function `fn` is invoked each time the `first` event is triggered. +- Also, the `second` event triggered each time the `first` is triggered. + +#### Arguments (#event-methods-map-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and [should be **pure**](/en/explanation/glossary#purity). + +#### Throws (#event-methods-map-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-map-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent(); +const another = createEvent(); + +const derived = someHappened.map((number) => { + another(); // THROWS! + return String(number); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent(); +const another = createEvent(); +const derived = createEvent(); + +sample({ + clock: someHappened, + target: another, +}); + +// The same as .map(), but using `target` +sample({ + clock: someHappened, + fn: (number) => String(number), + target: derived, +}); +``` + +#### Returns (#event-methods-map-fn-returns) + +[`Event`](#event): The new event. + +#### Types (#event-methods-map-fn-types) + +The resulting type of the `fn` function will be utilized to define the type of the derived event. + +```ts +import { createEvent } from "effector"; + +const first = createEvent(); +// first: Event + +const second = first.map((count) => count.toString()); +// second: Event +``` + +The `first` event can be represented as either `Event` or `Event`.
    +The `second` event will always be represented as `Event`. + +#### Examples (#event-methods-map-fn-examples) + +```js +import { createEvent } from "effector"; + +const userUpdated = createEvent(); + +// you may decompose dataflow with .map() method +const userNameUpdated = userUpdated.map(({ user }) => name); + +// either way you can transform data +const userRoleUpdated = userUpdated.map((user) => user.role.toUpperCase()); + +userNameUpdated.watch((name) => console.log(`User's name is [${name}] now`)); +userRoleUpdated.watch((role) => console.log(`User's role is [${role}] now`)); + +userUpdated({ name: "john", role: "admin" }); +// => User's name is [john] now +// => User's role is [ADMIN] now +``` + +[Try it](https://share.effector.dev/duDut6nR) + +### `.filter({ fn })` (#event-methods-filter-fn) + +This method generates a new derived Event that will be invoked after the original event, but only if the `fn` +function returns `true`. This special function enables you to break down data flow into a branches and +subscribe on them within the business logic model. + +:::tip +[sample](/en/api/effector/sample) operator with `filter` argument is the preferred filtering method. +::: + +#### Formulae (#event-methods-filter-fn-formulae) + +```ts +const first: Event | EventCallable; +const second: Event = first.filter({ fn }); +``` + +- When `first` is triggered, pass payload from `first` to `fn`. +- The `second` event will be triggered only if `fn` returns `true`, with the argument from `first` event. +- The function `fn` is invoked each time the `first` event is triggered. +- Also, the `second` event triggered each time the `first` is triggered, **and** the `fn` returned `true`. + +#### Arguments (#event-methods-filter-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and [should be **pure**](/en/explanation/glossary#purity). + +:::info{title="Note"} +Here, due to legacy restrictions `fn` is required to use object form because `event.filter(fn)` was an alias +for [Event filterMap](/en/api/effector/Event#event-methods-filterMap-fn). + +Use it always like this `.filter({ fn })`. +::: + +#### Throws (#event-methods-filter-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-filter-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like guards: + +```ts +const countReceived = createEvent(); +const eachReceived = createEvent(); + +const receivedEven = someHappened.filter({ + fn(count) { + eachReceived(count); // THROWS! + return count % 2 === 0; + }, +}); +``` + +To fix this, use `sample` to call `eachReceived`: + +```ts +const countReceived = createEvent(); +const eachReceived = createEvent(); + +const receivedEven = someHappened.filter({ + fn(count) { + return count % 2 === 0; + }, +}); + +sample({ + clock: someHappened, + target: eachReceived, +}); +``` + +#### Returns (#event-methods-filter-fn-returns) + +[`Event`](#event): The new event + +#### Types (#event-methods-filter-fn-types) + +Method `.filter()` always returns Event. Also this event will have the same type as the original type: + +```ts +import { createEvent } from "effector"; + +const numberReceived = createEvent(); +// numberReceived: Event + +const evenReceived = numberReceived.filter({ + fn: (number) => number % 2 === 0, +}); +// evenReceived: Event + +evenReceived.watch(console.info); +numberReceived(5); // nothing +numberReceived(2); // => 2 +``` + +#### Examples (#event-methods-filter-fn-examples) + +```js +import { createEvent, createStore } from "effector"; + +const numbers = createEvent(); +const positiveNumbers = numbers.filter({ + fn: ({ x }) => x > 0, +}); + +const $lastPositive = createStore(0).on(positiveNumbers, (n, { x }) => x); + +$lastPositive.watch((x) => { + console.log("last positive:", x); +}); + +// => last positive: 0 + +numbers({ x: 0 }); +// no reaction + +numbers({ x: -10 }); +// no reaction + +numbers({ x: 10 }); +// => last positive: 10 +``` + +[Try it](https://share.effector.dev/H2Iu4iJH) + +#### Meaningful example (#event-methods-filter-fn-examples-meaningful) + +Let's assume a standard situation when you want to buy sneakers in the shop, but there is no size. You subscribe to the +particular size of the sneakers' model, and in addition, you want to receive a notification if they have it, and ignore +any other notification. Therefore, filtering can be helpful for that. Event filtering works in the same way. If `filter` +returns `true`, the event will be called. + +```ts +const sneackersReceived = createEvent(); +const uniqueSizeReceived = sneackersReceived.filter({ + fn: (sneackers) => sneackers.size === 48, +}); +``` + +### `.filterMap(fn)` (#event-methods-filterMap-fn) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +This methods generates a new derived Event that **may be invoked** after the original event, but with the +transformed argument. This special method enabled you to simultaneously transform data and filter out trigger of the +event. + +This method looks like the `.filter()` and `.map()` merged in the one. That's it. The reason for creating was an +impossibility for event filtering. + +This method is mostly useful with JavaScript APIs whose returns `undefined` sometimes. + +#### Formulae (#event-methods-filterMap-fn-formulae) + +```ts +const first: Event | EventCallable; +const second: Event = first.filterMap(fn); +``` + +- When `first` is triggered, call `fn` with payload from `first` +- If `fn()` returned `undefined` do not trigger `second` +- If `fn()` returned some data, trigger `second` with data from `fn()` + +#### Arguments (#event-methods-filterMap-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, [should be **pure**](/en/explanation/glossary#purity). + +The `fn` function should return some data. When `undefined` is returned, the update of derived event will be skipped. + +#### Throws (#event-methods-filterMap-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-filterMap-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const countReceived = createEvent(); +const eachReceived = createEvent(); + +const receivedEven = someHappened.filterMap((count) => { + eachReceived(count); // THROWS! + return count % 2 === 0 ? Math.abs(count) : undefined; +}); +``` + +To fix this, use `sample` to call `eachReceived`: + +```ts +const countReceived = createEvent(); +const eachReceived = createEvent(); + +const receivedEven = someHappened.filterMap((count) => { + return count % 2 === 0 ? Math.abs(count) : undefined; +}); + +sample({ + clock: someHappened, + target: eachReceived, +}); +``` + +#### Returns (#event-methods-filterMap-fn-returns) + +[`Event`](#event): The new event + +#### Types (#event-methods-filterMap-fn-types) + +The type for the derived event is automatically inferred from the `fn` declaration. +No need to explicitly set type for variable or generic type argument: + +```ts +import { createEvent } from "effector"; + +const first = createEvent(); +// first: Event + +const second = first.filterMap((count) => { + if (count === 0) return; + return count.toString(); +}); +// second: Event +``` + +The `first` event can be represented as either `Event` or `EventCallable`.
    +The `second` event will always be represented as `Event`. + +#### Examples (#event-methods-filterMap-fn-examples) + +```tsx +import { createEvent } from "effector"; + +const listReceived = createEvent(); + +// Array.prototype.find() returns `undefined` when no item is found +const effectorFound = listReceived.filterMap((list) => list.find((name) => name === "effector")); + +effectorFound.watch((name) => console.info("found", name)); + +listReceived(["redux", "effector", "mobx"]); // => found effector +listReceived(["redux", "mobx"]); +``` + +[Try it](https://share.effector.dev/ARDanMAM) + +#### Meaningful example (#event-methods-filterMap-fn-examples-meaningful) + +Consider a scenario where you walk into a grocery store with a specific task: you need to purchase 10 apples, but only +if they're red. If they're not red, you're out of luck. +Let's consider by steps: + +1. Take one apple; +2. Have a look, is it red(put in a pack) or not(take another). + +And you repeat this until you complete the task. Now think about it in the effector terms, and we consider the positive +case: + +1. Take an apple – event; +2. Have a look, red or no – filter; +3. You keep it – map; +4. Put in pack – event. +5. Pack – store + +### `.watch(watcher)` (#event-methods-watch-watcher) + +This method enables you to call callback on each event trigger with the argument of the event. + +:::tip{title="Keep in mind"} +The `watch` method neither handles nor reports exceptions, manages the completion of asynchronous operations, nor +addresses data race issues. + +Its primary intended use is for short-term debugging and logging purposes. +::: + +[Read more in the explanation section](/en/explanation/events#event-watch). + +#### Formulae (#event-methods-watch-watcher-formulae) + +```ts +const event: Event | EventCallable; +const unwatch: () => void = event.watch(fn); +``` + +- The `fn` will be called on each `event` trigger, passed argument of the `event` to the `fn`. +- When `unwatch` is called, stop calling `fn` on each `event` trigger. + +#### Arguments (#event-methods-watch-watcher-arguments) + +1. `watcher` ([_Watcher_](/en/explanation/glossary#watcher)): A function that receives `argument` from the event. + +#### Returns (#event-methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +#### Examples (#event-methods-watch-watcher-examples) + +```js +import { createEvent } from "effector"; + +const sayHi = createEvent(); +const unwatch = sayHi.watch((name) => console.log(`${name}, hi there!`)); + +sayHi("Peter"); // => Peter, hi there! +unwatch(); + +sayHi("Drew"); // => nothing happened +``` + +[Try it](https://share.effector.dev/9YVgCl4C) + +### `.subscribe(observer)` (#event-methods-subscribe-observer) + +This is the low-level method to integrate event with the standard `Observable` pattern. + +:::tip{title="Keep in mind"} +You don't need to use this method on your own. It is used under the hood by rendering engines or so on. +::: + +Read more: + +- https://rxjs.dev/guide/observable +- https://github.com/tc39/proposal-observable + +## Properties (#event-properties) + +These set of property is mostly set by [`effector/babel-plugin`](/en/api/effector/babel-plugin) +or [`@effector/swc-plugin`](https://github.com/effector/swc-plugin). So they are exist only when babel or SWC is used. + +### `.sid` (#event-properties-sid) + +It is an unique identifier for each event. + +It is important to note, SID is not changes on each app start, it is statically written inside your app bundle to +absolutely identify units. + +It can be useful to send events between workers or +server/browser: [examples/worker-rpc](https://github.com/effector/effector/tree/master/examples/worker-rpc). + +It has the `string | null` type. + +### `.shortName` (#event-properties-shortName) + +It is a `string` type property, contains the name of the variable event declared at. + +```ts +import { createEvent } from "effector"; + +const demo = createEvent(); +// demo.shortName === 'demo' +``` + +But reassign event to another variable changes nothing: + +```ts +const another = demo; +// another.shortName === 'demo' +``` + +### `.compositeName` (#event-properties-compositeName) + +This property contains the full internal chain of units. For example, event can be created by the domain, so the +composite name will contain a domain name inside it. + +```ts +import { createEvent, createDomain } from "effector"; + +const first = createEvent(); +const domain = createDomain(); +const second = domain.createEvent(); + +console.log(first); +// => { shortName: "first", fullName: "first", path: ["first"] } + +console.log(second); +// => { shortName: "second", fullName: "domain/second", path: ["domain", "second"] } +``` + +# Types (#types) + +```ts +import { type EventPayload } from "effector"; +``` + +## `EventPayload` (#types-EventPayload) + +Extracts type of payload from `Event` or `EventCallable`. + +```ts +const event: Event; +type Payload = EventPayload; +``` diff --git a/src/content/docs/en/api/effector/Scope.md b/src/content/docs/en/api/effector/Scope.md new file mode 100644 index 0000000..46d9a2f --- /dev/null +++ b/src/content/docs/en/api/effector/Scope.md @@ -0,0 +1,102 @@ +--- +title: Scope +redirectFrom: + - /api/effector/Scope + - /docs/api/effector/scope +--- + +```ts +import { type Scope } from "effector"; +``` + +`Scope` is a fully isolated instance of application. +The primary purpose of scope includes SSR (Server-Side Rendering) but is not limited to this use case. A `Scope` contains an independent clone of all units (including connections between them) and basic methods to access them. + +A `Scope` can be created using [fork](/en/api/effector/fork). + +## Imperative effects calls with scope (#scope-imperativeEffectCalls) + +When making imperative effect calls within effect handlers, it is supported but **not** within `watch` functions. For effect handlers that call other effects, ensure to only call effects, not common asynchronous functions. Furthermore, effect calls should be awaited: + +**✅ Correct usage for an effect without inner effects:** + +```js +const delayFx = createEffect(async () => { + await new Promise((resolve) => setTimeout(resolve, 80)); +}); +``` + +**✅ Correct usage for an effect with inner effects:** + +```js +const authUserFx = createEffect(); +const sendMessageFx = createEffect(); + +const sendWithAuthFx = createEffect(async () => { + await authUserFx(); + await delayFx(); + await sendMessageFx(); +}); +``` + +**❌ Incorrect usage for an effect with inner effects:** + +```js +const sendWithAuthFx = createEffect(async () => { + await authUserFx(); + + // Incorrect! This should be wrapped in an effect. + await new Promise((resolve) => setTimeout(resolve, 80)); + + // Context is lost here. + await sendMessageFx(); +}); +``` + +For scenarios where an effect might call another effect or perform asynchronous computations, but not both, consider utilizing the [attach](/en/api/effector/attach) method instead for more succinct imperative calls. + +# Methods (#methods) + +## `.getState($store)` (#methods-getState) + +Returns the value of a store in a given `Scope`. + +### Formulae (#methods-getState-formulae) + +```ts +const scope: Scope; +const $value: Store | StoreWritable; + +const value: T = scope.getState($value); +``` + +### Returns (#methods-getState-returns) + +`T` the value of the store + +### Examples (#methods-getState-examples) + +Create two instances of an application, trigger events in them, and test the `$counter` store value in both instances: + +```js +import { createStore, createEvent, fork, allSettled } from "effector"; + +const inc = createEvent(); +const dec = createEvent(); +const $counter = createStore(0); + +$counter.on(inc, (value) => value + 1); +$counter.on(dec, (value) => value - 1); + +const scopeA = fork(); +const scopeB = fork(); + +await allSettled(inc, { scope: scopeA }); +await allSettled(dec, { scope: scopeB }); + +console.log($counter.getState()); // => 0 +console.log(scopeA.getState($counter)); // => 1 +console.log(scopeB.getState($counter)); // => -1 +``` + +[Try it](https://share.effector.dev/0grlV3bA) diff --git a/src/content/docs/en/api/effector/Store.md b/src/content/docs/en/api/effector/Store.md new file mode 100644 index 0000000..ab7d0a0 --- /dev/null +++ b/src/content/docs/en/api/effector/Store.md @@ -0,0 +1,325 @@ +--- +title: Store +keywords: + - store + - unit +description: Store, its methods and properties +redirectFrom: + - /api/effector/Store + - /docs/api/effector/store +--- + +```ts +import { type Store, type StoreWritable } from "effector"; +``` + +_Store_ is an object that holds the state value. Store gets updates when it receives a value that is not equal (`!==`) to the current one and to `undefined`. Store is a [Unit](/en/explanation/glossary#common-unit). Some stores can be [derived](#store-derived). + +# Methods (#methods) + +## `.map(fn)` (#methods-map-fn) + +Creates a derived store. It will call a provided function with the state when the original store updates, and will use the result to update the derived store. + +### Formulae (#methods-map-fn-formulae) + +```ts +const $second = $first.map(fn); +``` + +### Arguments (#methods-map-fn-arguments) + +1. `fn` (_Function_): Function that receives `state` and returns a new state for the derived store. +2. `config` (_Object_): Optional configuration. + +### Returns (#methods-map-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store. + +### Examples (#methods-map-fn-examples) + +#### Basic (#methods-map-fn-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const changed = createEvent(); +const $title = createStore("").on(changed, (_, newTitle) => newTitle); +const $length = $title.map((title) => title.length); + +$length.watch((length) => { + console.log("new length", length); +}); + +changed("hello"); +changed("world"); +changed("hello world"); +``` + +[Try it](https://share.effector.dev/XGKGMvpF) + +#### SkipVoid (#methods-map-fn-examples-skipVoid) + +```js +const $length = $title.map((title) => title.length, { skipVoid: false }); +``` + +## `.on(trigger, reducer)` (#methods-on-trigger-reducer) + +Updates state when `trigger` is triggered by using a [reducer](/en/explanation/glossary#reducer). + +### Formulae (#methods-on-trigger-reducer-formulae) + +```ts +$store.on(trigger, reducer); +``` + +### Arguments (#methods-on-trigger-reducer-arguments) + +1. `trigger`: _Event_, _Effect_, or another _Store_. +2. `reducer`: _Reducer_: Function that receives `state` and `params` and returns a new state. + +### Returns (#methods-on-trigger-reducer-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-on-trigger-reducer-examples) + +#### Basic (#methods-on-trigger-reducer-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const $store = createStore(0); +const changed = createEvent(); + +$store.on(changed, (value, incrementor) => value + incrementor); + +$store.watch((value) => { + console.log("updated", value); +}); + +changed(2); +changed(2); +``` + +[Try it](https://share.effector.dev/O0JnDtIl) + +## `.watch(watcher)` (#methods-watch-watcher) + +Calls `watcher` function each time when the store is updated. + +### Formulae (#methods-watch-watcher-formulae) + +```ts +const unwatch = $store.watch(watcher); +``` + +### Arguments (#methods-watch-watcher-arguments) + +1. `watcher`: [_Watcher_](/en/explanation/glossary#watcher): Watcher function that receives the current store state as the first argument. + +### Returns (#methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +### Examples (#methods-watch-watcher-examples) + +#### Basic (#methods-watch-watcher-examples-basic) + +```js +const add = createEvent(); +const $store = createStore(0).on(add, (state, payload) => state + payload); + +$store.watch((value) => console.log(`current value: ${value}`)); +add(4); +add(3); +``` + +## `.reset(...triggers)` (#methods-reset-triggers) + +Resets store state to the default value. + +### Formulae (#methods-reset-triggers-formulae) + +```ts +$store.reset(...triggers); +``` + +### Arguments (#methods-reset-triggers-arguments) + +1. `triggers`: (_(Event | Effect | Store)[]_): any number of _Events_, _Effects_, or _Stores_. + +### Returns (#methods-reset-triggers-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-reset-triggers-examples) + +#### Basic (#methods-reset-triggers-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const increment = createEvent(); +const reset = createEvent(); + +const $store = createStore(0) + .on(increment, (state) => state + 1) + .reset(reset); + +$store.watch((state) => console.log("changed", state)); + +increment(); +increment(); +reset(); +``` + +[Try it](https://share.effector.dev/7W8m2Zdg) + +## `.off(trigger)` (#methods-off-trigger) + +Removes reducer for the given `trigger`. + +### Formulae (#methods-off-trigger-formulae) + +```ts +$store.off(trigger); +``` + +### Arguments (#methods-off-trigger-arguments) + +1. `trigger`: _Event_, _Effect_, or _Store_. + +### Returns (#methods-off-trigger-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-off-trigger-examples) + +#### Basic (#methods-off-trigger-examples-basic) + +```js +import { createEvent, createStore, merge } from "effector"; + +const changedA = createEvent(); +const changedB = createEvent(); + +const $store = createStore(0); +const changed = merge([changedA, changedB]); + +$store.on(changed, (state, params) => state + params); +$store.off(changed); +``` + +[Try it](https://share.effector.dev/bzdoyLHm) + +# Properties (#properties) + +## `.updates` (#properties-updates) + +### Returns (#properties-updates-returns) + +[_Event_](/en/api/effector/Event): Event that represents updates of the given store. + +### Example (#properties-updates-example) + +```js +import { createStore, is } from "effector"; + +const $clicksAmount = createStore(0); +is.event($clicksAmount.updates); + +$clicksAmount.updates.watch((amount) => { + console.log(amount); +}); +``` + +[Try it](https://share.effector.dev/F5L5kLTE) + +## `.reinit` (#properties-reinit) + +### Returns (#properties-reinit-returns) + +[_Event_](/en/api/effector/Event): Event that can reinitialize a store with a default value. + +### Example (#properties-reinit-example) + +```js +import { createStore, createEvent, sample, is } from "effector"; + +const $counter = createStore(0); +is.event($counter.reinit); + +const increment = createEvent(); + +$counter.reinit(); +console.log($counter.getState()); +``` + +[Try it](https://share.effector.dev/vtJncyYn) + +## `.shortName` (#properties-shortName) + +### Returns (#properties-shortName-returns) + +(_`string`_): ID or short name of the store. + +## `.defaultState` (#properties-defaultState) + +### Returns (#properties-defaultState-returns) + +(_`State`_): Default state of the store. + +### Example (#properties-defaultState-example) + +```ts +const $store = createStore("DEFAULT"); +console.log($store.defaultState === "DEFAULT"); +``` + +# Utility methods (#utility-methods) + +## `.getState()` (#utility-methods-getState) + +Returns the current state of the store. + +### Returns (#utility-methods-getState-returns) + +(_`State`_): Current state of the store. + +### Example (#utility-methods-getState-example) + +```js +import { createEvent, createStore } from "effector"; + +const add = createEvent(); + +const $number = createStore(0).on(add, (state, data) => state + data); + +add(2); +add(3); + +console.log($number.getState()); +``` + +[Try it](https://share.effector.dev/YrnlMuRj) + +# Readonly store (#readonly) + +TBD + +# Types (#types) + +```ts +import { type StoreValue } from "effector"; +``` + +## `StoreValue` (#types-StoreValue) + +Extracts type of `Store` or `StoreWritable` value. + +```ts +const $store: Store; +type Value = StoreValue; +``` diff --git a/src/content/docs/en/api/effector/allSettled.md b/src/content/docs/en/api/effector/allSettled.md new file mode 100644 index 0000000..9d72c77 --- /dev/null +++ b/src/content/docs/en/api/effector/allSettled.md @@ -0,0 +1,92 @@ +--- +title: allSettled +description: Call provided unit in scope and wait for finishing all the triggered effects +redirectFrom: + - /api/effector/allSettled + - /docs/api/effector/allsettled +--- + +# Methods (#methods) + +## `allSettled(unit, {scope, params?})` (#methods-allSettled-unit-scope-params) + +Calls the provided unit within the current scope and wait for all triggered effects to complete. + +### Formulae (#methods-allSettled-unit-scope-params-formulae) + +```ts +allSettled(unit: Event, {scope: Scope, params?: T}): Promise +allSettled(unit: Effect, {scope: Scope, params?: T}): Promise< + | {status: 'done'; value: Done} + | {status: 'fail'; value: Fail} +> +allSettled(unit: Store, {scope: Scope, params?: T}): Promise +``` + +### Arguments (#methods-allSettled-unit-scope-params-arguments) + +1. `unit`: [_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect) to be called +2. `scope`: [_Scope_](/en/api/effector/Scope) +3. `params`: params passed to `unit` + +:::info{title="since"} +Return value for effect is supported since [effector 21.4.0](https://changelog.effector.dev/#effector-21-4-0) +::: + +### Examples (#methods-allSettled-unit-scope-params-examples) + +:::tip{title="Contribution"} +TBD + +Please, [open PullRequest](https://github.com/effector/effector) and contribute examples for this section via "Edit this page" link below. +::: + +## `allSettled(scope)` (#methods-allSettled-scope) + +Checks the provided scope for any ongoing computations and wait for their completion. + +### Formulae (#methods-allSettled-scope-formulae) + +```ts +allSettled(scope): Promise +``` + +### Arguments (#methods-allSettled-scope-arguments) + +1. `scope`: [_Scope_](/en/api/effector/Scope) + +:::info{title="since"} +Supported since effector 22.5.0 +::: + +### Examples (#methods-allSettled-scope-examples) + +#### Usage in tests (#methods-allSettled-scope-examples-tests) + +For example, tests that validate the integration with an external reactive API + +```ts +test('integration with externalSource', async () => { + const scope = fork() + + const updated = createEvent() + + sample({ + clock: updated, + target: someOtherLogicStart, + }) + + // 1. Subscribe event to external source + const externalUpdated = scopeBind(updated, {scope}) + externalSource.listen(() => externalUpdates()) + + // 2. Trigger update of external source + externalSource.trigger() + + // 3. Wait for all triggered computations in effector's scope, even though these were not triggered by effector itself + await allSettled(scope) + + // 4. Check anything as usual + expect(...).toBe(...) +}) +``` diff --git a/src/content/docs/en/api/effector/attach.md b/src/content/docs/en/api/effector/attach.md new file mode 100644 index 0000000..3ff8218 --- /dev/null +++ b/src/content/docs/en/api/effector/attach.md @@ -0,0 +1,620 @@ +--- +title: attach +description: Wrapper for effect, which allows to map effect arguments and use data from stores. +redirectFrom: + - /api/effector/attach + - /docs/api/effector/attach +--- + +```ts +import { attach } from "effector"; +``` + +:::info{title="since"} +Available since [effector 20.13.0](https://changelog.effector.dev/#effector-20-13-0). + +Since [effector 22.4.0](https://changelog.effector.dev/#effector-encke-22-4-0), it is available to check whether effect is created via `attach` method — [is.attached](/en/api/effector/is#is-attached). +::: + +Creates new [effects](/en/api/effector/Effect) based on the other effects, [stores](/en/api/effector/Store). Allows mapping params and handling errors. + +Use cases: declarative way to pass values from stores to effects and argument preprocessing. Most useful case is `attach({ source, async effect })`. + +:::tip +The attached effects are the same first-class citizens as the regular effects made by [createEffect](/en/api/effector/createEffect). You should place them in the same files as regular effects, also you can use the same naming strategy. +::: + +# Methods (#methods) + +## `attach({effect})` (#methods-attach-effect) + +:::info{title="since"} +[effector 21.5.0](https://changelog.effector.dev/#effector-21-5-0) +::: + +Create effect which will call `effect` with params as it is. That allows creating separate effects with shared behavior. + +### Formulae (#methods-attach-effect-formulae) + +```ts +const attachedFx = attach({ effect: originalFx }); +``` + +- When `attachedFx` is triggered, then `originalFx` is triggered too +- When `originalFx` is finished (fail/done), then `attachedFx` must be finished with the same state. + +### Arguments (#methods-attach-effect-arguments) + +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect + +### Returns (#methods-attach-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-effect-types) + +```ts +const originalFx: Effect; + +const attachedFx: Effect = attach({ + effect: originalFx, +}); +``` + +In case of this simple variant of `attach`, types of `originalFx` and `attachedFx` will be the same. + +### Examples (#methods-attach-effect-examples) + +It allows to create _local_ copy of the effect, to react only on triggers emitted from the current _local_ code. + +```ts +import { createEffect, attach } from "effector"; + +const originalFx = createEffect((word: string) => { + console.info("Printed:", word); +}); + +const attachedFx = attach({ effect: originalFx }); + +originalFx.watch(() => console.log("originalFx")); +originalFx.done.watch(() => console.log("originalFx.done")); + +attachedFx.watch(() => console.log("attachedFx")); +attachedFx.done.watch(() => console.log("attachedFx.done")); + +originalFx("first"); +// => originalFx +// => Printed: first +// => originalFx.done + +attachedFx("second"); +// => attachedFx +// => originalFx +// Printed: second +// => originalFx.done +// => attachedFx.done +``` + +[Try it](https://share.effector.dev/7Uhk4XfW) + +## `attach({source, effect})` (#methods-attach-source-effect) + +Create effect which will trigger given one with values from `source` stores. + +### Formulae (#methods-attach-source-effect-formulae) + +```ts +const attachedFx = attach({ + source, + effect: originalFx, +}); +``` + +- When `attachedFx` is triggered, read data from `source`, trigger with the data `originalFx` +- When `originalFx` is finished, pass the same resolution (done/fail) into `attachedFx` and finish it + +### Arguments (#methods-attach-source-effect-arguments) + +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the second argument of `mapParams` +- `effect` ([_Effect_](/en/api/effector/Effect)): Original effect + +### Returns (#methods-attach-source-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-source-effect-types) + +:::tip +You don't need to explicitly set types for each declaration. The purpose of the following example is to provide a clear understanding. +::: + +In most userland code you will write code like this, without explicit types of the `let`/`const`: + +```ts +const originalFx = createEffect(async () => {}); +const $store = createStore(initialValue); + +const attachedFx = attach({ + source: $store, + effect: originalFx, +}); +``` + +#### Single store + +```ts +const originalFx: Effect; +const $store: Store; + +const attachedFx: Effect = attach({ + source: $store, + effect: originalFx, +}); +``` + +[Try it](https://tsplay.dev/NBJDDN) + +Types of the `source` store and `effect` params must be the same. +But the `attachedFx` will omit the type of params, it means the attached effect not requires any params at all. + +#### Shape of stores + +```ts +const originalFx: Effect<{ a: A; b: B }, Done, Fail>; +const $a: Store
    ; +const $b: Store; + +const attachedFx: Effect = attach({ + source: { a: $a, b: $b }, + effect: originalFx, +}); +``` + +[Try it](https://tsplay.dev/mbE58N) + +Types of the `source` object must be the same as `originalFx` params. But the `attachedFx` will omit the type of params, it means the attached effect not requires any params at all. + +### Examples (#methods-attach-source-effect-examples) + +```ts +const requestPageFx = createEffect<{ page: number; size: number }, string[]>( + async ({ page, size }) => { + console.log("Requested", page); + return page * size; + }, +); + +const $page = createStore(1); +const $size = createStore(20); + +const requestNextPageFx = attach({ + source: { page: $page, size: $size }, + effect: requestPageFx, +}); + +$page.on(requestNextPageFx.done, (page) => page + 1); + +requestPageFx.doneData.watch((position) => console.log("requestPageFx.doneData", position)); + +await requestNextPageFx(); +// => Requested 1 +// => requestPageFx.doneData 20 + +await requestNextPageFx(); +// => Requested 2 +// => requestPageFx.doneData 40 + +await requestNextPageFx(); +// => Requested 3 +// => requestPageFx.doneData 60 +``` + +[Try it](https://share.effector.dev/FGqlrrnw) + +## `attach({source, async effect})` (#methods-attach-source-async-effect) + +:::info{title="since"} +[effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) +::: + +Creates effect which will call async function with values from the `source` stores. + +### Formulae (#methods-attach-source-async-effect-formulae) + +```ts +const attachedFx = attach({ + source, + async effect(source, params) {}, +}); +``` + +- When `attachedFx` is triggered, read data from the `source`, call `effect` function. +- When `effect` function returns resolved `Promise`, finish `attachedFx` with the data from the function as `attachedFx.done`. +- When `effect` throws exception, or returns rejected `Promise`, finish `attachedFx` with the data from function as `attachedFx.fail`. + +### Arguments (#methods-attach-source-async-effect-arguments) + +- `effect` (_Function_): `(source: Source, params: Params) => Promise | Result` +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the first argument of `effect` + +### Returns (#methods-attach-source-async-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Usage with scope (#methods-attach-source-async-effect-scope) + +Any effects called inside `async effect` function will propagate scope. + +```ts +const outerFx = createEffect((count: number) => { + console.log("Hit", count); +}); + +const $store = createStore(0); +const attachedFx = attach({ + source: $store, + async effect(count, _: void) {}, +}); +``` + +**Scope is lost** if there are any asynchronous function calls made: + +```ts +const attachedFx = attach({ + source: $store, + async effect(source) { + // Here is ok, the effect is called + const resultA = await anotherFx(); + + // Be careful: + const resultB = await regularFunction(); + // Here scope is lost. + }, +}); +``` + +To solve this case, you need to just wrap your `regularFunction` into effect: + +```ts +const regularFunctionFx = createEffect(regularFunction); +``` + +### Types (#methods-attach-source-async-effect-types) + +#### Single store (#methods-attach-source-async-effect-types-single-store) + +```ts +const $store: Store; + +const attachedFx: Effect = attach({ + source: $store, + async effect(source, params: Params): Done | Promise {}, +}); +``` + +You need to type explicitly only `params` argument. All other types of arguments should be inferred automatically. Also, you may want to explicitly set the return type of the `effect` function. + +If you want to remove any arguments from the `attachedFx` you need to just remove second argument from `effect` function: + +```ts +const attachedFx: Effect = attach({ + source: $store, + async effect(source) {}, +}); +``` + +#### Multiple stores (#methods-attach-source-async-effect-types-multiple-stores) + +:::tip +For details review [previous section of types](#methods-attach-source-async-effect-types). Here the same logic. +::: + +```ts +// Userland example, without explicit type declarations +const $foo = createStore(100); +const $bar = createStore("demo"); + +const attachedFx = attach({ + source: { foo: $foo, bar: $bar }, + async effect({ foo, bar }, { baz }: { baz: boolean }) { + console.log("Hit!", { foo, bar, baz }); + }, +}); + +attachedFx({ baz: true }); +// => Hit! { foo: 100, bar: "demo", baz: true } +``` + +[Try it](https://tsplay.dev/m3xjbW) + +### Example (#methods-attach-source-async-effect-example) + +:::warning{title="TBD"} +Please, open pull request via "Edit this page" link. +::: + +## `attach({effect, mapParams})` (#methods-attach-effect-mapParams) + +Creates effect which will trigger given one by transforming params by `mapParams` function. + +### Formulae (#methods-attach-effect-mapParams-formulae) + +```ts +const attachedFx = attach({ + effect: originalFx, + mapParams, +}); +``` + +- When `attachedFx` triggered, payload passed into `mapParams` function, then the result of it passed into `originalFx` +- When `originalFx` is finished, then `attachedFx` must be finished with the same resolution (done/fail). +- If `mapParams` throws an exception, then `attachedFx` must be finished with the error as `attachedFx.fail`. But `originalFx` will not be triggered at all. + +### Arguments (#methods-attach-effect-mapParams-arguments) + +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect +- `mapParams` (`(newParams) => effectParams`): Function which receives new params and maps them to the params of the wrapped `effect`. Works mostly like [event.prepend](/en/api/effector/Event#prepend-fn). Errors happened in `mapParams` function will force attached effect to fail. + +### Returns (#methods-attach-effect-mapParams-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-effect-mapParams-types) + +```ts +const originalFx: Effect; + +const attachedFx: Effect = attach({ + effect: originalFx, + mapParams: (params: B): A {}, +}); +``` + +`mapParams` must return the same type `originalFx` receives as params. + +If `attachedFx` must be called without any arguments, then `params` can be safely removed from the `mapParams`: + +```ts +const attachedFx: Effect = attach({ + effect: originalFx, + mapParams: (): A {}, +}); +``` + +[Try it](https://tsplay.dev/wXOYoW) + +But if `mapParams` function throws an exception, it is on your own to check types compatibility, because of TypeScript. + +```ts +const attachedFx: Effect = attach({ + effect: originalFx, + mapParams: (): A { + throw new AnyNonFailType(); // It can be noncompatible with `Fail` type + }, +}); +``` + +### Examples (#methods-attach-effect-mapParams-examples) + +#### Map arguments (#methods-attach-effect-mapParams-examples-map-arguments) + +```ts +const originalFx = createEffect<{ input: number }, void>((a) => a); + +const attachedFx = attach({ + effect: originalFx, + mapParams(a: number) { + return { input: a * 100 }; + }, +}); + +originalFx.watch((params) => console.log("originalFx", params)); + +attachedFx(1); +// => originalFx { input: 100 } +``` + +[Try it](https://share.effector.dev/TFRlrmhm) + +#### Handle exceptions (#methods-attach-effect-mapParams-examples-handle-exceptions) + +```ts +const originalFx = createEffect<{ a: number }, void>((a) => a); + +const attachedFx = attach({ + effect: originalFx, + mapParams(a: number) { + throw new Error("custom error"); + return { a }; + }, +}); + +attachedFx.failData.watch((error) => console.log("attachedFx.failData", error)); + +attachedFx(1); +// => attachedFx.failData +// => Error: custom error +``` + +[Try it](https://share.effector.dev/VYvWQoOk) + +## `attach({source, mapParams, effect})` (#methods-attach-source-mapParams-effect) + +Creates effect which will read values from `source` stores, pass them with params to `mapParams` function and then call `effect` with the result. + +### Formulae (#methods-attach-source-mapParams-effect-formulae) + +:::tip{title="Note"} +This variant of `attach` mostly works like the [attach({effect, mapParams})](#methods-attach-effect-mapParams). The same things are omitted from this section. +::: + +```ts +const attachedFx = attach({ + source, + mapParams, + effect: originalFx, +}); +``` + +- When `attachedFx` triggered, payload passed into `mapParams` function with value from `source` store, then the result of it passed into `originalFx` +- When `originalFx` is finished, then `attachedFx` must be finished with the same resolution (done/fail). +- If `mapParams` throws an exception, then `attachedFx` must be finished with the error as `attachedFx.fail`. But `originalFx` will not be triggered at all. + +### Arguments (#methods-attach-source-mapParams-effect-arguments) + +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the second argument of `mapParams` +- `mapParams` (`(newParams, values) => effectParams`): Function which receives new params and current value of `source` and combines them to the params of the wrapped `effect`. Errors happened in `mapParams` function will force attached effect to fail +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect + +### Returns (#methods-attach-source-mapParams-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-source-mapParams-effect-types) + +:::warning{title="TBD"} +Please, open pull request via "Edit this page" link. +::: + +### Examples (#methods-attach-source-mapParams-effect-examples) + +#### With factory (#methods-attach-source-mapParams-effect-example-with-factory) + +```ts +// ./api/request.ts +import { createEffect, createStore } from "effector"; + +export const backendRequestFx = createEffect(async ({ token, data, resource }) => { + return fetch(`https://example.com/api${resource}`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(data), + }); +}); + +export const $requestsSent = createStore(0); + +$requestsSent.on(backendRequestFx, (total) => total + 1); +``` + +```ts +// ./api/authorized.ts +import { attach, createStore } from "effector"; + +const $token = createStore("guest_token"); + +export const authorizedRequestFx = attach({ + effect: backendRequestFx, + source: $token, + mapParams: ({ data, resource }, token) => ({ data, resource, token }), +}); + +export function createRequest(resource) { + return attach({ + effect: authorizedRequestFx, + mapParams: (data) => ({ data, resource }), + }); +} +``` + +```ts +// ./api/index.ts +import { createRequest } from "./authorized"; +import { $requestsSent } from "./request"; + +const getUserFx = createRequest("/user"); +const getPostsFx = createRequest("/posts"); + +$requestsSent.watch((total) => { + console.log(`client analytics: sent ${total} requests`); +}); + +const user = await getUserFx({ name: "alice" }); +/* +POST https://example.com/api/user +{"name": "alice"} +Authorization: Bearer guest_token +*/ + +// => client analytics: sent 1 requests + +const posts = await getPostsFx({ user: user.id }); +/* +POST https://example.com/api/posts +{"user": 18329} +Authorization: Bearer guest_token +*/ + +// => client analytics: sent 2 requests +``` + +To allow factory works correct, add a path to a `./api/authorized` into `factories` option for Babel plugin: + +```json5 +// .babelrc +{ + plugins: [ + [ + "effector/babel-plugin", + { + factories: ["src/path-to-your-entity/api/authorized"], + }, + ], + ], +} +``` + +## Parameters (#attach-parameters) + +`attach()` also receives extra parameters, you can use it when you need. + +### `name` (#attach-parameters-name) + +```ts +attach({ name: string }); +``` + +It allows us to explicitly set the name of the created attached effect: + +```ts +import { attach } from "effector"; + +const attachedFx = attach({ + name: "anotherUsefulName", + source: $store, + async effect(source, params: Type) { + // ... + }, +}); + +attachedFx.shortName; // "anotherUsefulName" +``` + +This parameter exists in **any variant** of the `attach`. + +### `domain` (#attach-parameters-domain) + +```ts +attach({ domain: Domain }); +``` + +It allows to create effect inside specified domain. + +> Note: this property can only be used with a plain function `effect`. + +```ts +import { createDomain, createStore, attach } from "effector"; + +const reportErrors = createDomain(); +const $counter = createStore(0); + +const attachedFx = attach({ + domain: reportErrors, + source: $counter, + async effect(counter) { + // ... + }, +}); +``` diff --git a/src/content/docs/en/api/effector/babel-plugin.md b/src/content/docs/en/api/effector/babel-plugin.md new file mode 100644 index 0000000..25762cd --- /dev/null +++ b/src/content/docs/en/api/effector/babel-plugin.md @@ -0,0 +1,370 @@ +--- +title: Babel plugin +redirectFrom: + - /api/effector/babel-plugin + - /docs/api/effector/babel-plugin +--- + +Built-in plugin for babel can be used for ssr and debugging. It inserts a name a [Unit](/en/explanation/glossary#unit), +inferred from variable name and `sid` ([Stable IDentifier](/en/explanation/sids)), computed from the location in the source code. + +For example, in case [effects without handlers](/en/api/effector/Effect#use-handler), it improves error messages by +clearly showing in which effect error happened. + +```js +import { createEffect } from "effector"; + +const fetchFx = createEffect(); + +fetchFx(); + +// => no handler used in fetchFx +``` + +[Try it](https://share.effector.dev/Yb8vQ1Ly) + +# Usage (#usage) + +In the simplest case, it can be used without any configuration: + +```json +// .babelrc +{ + "plugins": ["effector/babel-plugin"] +} +``` + +# SID (#sid) + +:::info{title="since"} +[effector 20.2.0](https://changelog.effector.dev/#effector-20-2-0) +::: + +Stable hash identifier for events, effects, stores and domains, preserved between environments, to handle client-server +interaction within the same codebase. + +The crucial value of sid is that it can be autogenerated by `effector/babel-plugin` with default config, and it will be stable between builds. + +:::tip{title="Deep dive explanation"} +If you need the detailed deep-dive explanation about why we need SIDs and how they are used internally, you can find it by [following this link](/en/explanation/sids) +::: + +See [example project](https://github.com/effector/effector/tree/master/examples/worker-rpc) + +```js +// common.js +import { createEffect } from "effector"; + +export const getUser = createEffect({ sid: "GET /user" }); +console.log(getUsers.sid); +// => GET /user +``` + +```js +// worker.js +import { getUsers } from "./common.js"; + +getUsers.use((userID) => fetch(userID)); + +getUsers.done.watch(({ result }) => { + postMessage({ sid: getUsers.sid, result }); +}); + +onmessage = async ({ data }) => { + if (data.sid !== getUsers.sid) return; + getUsers(data.userID); +}; +``` + +```js +// client.js +import { createEvent } from "effector"; +import { getUsers } from "./common.js"; + +const onMessage = createEvent(); + +const worker = new Worker("worker.js"); +worker.onmessage = onMessage; + +getUsers.use( + (userID) => + new Promise((rs) => { + worker.postMessage({ sid: getUsers.sid, userID }); + const unwatch = onMessage.watch(({ data }) => { + if (data.sid !== getUsers.sid) return; + unwatch(); + rs(data.result); + }); + }), +); +``` + +# Configuration (#configuration) + +## `importName` (#configuration-importName) + +Specifying import name or names to process by plugin. Import should be used in the code as specified. + +### Formulae (#configuration-importName-formulae) + +```json +[ + "effector/babel-plugin", + { + "importName": ["effector"] + } +] +``` + +- Type: `string | string[]` +- Default: `['effector', 'effector/compat']` + +## `factories` (#configuration-factories) + +Accepts an array of module names which exports treat as custom factories, therefore, each function call provides a unique prefix for [sids](/en/api/effector/babel-plugin#sid) of units inside them. Used to +SSR([Server Side Rendering](/en/api/effector/Scope)) and it's not required for client-only application. + +:::info{title="since"} +[effector 21.6.0](https://changelog.effector.dev/#effector-21-6-0) +::: + +### Formulae (#configuration-factories-formulae) + +```json +[ + "effector/babel-plugin", + { + "factories": ["path/here"] + } +] +``` + +- Type: `string[]` + +- Factories can have any number of arguments. +- Factories can create any number of units. +- Factories can call any effector methods. +- Factories can call other factories from other modules. +- Modules with factories can export any number of functions. +- Factories should be compiled with `effector/babel-plugin` as well as code which use them. + +### Examples (#configuration-factories-examples) + +```json +// .babelrc +{ + "plugins": [ + [ + "effector/babel-plugin", + { + "factories": ["src/createEffectStatus", "~/createCommonPending"] + } + ] + ] +} +``` + +```js +// ./src/createEffectStatus.js +import { rootDomain } from "./rootDomain"; + +export function createEffectStatus(fx) { + const $status = rootDomain.createStore("init").on(fx.finally, (_, { status }) => status); + + return $status; +} +``` + +```js +// ./src/statuses.js +import { createEffectStatus } from "./createEffectStatus"; +import { fetchUserFx, fetchFriendsFx } from "./api"; + +export const $fetchUserStatus = createEffectStatus(fetchUserFx); +export const $fetchFriendsStatus = createEffectStatus(fetchFriendsFx); +``` + +Import `createEffectStatus` from `'./createEffectStatus'` was treated as factory function, so each store created by it +has its own [sid](/en/api/effector/babel-plugin#sid) and will be handled by [serialize](/en/api/effector/serialize) +independently, although without `factories` they will share the same `sid`. + +## `reactSsr` (#configuration-reactSsr) + +Replaces imports from `effector-react` to `effector-react/scope`. Useful for building both server-side and client-side +builds from the same codebase. + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends deleting this option from `babel-plugin` configuration because [effector-react](/en/api/effector-react) supports SSR by default. +::: + +### Formulae (#configuration-reactSsr-formulae) + +```json +[ + "effector/babel-plugin", + { + "reactSsr": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `addNames` (#configuration-addNames) + +Adds name to units factories call. Useful for minification and obfuscation of production builds. + +:::info{title="since"} +[effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +### Formulae (#configuration-addNames-formulae) + +```json +[ + "effector/babel-plugin", + { + "addNames": true + } +] +``` + +- Type: `boolean` +- Default: `true` + +## `addLoc` (#configuration-addLoc) + +Adds location to methods' calls. Used by devtools, for example [effector-logger](https://github.com/effector/logger). + +### Formulae (#configuration-addLoc-formulae) + +```json +[ + "effector/babel-plugin", + { + "addLoc": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `debugSids` (#configuration-debugSids) + +Adds a file path and variable name of a unit definition to a sid. Useful for debugging SSR. + +## Formulae (#configuration-debugSids-formulae) + +```json +[ + "effector/babel-plugin", + { + "debugSids": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `noDefaults` (#configuration-noDefaults) + +Option for `effector/babel-plugin` for making custom unit factories with clean configuration. + +:::info{title="since"} +[effector 20.2.0](https://changelog.effector.dev/#effector-20-2-0) +::: + +### Formulae (#configuration-noDefaults-formulae) + +```json +[ + "effector/babel-plugin", + { + "noDefaults": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +### Examples (#configuration-noDefaults-examples) + +```json +// .babelrc +{ + "plugins": [ + ["effector/babel-plugin", { "addLoc": true }], + [ + "effector/babel-plugin", + { + "importName": "@lib/createInputField", + "storeCreators": ["createInputField"], + "noDefaults": true + }, + "createInputField" + ] + ] +} +``` + +```js +// @lib/createInputField.js +import { createStore } from "effector"; +import { resetForm } from "./form"; + +export function createInputField(defaultState, { sid, name }) { + return createStore(defaultState, { sid, name }).reset(resetForm); +} +``` + +```js +// src/state.js +import { createInputField } from "@lib/createInputField"; + +const foo = createInputField("-"); +/* + +will be treated as store creator and compiled to + +const foo = createInputField('-', { + name: 'foo', + sid: 'z&si65' +}) + +*/ +``` + +# Usage with Bundlers (#bundlers) + +## Vite + React (SSR) (#bundlers-ViteReactSSR) + +To use with `effector/babel-plugin`, you have to following next steps: + +1. Install `@vitejs/plugin-react` package. +2. `vite.config.js` should be follows: + +> Note: `effector/babel-plugin` is not a package, it is bundled with `effector` + +```js +// vite.config.js +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [ + react({ + babel: { + plugins: ["effector/babel-plugin"], + // Use .babelrc files + babelrc: true, + // Use babel.config.js files + configFile: true, + }, + }), + ], +}); +``` diff --git a/src/content/docs/en/api/effector/clearNode.md b/src/content/docs/en/api/effector/clearNode.md new file mode 100644 index 0000000..0ead7bd --- /dev/null +++ b/src/content/docs/en/api/effector/clearNode.md @@ -0,0 +1,84 @@ +--- +title: clearNode +description: Method for destroying stores, events, effects, subscriptions, and domains +redirectFrom: + - /api/effector/clearNode + - /docs/api/effector/clearnode +--- + +```ts +import { clearNode } from "effector"; +``` + +Method for destroying stores, events, effects, subscriptions, and domains. + +# Methods (#methods) + +## `clearNode(unit, config?)` (#methods-clearNode-unit-config) + +### Formulae (#methods-clearNode-unit-config-formulae) + +```ts +clearNode(unit, config?: {deep?: boolean}): void +``` + +### Arguments (#methods-clearNode-unit-config-arguments) + +1. `unit` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)/[_Domain_](/en/api/effector/Domain)/[_Scope_](/en/api/effector/Scope)): unit to be erased. +2. `config: {}` (optional): config object. + - `deep?: boolean` (optional): erase node _and_ all of its computed values. + +### Returns (#methods-clearNode-unit-config-returns) + +`void` + +### Examples (#methods-clearNode-unit-config-examples) + +#### Simple (#methods-clearNode-unit-config-examples-simple) + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const $store = createStore(0).on(inc, (x) => x + 1); + +inc.watch(() => console.log("inc called")); +$store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +inc(); +// => inc called +// => store state: 1 +clearNode($store); +inc(); +// => inc called +``` + +[Try it](https://share.effector.dev/WjuSl6aN) + +#### Deep clear (#methods-clearNode-unit-config-examples-deep) + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const trigger = inc.prepend(() => {}); +const $store = createStore(0).on(inc, (x) => x + 1); + +trigger.watch(() => console.log("trigger called")); +inc.watch(() => console.log("inc called")); +$store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +trigger(); +// => trigger called +// => inc called +// => store state: 1 +clearNode(trigger, { deep: true }); +trigger(); +// no reaction +inc(); +// no reaction! +// all units, which depend on trigger, are erased +// including inc and store, because it depends on inc +``` + +[Try it](https://share.effector.dev/EkETZtKI) diff --git a/src/content/docs/en/api/effector/combine.mdx b/src/content/docs/en/api/effector/combine.mdx new file mode 100644 index 0000000..fc94cc4 --- /dev/null +++ b/src/content/docs/en/api/effector/combine.mdx @@ -0,0 +1,167 @@ +--- +title: combine +redirectFrom: + - /api/effector/combine + - /docs/api/effector/combine +--- + +import LiveDemo from "../../../../../components/LiveDemo.jsx"; + +This method allows you to get state from each passed store and **combine** it to a single value and save into a single store, that updates every time like each passed store. + +:::warning{title="Caution"} +`combine` returns not just a common store. Instead, it returns [DerivedStore](/en/api/effector/Store#readonly), it cannot be modified by the events or used as `target` in [sample](/en/api/effector/sample). +::: + +# Methods (#methods) + +## `combine(...stores, fn)` (#methods-combine-stores-fn) + +### Formulae (#methods-combine-stores-fn-formulae) + +```ts +const $first: Store +const $second: StoreWritable +const $third: Store | StoreWritable + +$result: Store = combine( + $first, $second, $third, ..., + (first: A, second: B, third: C, ...) => result +) +``` + +- After call `combine`, state of each store is extracted and passed to function arguments, `result` of a function call will be state of store `$result` +- Any number of stores can be passed to `combine`, but the latest argument always should be function-reducer that returns new state +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Returns (#methods-combine-stores-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-stores-fn-examples) + +import demo_combineStoresFn from "./demo/_combine-stores-fn.live.js?raw"; + + + +## `combine({ A, B, C }, fn?)` (#methods-combine-object-fn) + +:::info +Formerly known as `createStoreObject` +::: + +### Formulae (#methods-combine-object-fn-formulae) + +```ts +const $first: Store; +const $second: StoreWritable; +const $third: Store | StoreWritable; + +$result: Store<{ a: A; b: B; c: C }> = combine({ a: $first, b: $second, c: $third }); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to properties `a`, `b`, `c` accordingly, that object will be saved to `$result` store +- Store `$result` contain object `{a, b, c}` and will be updated on each update of passed stores +- If several stores updated at the same time (during one tick) there will be single update of `$result` store + +### Formulae with `fn` (#methods-combine-object-fn-formulae-fn) + +```ts +const $first: Store; +const $second: StoreWritable; +const $third: Store | StoreWritable; + +$result: Store = combine( + { a: $first, b: $second, c: $third }, + ({ a, b, c }: { a: A; b: B; c: C }): D => result, +); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to properties `a`, `b`, `c` accordingly, calls function with that object +- The `result` of the function call saved in `$result` store +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Returns (#methods-combine-object-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-object-fn-examples) + +import demo_combineObjectFn from "./demo/_combine-object-fn.live.js?raw"; + + + +## `combine([A, B, C], fn?)` (#methods-combine-array-fn) + +### Formulae (#methods-combine-array-fn-formulae) + +```ts +const $first: Store; +const $second: StoreWritable; +const $third: Store | StoreWritable; + +$result: Store = combine([$first, $second, $third], ([A, B, C]): D => result); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to array with the same order as passed stores, call function with that array +- The `result` of the function call saved in `$result` store +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Formulae without `fn` (#methods-combine-array-fn-formulae-no-fn) + +```ts +const $first: Store; +const $second: StoreWritable; +const $third: Store | StoreWritable; + +$result: Store<[A, B, C]> = combine([$first, $second, $third]); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to array with the same order as passed stores, that array will be saved to `$result` store +- Store `$result` will be updated on each update of passed stores +- If several stores updated at the same time (during one tick) there will be single update of `$result` store + +### Returns (#methods-combine-array-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-array-fn-examples) + +import demo_combineArrayFn from "./demo/_combine-array-fn.live.js?raw"; + + + +## `combine` with primitives and objects (#methods-combine-primitives-objects) + +It works the same as before. Now primitives and objects can be used in `combine`, and `combine` will not be triggered. Effector will not track mutations of objects and primitives. + +### Examples (#methods-combine-primitives-objects-examples) + +import demo_combineNonStoresFn from "./demo/_combine-non-stores-fn.live.js?raw"; + + + +# Parameters (#parameters) + +All overloads of `combine` with `fn` provided are also supporting optional configuration object as the last parameter. + +## `.skipVoid` (#parameters-skipVoid) + +Flag to control how specifically store should handle `undefined` value _(since `effector 23.0.0`)_. If set to `false` - store will use `undefined` as a value. If set to `true` (deprecated), store will read `undefined` as a "skip update" command and will do nothing + +### Formulae (#parameters-skipVoid-formulae) + +```ts +combine($a, $b, callback, { skipVoid: true }); +``` + +- Type: `boolean` + +### Examples (#parameters-skipVoid-examples) + +```js +const $withFn = combine($a, $b, (a, b) => a || b, { skipVoid: false }); +``` diff --git a/src/content/docs/en/api/effector/createApi.md b/src/content/docs/en/api/effector/createApi.md new file mode 100644 index 0000000..a1c76d5 --- /dev/null +++ b/src/content/docs/en/api/effector/createApi.md @@ -0,0 +1,57 @@ +--- +title: createApi +redirectFrom: + - /api/effector/createApi + - /docs/api/effector/createApi +--- + +```ts +import { createApi } from "effector"; +``` + +`createApi` is a shortcut for generating [events](/en/api/effector/Event) connected to a [store](/en/api/effector/Store) by supplying an object with [_reducers_](/en/explanation/glossary#reducer) for these events. If the source `store` is part of a [domain](/en/api/effector/Domain), then the newly created events will also be within that domain. + +# Methods (#methods) + +## `createApi(store, api)` (#methods-createApi-store-api) + +### Formulae (#methods-createApi-store-api-formulae) + +```ts +createApi(store, api): objectWithEvents +``` + +### Arguments (#methods-createApi-store-api-arguments) + +1. `store` [_Store_](/en/api/effector/Store) +2. `api` (_Object_) An object with [_reducers_](/en/explanation/glossary#reducer) + +### Returns (#methods-createApi-store-api-returns) + +(_Object_) An object with [events](/en/api/effector/Event) + +### Examples (#methods-createApi-store-api-examples) + +```js +import { createStore, createApi } from "effector"; + +const $playerPosition = createStore(0); + +// Creating events and attaching them to the store +const api = createApi($playerPosition, { + moveLeft: (pos, offset) => pos - offset, + moveRight: (pos, offset) => pos + offset, +}); + +$playerPosition.watch((pos) => { + console.log("position", pos); +}); +// => position 0 + +api.moveRight(10); +// => position 10 +api.moveLeft(5); +// => position 5 +``` + +[Try it](https://share.effector.dev/SjVy8dzF) diff --git a/src/content/docs/en/api/effector/createDomain.md b/src/content/docs/en/api/effector/createDomain.md new file mode 100644 index 0000000..709e2fc --- /dev/null +++ b/src/content/docs/en/api/effector/createDomain.md @@ -0,0 +1,47 @@ +--- +title: createDomain +description: createDomain is a method for creating a domain +redirectFrom: + - /api/effector/createDomain + - /docs/api/effector/createDomain +--- + +```ts +import { createDomain, type Domain } from "effector"; +``` + +# Methods (#methods) + +## `createDomain(name?)` (#methods-createDomain-name) + +Creates a [domain](/en/api/effector/Domain) + +### Formulae (#methods-createDomain-name-formulae) + +```typescript +createDomain(name?): Domain +``` + +### Arguments (#methods-createDomain-name-arguments) + +1. `name`? (_string_): domain name. Useful for debugging + +### Returns (#methods-createDomain-name-returns) + +[_Domain_](/en/api/effector/Domain): New domain + +### Examples (#methods-createDomain-name-examples) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); // Unnamed domain +const httpDomain = createDomain("http"); // Named domain + +const statusCodeChanged = httpDomain.createEvent(); +const downloadFx = httpDomain.createEffect(); +const apiDomain = httpDomain.createDomain(); // nested domain +const $data = httpDomain.createStore({ status: -1 }); +``` + +[Try it](https://share.effector.dev/GMpjINHa) diff --git a/src/content/docs/en/api/effector/createEffect.md b/src/content/docs/en/api/effector/createEffect.md new file mode 100644 index 0000000..94d8ffd --- /dev/null +++ b/src/content/docs/en/api/effector/createEffect.md @@ -0,0 +1,187 @@ +--- +title: createEffect +description: Method for creating an effect +redirectFrom: + - /api/effector/createEffect + - /docs/api/effector/createEffect +--- + +```ts +import { createEffect, type Effect } from "effector"; +``` + +Method for creating an [effect](/en/api/effector/Effect). + +# Methods (#methods) + +## `createEffect(handler)` (#methods-createEffect-handler) + +Creates an effect with the given handler. + +### Formulae (#methods-createEffect-handler-formulae) + +```typescript +createEffect(handler?): Effect +``` + +### Arguments (#methods-createEffect-handler-arguments) + +1. `handler` (_Function_): Function to handle effect calls, can also be set using [`.use(handler)`](/en/api/effector/Effect#methods-use-handler). + +### Returns (#methods-createEffect-handler-returns) + +[_Effect_](/en/api/effector/Effect): A new effect. + +:::tip{title="Reminder"} +You must provide a handler either in [`createEffect`](/en/api/effector/createEffect) or in [`.use`](/en/api/effector/Effect#methods-use-handler) method later; otherwise, the effect will throw with the `no handler used in _%effect name%_` error. +::: + +:::info{title="since"} +[effector 21.3.0](https://changelog.effector.dev/#effector-21-3-0) +::: + +### Examples (#methods-createEffect-handler-examples) + +#### Create effect with handler (#methods-createEffect-handler-examples-create-effect-with-handler) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(result); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/7K23rdej) + +#### Change state on effect completion (#methods-createEffect-handler-examples-change-state-on-effect-completion) + +```js +import { createStore, createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +const $repos = createStore([]).on(fetchUserReposFx.doneData, (_, repos) => repos); + +$repos.watch((repos) => { + console.log(`${repos.length} repos`); +}); +// => 0 repos + +await fetchUserReposFx({ name: "zerobias" }); +// => 26 repos +``` + +[Try it](https://share.effector.dev/uAJFC1XM) + +#### Set handler to effect after creating (#methods-createEffect-handler-examples-set-handler-to-effect-after-creating) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(); + +fetchUserReposFx.use(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/e1QPH9Uq) + +#### Watch effect status (#methods-createEffect-handler-examples-watch-effect-status) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.pending.watch((pending) => { + console.log(`effect is pending?: ${pending ? "yes" : "no"}`); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(params); // {name: 'zerobias'} + console.log(result); // resolved value +}); + +fetchUserReposFx.fail.watch(({ params, error }) => { + console.error(params); // {name: 'zerobias'} + console.error(error); // rejected value +}); + +fetchUserReposFx.finally.watch(({ params, status, result, error }) => { + console.log(params); // {name: 'zerobias'} + console.log(`handler status: ${status}`); + + if (error) { + console.error("handler rejected", error); + } else { + console.log("handler resolved", result); + } +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/LeurvtYA) + +## `createEffect(config)` (#methods-createEffect-config) + +Creates an effect with handler and name from a given config object. + +### Formulae (#methods-createEffect-config-formulae) + +```typescript +createEffect({ handler, name }): Effect +``` + +### Arguments (#methods-createEffect-config-arguments) + +1. `config?: {}` (_Object_): Effect configuration. + - `handler` (_Function_): Function to handle effect calls, can also be set using [`.use(handler)`](#use). + - `name?` (_string_): Optional effect name. + +### Returns (#methods-createEffect-config-returns) + +[_Effect_](/en/api/effector/Effect): A new effect. + +### Examples (#methods-createEffect-config-examples) + +#### Create named effect (#methods-createEffect-config-examples-create-named-effect) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect({ + name: "fetch user repositories", + async handler({ name }) { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); + }, +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/GynSzKee) diff --git a/src/content/docs/en/api/effector/createEvent.md b/src/content/docs/en/api/effector/createEvent.md new file mode 100644 index 0000000..4a13017 --- /dev/null +++ b/src/content/docs/en/api/effector/createEvent.md @@ -0,0 +1,95 @@ +--- +title: createEvent +description: createEvent is a method for creating an event +redirectFrom: + - /api/effector/createEvent + - /docs/api/effector/createEvent +--- + +```ts +import { createEvent } from "effector"; +``` + +# Methods (#methods) + +## `createEvent(name?)` (#methods-createEvent-name) + +Method for creating an [event](/en/api/effector/Event). + +### Formulae (#methods-createEvent-name-formulae) + +```ts +createEvent(name?): Event +createEvent(name?): Event +``` + +### Arguments (#methods-createEvent-name-arguments) + +1. `name`? (_string_): Event name + +### Returns (#methods-createEvent-name-returns) + +[_EventCallable_](/en/api/effector/Event#eventCallable): New event + +### Notes (#methods-createEvent-name-notes) + +[Event](/en/api/effector/Event) – it is a function which allows to change state when called (see [simple example](#methods-createEvent-name-examples-simple)) also it can be a good way to extract data (see [map and watch example](#methods-createEvent-name-examples-map-watch)). Also, it allows us to send data to another event or effect via effector operators. + +### Examples (#methods-createEvent-name-examples) + +#### Simple (#methods-createEvent-name-examples-simple) + +```js +import { createStore, createEvent } from "effector"; + +const incrementBy = createEvent(); +const resetCounter = createEvent(); +const $counter = createStore(0); + +$counter.on(incrementBy, (counter, number) => counter + number).reset(resetCounter); + +$counter.watch((counter) => { + console.log("counter is now", counter); +}); +// => counter is now 0 + +incrementBy(10); +// => counter is now 10 + +incrementBy(10); +// => counter is now 20 + +incrementBy(10); +// => counter is now 30 + +resetCounter(); +// => counter is now 0 +``` + +[Try it](https://share.effector.dev/oFkPG4yJ) + +We created a store `$counter` and an event `incrementBy`, and started watching the store.
    +Notice the function call `incrementBy(10)`. Whenever you will call `incrementBy(10)`, you can look at the console and see how state of `$counter` changes. + +#### Using `.map` and `.watch` (#methods-createEvent-name-examples-map-watch) + +```js +import { createEvent } from "effector"; + +const fullNameReceived = createEvent(); + +const firstNameReceived = fullNameReceived.map((fullName) => fullName.split(" ")[0]); +const lastNameReceived = fullNameReceived.map((fullName) => fullName.split(" ")[1]); +const firstNameUppercaseReceived = firstNameReceived.map((firstName) => firstName.toUpperCase()); + +firstNameReceived.watch((firstName) => console.log("First name", firstName)); +lastNameReceived.watch((lastName) => console.log("Last name", lastName)); +firstNameUppercaseReceived.watch((firstName) => console.log("Upper case", firstName)); + +fullNameReceived("John Doe"); +// => First name John +// => Last name Doe +// => Upper case JOHN +``` + +[Try it](https://share.effector.dev/TJWghQ2z) diff --git a/src/content/docs/en/api/effector/createStore.md b/src/content/docs/en/api/effector/createStore.md new file mode 100644 index 0000000..2d29eff --- /dev/null +++ b/src/content/docs/en/api/effector/createStore.md @@ -0,0 +1,265 @@ +--- +title: createStore +description: createStore is a method for creating a store +redirectFrom: + - /api/effector/createStore + - /docs/api/effector/createStore +--- + +```ts +import { createStore, type Store, type StoreWritable } from "effector"; +``` + +# Methods (#methods) + +## `createStore(defaultState)` (#methods-createStore-defaultState) + +Method for creating a [store](/en/api/effector/Store). + +### Formulae (#methods-createStore-defaultState-formulae) + +```ts +createStore(defaultState: T): StoreWritable +``` + +### Arguments (#methods-createStore-defaultState-arguments) + +1. `defaultState` (_State_): Default state + +### Throws (#methods-createStore-defaultState-throws) + +#### unit call from pure function is not supported, use operators like sample instead (#methods-createStore-defaultState-throws-unit-call-from-pure) + +> Since: effector 23.0.0 + +Occurs when events or effects are called from [pure functions](/en/explanation/glossary#purity), like updateFilter: + +```ts +const someHappened = createEvent(); +const $counter = createStore(0, { + updateFilter(a, b) { + someHappened(a); // THROWS! + return a < b; + }, +}); +``` + +To resolve this, use `sample`: + +```ts +const someHappened = createEvent(); +const $counter = createStore(0, { + updateFilter(a, b) { + return a < b; + }, +}); + +sample({ + clock: $counter, + target: someHappened, +}); +``` + +### Returns (#methods-createStore-defaultState-returns) + +[_Store_](/en/api/effector/Store): New store + +### Examples (#methods-createStore-defaultState-examples) + +#### Basic (#methods-createStore-defaultState-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const addTodo = createEvent(); +const clearTodoList = createEvent(); + +const $todos = createStore([]) + // Will update store when addTodo is fired + .on(addTodo, (list, todo) => [...list, todo]) + // Will reset store to default state when clearTodos is fired + .reset(clearTodoList); + +// Create mapped store +const $selectedTodos = $todos.map((todos) => { + return todos.filter((todo) => todo.selected); +}); + +// Log initial store value and each change +$todos.watch((todos) => { + console.log("todos", todos); +}); +// => todos [] + +addTodo("go shopping"); +// => todos ['go shopping'] + +addTodo("go to the gym"); +// => todos ['go shopping', 'go to the gym'] + +clearTodoList(); +// => todos [] +``` + +[Try it](https://share.effector.dev/MNibrAFC) + +## `createStore(defaultState, config)` (#methods-createStore-defaultState-config) + +Method for creating a [store](/en/api/effector/Store) but with configuration. + +### Formulae (#methods-createStore-defaultState-config-formulae) + +```ts +createStore(defaultState: T, config: { + name?: string + updateFilter?: (update: T, current: T) => boolean + skipVoid?: boolean + serialize?: 'ignore' | { + write: (state: State) => SerializedState + read: (json: SerializedState) => State + } +}): StoreWritable +``` + +### Arguments (#methods-createStore-defaultState-config-arguments) + +1. `defaultState` (_State_): Default state +2. `config` (_Object_): Optional configuration + - `name` (_String_): Name for the store. Babel plugin can set it from the variable name, if not passed explicitly in config. + - `updateFilter` (_Function_): Function that prevents store from updating when it returns `false`. Accepts updated state as the first argument and current state as the second argument. Redundant for most cases since store already ensures that update is not `undefined` and not equal (`!==`) to current state _(since `effector 21.8.0`)_ + - `serialize: 'ignore'`: Option to disable store serialization when [serialize](/en/api/effector/serialize) is called _(since `effector 22.0.0`)_ + - `serialize` (_Object_): Configuration object to handle store state serialization in custom way. `write` – called on [serialize](/en/api/effector/serialize), transforms value to JSON value – primitive type or plain object/array. `read` – parse store state from JSON value, called on [fork](/en/api/effector/fork), if provided `values` is the result of `serialize` call. + - `domain`: (_Domain_): Domain to attach store to after creation. + - `skipVoid`: (_boolean_): Flag to control how specifically store should handle `undefined` value _(since `effector 23.0.0`)_. If set to `false` - store will use `undefined` as a value. If set to `true` (deprecated), store will interpret `undefined` as a "skip update" command and will do nothing. + +### Throws (#methods-createStore-defaultState-config-throws) + +The same behaviour like for regular [`createStore(defaultState)`](#methods-createStore-defaultState-throws). + +### Returns (#methods-createStore-defaultState-config-returns) + +[_Store_](/en/api/effector/Store): New store + +### Examples (#methods-createStore-defaultState-config-examples) + +#### With `updateFilter` (#methods-createStore-defaultState-examples-updateFilter) + +```js +import { createEvent, createStore, sample } from "effector"; + +const punch = createEvent(); +const veryStrongHit = createEvent(); + +const $lastPunchStrength = createStore(0, { + // If store should be updated with strength less than 400 kg + // update will be skipped + updateFilter: (strength) => strength >= 400, +}); + +$lastPunchStrength.on(punch, (_, strength) => strength); + +// Each store update should trigger event `veryStrongHit` +sample({ clock: $lastPunchStrength, target: veryStrongHit }); + +// Watch on store prints initial state +$lastPunchStrength.watch((strength) => console.log("Strength: %skg", strength)); +// => Strength: 0kg + +veryStrongHit.watch((strength) => { + console.log("Wooow! It was very strong! %skg", strength); +}); + +punch(200); // updateFilter prevented update +punch(300); // Same here, store doesn't update, value remains `0` +punch(500); // Yeeah! updateFilter allows store update +// => Strength: 500kg +// => Wooow! It was very strong! 500kg +punch(100); // No update as well +``` + +[Try it](https://share.effector.dev/rtxfqObf) + +#### With `serialize: ignore` (#methods-createStore-defaultState-examples-serializeIgnore) + +```js +import { createEvent, createStore, serialize, fork, allSettled } from "effector"; + +const readPackage = createEvent(); + +const $name = createStore(""); +const $version = createStore(0, { serialize: "ignore" }); + +$name.on(readPackage, (_, { name }) => name); +$version.on(readPackage, (_, { version }) => version); + +// Watchers always called for scoped changes +$name.watch((name) => console.log("name '%s'", name)); +$version.watch((version) => console.log("version %s", version)); +// => name '' +// => version 0 + +// Please, note, `fork()` call doesn't trigger watches +// In the opposit of `hydrate()` call +const scope = fork(); + +// By default serialize saves value only for the changed stores +// Review `onlyChanges` option https://effector.dev/api/effector/serialize +const values = serialize(scope); +console.log(values); +// => {} + +// Let's change our stores +await allSettled(readPackage, { + scope, + params: { name: "effector", version: 22 }, +}); +// => name 'effector' +// => version 22 + +const actualValues = serialize(scope); +console.log(actualValues); +// => {n74m6b: "effector"} +// `$version` store has `serialize: ignore`, so it's not included +``` + +[Try it](https://share.effector.dev/aLKAHDOM) + +#### Custom `serialize` configuration (#methods-createStore-defaultState-examples-customSerialize) + +```ts +import { createEvent, createStore, serialize, fork, allSettled } from "effector"; + +const saveDate = createEvent(); +const $date = createStore(null, { + // Date object is automatically serialized to ISO date string by JSON.stringify + // but it is not parsed to Date object by JSON.parse + // which will lead to a mismatch during server side rendering + // + // Custom `serialize` config solves this issue + serialize: { + write: (dateOrNull) => (dateOrNull ? dateOrNull.toISOString() : dateOrNull), + read: (isoStringOrNull) => (isoStringOrNull ? new Date(isoStringOrNull) : isoStringOrNull), + }, +}).on(saveDate, (_, p) => p); + +const serverScope = fork(); + +await allSettled(saveDate, { scope: serverScope, params: new Date() }); + +const serverValues = serialize(serverScope); +// `serialize.write` of `$date` store is called + +console.log(serverValues); +// => { nq1e2rb: "2022-11-05T15:38:53.108Z" } +// Date object saved as ISO string + +const clientScope = fork({ values: serverValues }); +// `serialize.read` of `$date` store is called + +const currentValue = clientScope.getState($date); +console.log(currentValue); +// => Date 11/5/2022, 10:40:13 PM +// ISO date string is parsed back to Date object +``` + +[Try it](https://share.effector.dev/YFkUlqPv) diff --git a/src/content/docs/en/api/effector/createWatch.md b/src/content/docs/en/api/effector/createWatch.md new file mode 100644 index 0000000..91cf84c --- /dev/null +++ b/src/content/docs/en/api/effector/createWatch.md @@ -0,0 +1,68 @@ +--- +title: createWatch +redirectFrom: + - /docs/api/effector/createwatch +--- + +```ts +import { createWatch } from "effector"; +``` + +# Methods (#methods) + +## `createWatch(config)` (#methods-createWatch-config) + +Creates a subscription on unit (store, event, or effect). + +### Formulae (#methods-createWatch-config-formulae) + +```ts +createWatch(config: { + unit: Unit + fn: (payload: T) => void + scope?: Scope +}): Subscription +``` + +### Arguments (#methods-createWatch-config-arguments) + +1. `config` (_Object_): Configuration + - `unit` (_Unit_): Target unit (store, event of effect) that will be watched + - `fn` (_Function_): Function that will be called when the unit is triggered. Accepts the unit's payload as the first argument. + - `scope` ([_Scope_](/en/api/effector/Scope)): An optional scope object (forked instance) to restrict watcher calls on particular scope. + +### Returns (#methods-createWatch-config-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function + +### Examples (#methods-createWatch-config-examples) + +#### With scope (#methods-createWatch-config-examples-scope) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, scope, fn: console.log }); + +await allSettled(changeName, { scope, params: "John" }); // output: John +changeName("John"); // no output +``` + +#### Without scope (#methods-createWatch-config-examples-no-scope) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, fn: console.log }); + +await allSettled(changeName, { scope, params: "John" }); // output: John +changeName("John"); // output: John +``` diff --git a/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js new file mode 100644 index 0000000..293ac80 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js @@ -0,0 +1,11 @@ +import { createStore, combine } from "effector"; + +const $r = createStore(255); +const $g = createStore(0); +const $b = createStore(255); + +const $color = combine([$r, $g, $b]); +$color.watch(console.log); // => [255, 0, 255] + +const $sum = combine([$r, $g, $b], ([r, g, b]) => r + g + b); +$sum.watch(console.log); // => 510 diff --git a/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js new file mode 100644 index 0000000..88d2818 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js @@ -0,0 +1,22 @@ +import { createStore, combine } from "effector"; + +const $a = createStore("a"); +const b = 2; +const c = [false]; +const d = { value: 1 }; + +const $resultUsingComa = combine($a, b, c, d); +const $resultUsingArray = combine([$a, b, c, d]); +const $resultUsingObject = combine({ $a, b, c, d }); + +const $withFn = combine($a, b, c, d, (a, b) => ({ a, b })); + +$resultUsingComa.watch(console.log); // => ["a", 2, [false], {value: 1}] +$resultUsingArray.watch(console.log); // => ["a", 2, [false], {value: 1}] +$resultUsingObject.watch(console.log); // => {$a: "a", b: 2, c: [false], d: {value: 1}} +$withFn.watch(console.log); // => {a: "a", b: 2} + +// will not trigger combine, but object and array will be changed because of reference +// uncomment the code below to see changes +// c.push(true) +// d.value = 2 diff --git a/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js new file mode 100644 index 0000000..d46156a --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js @@ -0,0 +1,11 @@ +import { createStore, combine } from "effector"; + +const $r = createStore(255); +const $g = createStore(0); +const $b = createStore(255); + +const $color = combine({ r: $r, g: $g, b: $b }); +$color.watch(console.log); // => {r: 255, b: 0, b: 255} + +const $sum = combine({ r: $r, g: $g, b: $b }, ({ r, g, b }) => r + g + b); +$sum.watch(console.log); // => 510 diff --git a/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js new file mode 100644 index 0000000..09bf515 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js @@ -0,0 +1,13 @@ +import { createStore, combine } from "effector"; + +const $balance = createStore(0); +const $username = createStore("zerobias"); + +const $greeting = combine($balance, $username, (balance, username) => { + return `Hello, ${username}. Your balance is ${balance}`; +}); + +$greeting.watch((data) => console.log(data)); // => Hello, zerobias. Your balance is 0 + +const $arrStores = combine([$balance, $username]); +$arrStores.watch(console.log); // => [0, 'zerobias'] diff --git a/src/content/docs/en/api/effector/fork.md b/src/content/docs/en/api/effector/fork.md new file mode 100644 index 0000000..705fa13 --- /dev/null +++ b/src/content/docs/en/api/effector/fork.md @@ -0,0 +1,233 @@ +--- +title: fork +redirectFrom: + - /api/effector/fork + - /docs/api/effector/fork +--- + +```ts +import { fork, type Scope } from "effector"; +``` + +# Methods (#methods) + +## `fork()` (#methods-fork) + +:::info{title="since"} + +introduced in [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) + +::: + +Creates an isolated instance of application. +Primary purposes of this method are SSR and testing. + +### Formulae (#methods-fork-formulae) + +```ts +fork(): Scope +``` + +### Returns (#methods-fork-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-examples) + +#### Create two instances with independent counter state (#methods-fork-examples-create-two-instances) + +```js +import { createStore, createEvent, fork, allSettled } from "effector"; + +const inc = createEvent(); +const dec = createEvent(); +const $counter = createStore(0); + +$counter.on(inc, (value) => value + 1); +$counter.on(dec, (value) => value - 1); + +const scopeA = fork(); +const scopeB = fork(); + +await allSettled(inc, { scope: scopeA }); +await allSettled(dec, { scope: scopeB }); + +console.log($counter.getState()); // => 0 +console.log(scopeA.getState($counter)); // => 1 +console.log(scopeB.getState($counter)); // => -1 +``` + +[Try it](https://share.effector.dev/dBSC59h8) + +## `fork(options)` (#methods-fork-options) + +Allows to set values for stores in scope and replace handlers for effects. + +:::info{title="since"} + +support for array of tuples in `values` and `handlers` introduced in [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) + +::: + +### Formulae (#methods-fork-options-formulae) + +```ts +fork(options: { values?, handlers? }): Scope +``` + +### Arguments (#methods-fork-options-arguments) + +1. `options: { values?, handlers? }` — Object with optional values and handlers + +#### `values` (#methods-fork-options-arguments-values) + +Option to provide initial states for stores. + +Can be used in three ways: + +1. Array of tuples with stores and values: + +```ts +fork({ + values: [ + [$user, "alice"], + [$age, 21], + ], +}); +``` + +2. Map with stores and values: + +```ts +fork({ + values: new Map().set($user, "alice").set($age, 21), +}); +``` + +3. Plain object: `{[sid: string]: value}` + +```ts +fork({ + values: { + [$user.sid]: "alice", + [$age.sid]: 21, + }, +}); +``` + +
    + +:::info{title="Explanation"} +Such objects are created by [serialize](/en/api/effector/serialize), in application code **array of tuples is preferred** +::: + +#### `handlers` (#methods-fork-options-arguments-handlers) + +Option to provide handlers for effects. + +Can be used in different ways: + +1. Array of tuples with effects and handlers: + +```ts +fork({ + handlers: [ + [getMessageFx, (params) => ({ id: 0, text: "message" })], + [getUserFx, async (params) => ({ name: "alice", age: 21 })], + ], +}); +``` + +2. Map with effects and handlers: + +```ts +fork({ + handlers: new Map() + .set(getMessageFx, (params) => ({ id: 0, text: "message" })) + .set(getUserFx, async (params) => ({ name: "alice", age: 21 })), +}); +``` + +3. Plain object: `{[sid: string]: handler}` + +```ts +fork({ + handlers: { + [getMessageFx.sid]: (params) => ({ id: 0, text: "message" }), + [getUserFx.sid]: async (params) => ({ name: "alice", age: 21 }), + }, +}); +``` + +
    + +:::warning{title="deprecation"} +Such objects are deprecated since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) and will be removed in future versions. Array of tuples is preferred. +::: + +### Returns (#methods-fork-options-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-options-examples) + +#### Set initial state for store and change handler for effect (#methods-fork-examples-set-initial-state-and-change-handler) + +This is an example of test, which ensures that after a request to the server, the value of `$friends` is filled. + +```ts +import { createEffect, createStore, fork, allSettled } from "effector"; + +const fetchFriendsFx = createEffect<{ limit: number }, string[]>(async ({ limit }) => { + /* some client-side data fetching */ + return []; +}); +const $user = createStore("guest"); +const $friends = createStore([]); + +$friends.on(fetchFriendsFx.doneData, (_, result) => result); + +const testScope = fork({ + values: [[$user, "alice"]], + handlers: [[fetchFriendsFx, () => ["bob", "carol"]]], +}); + +/* trigger computations in scope and await all called effects */ +await allSettled(fetchFriendsFx, { + scope: testScope, + params: { limit: 10 }, +}); + +/* check value of store in scope */ +console.log(testScope.getState($friends)); +// => ['bob', 'carol'] +``` + +[Try it](https://share.effector.dev/gnNbGZuu) + +## `fork(domain, options?)` (#methods-fork-domain) + +:::info{title="since"} + +introduced in [effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) + +::: + +### Formulae (#methods-fork-domain-formulae) + +```ts +fork(domain: Domain, options?: { values?, handlers? }): Scope +``` + +### Arguments (#methods-fork-domain-arguments) + +1. `domain` ([_Domain_](/en/api/effector/Domain)): Optional domain to fork. +2. `options: { values?, handlers? }` — Object with optional [values](#methods-fork-options-arguments-values) and [handlers](#methods-fork-options-arguments-handlers) + +### Returns (#methods-fork-domain-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-domain-examples) + +TBD diff --git a/src/content/docs/en/api/effector/forward.md b/src/content/docs/en/api/effector/forward.md new file mode 100644 index 0000000..9f4b459 --- /dev/null +++ b/src/content/docs/en/api/effector/forward.md @@ -0,0 +1,112 @@ +--- +title: forward +description: Method to create connection between units in a declarative way. Send updates from one set of units to another +redirectFrom: + - /api/effector/forward + - /docs/api/effector/forward +--- + +```ts +import { forward, type Subscription } from "effector"; +``` + +Method to create connection between units in a declarative way. Send updates from one set of units to another. + +# Methods (#methods) + +## `forward({ from, to })` (#methods-forward) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0). + +The core team recommends using [sample](/en/api/effector/sample) instead of `forward`. +::: + +### Formulae (#methods-forward-formulae) + +```ts +forward({ + from: Unit | Unit[], + to: Unit | Unit[] +}): Subscription +``` + +### Arguments (#methods-forward-arguments) + +1. `from` ([Unit | Unit\[\]](/en/explanation/glossary#common-unit)): Source of updates. Forward will listen for changes of these units + + - if an [_Event_] is passed, `to` will be triggered on each event trigger and receives event argument + - if a [_Store_] is passed, `to` will be triggered on each store **change** and receives new value of the store + - if an [_Effect_] is passed, `to` will be triggered on each effect call and receives effect parameter + - if an array of [units](/en/explanation/glossary#common-unit) is passed, `to` will be triggered when any unit in `from` array is triggered + +2. `to` ([Unit | Unit\[\]](/en/explanation/glossary#common-unit)): Target for updates. `forward` will trigger these units with data from `from` + - if passed an [_Event_], it will be triggered with data from `from` unit + - if passed a [_Store_], data from `from` unit will be written to store and **trigger its update** + - if passed an [_Effect_], it will be called with data from `from` unit as parameter + - if `to` is an array of [units](/en/explanation/glossary#common-unit), each unit in that array will be triggered + +### Returns (#methods-forward-returns) + +[Subscription](/en/explanation/glossary#subscription): Unsubscribe function. It breaks connection between `from` and `to`. After call, `to` will not be triggered anymore. + +:::info{title="since"} +Arrays of units are supported since [effector 20.6.0](https://changelog.effector.dev/#effector-20-6-0) +::: + +### Examples (#methods-forward-examples) + +#### Send store updates to another store (#methods-forward-examples-send-store-updates) + +```js +import { createStore, createEvent, forward } from "effector"; + +const $store = createStore(1); +const event = createEvent(); + +forward({ + from: event, + to: $store, +}); + +$store.watch((state) => console.log("store changed: ", state)); +// => store changed: 1 + +event(200); +// => store changed: 200 +``` + +[Try it](https://share.effector.dev/UeJbgRG9) + +#### Forward between arrays of units (#methods-forward-examples-forward-between-arrays) + +```js +import { createEvent, forward } from "effector"; + +const firstSource = createEvent(); +const secondSource = createEvent(); + +const firstTarget = createEvent(); +const secondTarget = createEvent(); + +forward({ + from: [firstSource, secondSource], + to: [firstTarget, secondTarget], +}); + +firstTarget.watch((e) => console.log("first target", e)); +secondTarget.watch((e) => console.log("second target", e)); + +firstSource("A"); +// => first target A +// => second target A +secondSource("B"); +// => first target B +// => second target B +``` + +[Try it](https://share.effector.dev/8aVpg8nU) + +[_effect_]: /en/api/effector/Effect +[_store_]: /en/api/effector/Store +[_event_]: /en/api/effector/Event diff --git a/src/content/docs/en/api/effector/fromObservable.md b/src/content/docs/en/api/effector/fromObservable.md new file mode 100644 index 0000000..8ede09a --- /dev/null +++ b/src/content/docs/en/api/effector/fromObservable.md @@ -0,0 +1,47 @@ +--- +title: fromObservable +redirectFrom: + - /api/effector/fromObservable + - /docs/api/effector/fromObservable +--- + +```ts +import { fromObservable, type Observable } from "effector"; +``` + +# Methods (#methods) + +## `fromObservable()` (#methods-fromObservable) + +Creates an event containing all items from an Observable. + +### Formulae (#methods-fromObservable-formulae) + +```ts +fromObservable(source: Observable): Event +``` + +### Arguments (#methods-fromObservable-arguments) + +1. `observable` (_Observable_) + +### Returns (#methods-fromObservable-returns) + +[_Event_](/en/api/effector/Event): New event + +### Examples (#methods-fromObservable-examples) + +#### Basic use case (#methods-fromObservable-examples-basic-use-case) + +```js +import { interval } from "rxjs"; +import { fromObservable } from "effector"; + +//emit value in sequence every 1 second +const source = interval(1000); + +const event = fromObservable(source); + +//output: 0,1,2,3,4,5.... +event.watch(console.log); +``` diff --git a/src/content/docs/en/api/effector/guard.md b/src/content/docs/en/api/effector/guard.md new file mode 100644 index 0000000..7286fe0 --- /dev/null +++ b/src/content/docs/en/api/effector/guard.md @@ -0,0 +1,176 @@ +--- +title: guard +description: Method for conditional event routing. +redirectFrom: + - /api/effector/guard + - /docs/api/effector/guard +--- + +```ts +import { guard } from "effector"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0). + +The core team recommends using [sample](/en/api/effector/sample) instead of `guard`. +::: + +Method for conditional event routing. +It provides a way to control one dataflow with the help of another: when the condition and the data are in different places, we can use `guard` with stores as filters to trigger events when condition state is true, thereby modulate signals without mixing them. + +# Methods (#methods) + +## `guard({ clock?, source?, filter, target? })` (#methods-guard-clock-source-filter-target) + +### Formulae (#methods-guard-clock-source-filter-target-formulae) + +```ts +guard({ clock?, source?, filter, target? }): target +``` + +:::info +Either `clock` or `source` is required +::: + +When `clock` is triggered, check `filter` for [truthy] and call `target` with data from `source` if `true`. + +- If `clock` is not passed, `guard` will be triggered on every `source` update +- If `source` is not passed, call `target` with data from `clock` +- If `target` is not passed, create [_Event_](/en/api/effector/Event) with type of `source` and return it from `guard()` +- If `filter` is [_Store_](/en/api/effector/Store), check it value for [truthy] +- If `filter` is `Function`, call it with data from `source` and check result for [truthy] + +[truthy]: https://developer.mozilla.org/en-US/docs/Glossary/Truthy + +:::info{title="since"} +`clock` in `guard` is available since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +## `guard({source, filter, target?})` (#methods-guard-source-filter-target) + +### Arguments (#methods-guard-source-filter-target-arguments) + +1. `params` (_Object_): Configuration object + +### Returns (#methods-guard-source-filter-target-returns) + +[_Event_](/en/api/effector/Event), which fires upon `clock` trigger + +### Examples (#methods-guard-source-filter-target-examples) + +#### Basic (#methods-guard-source-filter-target-examples-basic) + +```js +import { createStore, createEffect, createEvent, guard } from "effector"; + +const clickRequest = createEvent(); +const fetchRequest = createEffect((n) => new Promise((rs) => setTimeout(rs, 2500, n))); + +const $clicks = createStore(0).on(clickRequest, (x) => x + 1); +const $requestsCount = createStore(0).on(fetchRequest, (x) => x + 1); + +const $isIdle = fetchRequest.pending.map((pending) => !pending); + +/* +1. on clickRequest +2. if $isIdle is true +3. take current $clicks value +4. and call fetchRequest with it +*/ +guard({ + clock: clickRequest /* 1 */, + filter: $isIdle /* 2 */, + source: $clicks /* 3 */, + target: fetchRequest /* 4 */, +}); +``` + +See [ui visualization](https://share.effector.dev/zLB4NwNV) + +#### Function predicate (#methods-guard-source-filter-target-examples-function-predicate) + +```js +import { createEffect, createEvent, guard } from "effector"; + +const submitForm = createEvent(); +const searchUser = createEffect(); + +guard({ + source: submitForm, + filter: (user) => user.length > 0, + target: searchUser, +}); + +submitForm(""); // nothing happens +submitForm("alice"); // ~> searchUser('alice') +``` + +[Try it](https://share.effector.dev/84j97tZ7) + +## `guard(source, {filter: booleanStore})` (#methods-guard-source-filter-booleanStore) + +### Arguments (#methods-guard-source-filter-booleanStore-arguments) + +1. `source` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)): Source unit. Will trigger given `guard` on updates +2. `filter` ([_Store_](/en/api/effector/Store)): Filter store + +### Examples (#methods-guard-source-filter-booleanStore-examples) + +#### Store filter (#methods-guard-source-filter-booleanStore-examples-store-filter) + +```js +import { createEvent, createStore, createApi, guard } from "effector"; + +const trigger = createEvent(); +const $unlocked = createStore(true); + +const { lock, unlock } = createApi($unlocked, { + lock: () => false, + unlock: () => true, +}); + +const target = guard(trigger, { + filter: $unlocked, +}); + +target.watch(console.log); +trigger("A"); +lock(); +trigger("B"); // nothing happens +unlock(); +trigger("C"); +``` + +[Try it](https://share.effector.dev/6bqOCO4y) + +## `guard(source, {filter: predicate})` (#methods-guard-source-filter-predicate) + +### Arguments (#methods-guard-source-filter-predicate-arguments) + +1. `source` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)): Source unit. Will trigger given `guard` on updates +2. `filter` (_(payload) => Boolean_): Predicate function, [should be **pure**](/en/explanation/glossary#purity) + +### Examples (#methods-guard-source-filter-predicate-examples) + +#### Predicate function (#methods-guard-source-filter-predicate-examples-predicate-function) + +```js +import { createEvent, guard } from "effector"; + +const source = createEvent(); +const target = guard(source, { + filter: (x) => x > 0, +}); + +target.watch(() => { + console.log("target called"); +}); + +source(0); +// nothing happens +source(1); +// target called +``` + +[Try it](https://share.effector.dev/ethzpd8Y) diff --git a/src/content/docs/en/api/effector/hydrate.md b/src/content/docs/en/api/effector/hydrate.md new file mode 100644 index 0000000..2716102 --- /dev/null +++ b/src/content/docs/en/api/effector/hydrate.md @@ -0,0 +1,56 @@ +--- +title: hydrate +redirectFrom: + - /api/effector/hydrate + - /docs/api/effector/hydrate +--- + +```ts +import { hydrate } from "effector"; +``` + +A companion method for [_serialize_](/en/api/effector/serialize). Hydrates provided values into corresponding stores within a provided domain or scope. The main purpose is an application state hydration on the client side after SSR. + +# Methods (#methods) + +## `hydrate(domainOrScope, {values})` (#methods-hydrate-domainOrScope-values) + +:::warning +You need to make sure that the store is created beforehand, otherwise, the hydration might fail. This could be the case if you keep store initialization/hydration scripts separate from stores' creation. +::: + +### Formulae (#methods-hydrate-domainOrScope-values-formulae) + +```ts +hydrate(domainOrScope: Domain | Scope, { values: Map, any> | {[sid: string]: any} }): void +``` + +### Arguments (#methods-hydrate-domainOrScope-values-arguments) + +1. `domainOrScope`: [domain](/en/api/effector/Domain) or [scope](/en/api/effector/Scope) which will be filled with given `values` +2. `values`: a mapping from store sids to store values or a Map where keys are [store](/en/api/effector/Store) objects and values contain initial store value + +### Returns (#methods-hydrate-domainOrScope-values-returns) + +`void` + +### Examples (#methods-hydrate-domainOrScope-values-examples) + +Populate store with a predefined value + +```js +import { createStore, createDomain, fork, serialize, hydrate } from "effector"; + +const domain = createDomain(); +const $store = domain.createStore(0); + +hydrate(domain, { + values: { + [$store.sid]: 42, + }, +}); + +console.log($store.getState()); // 42 +``` + +[Try it](https://share.effector.dev/zZoQ5Ewm) diff --git a/src/content/docs/en/api/effector/index.md b/src/content/docs/en/api/effector/index.md new file mode 100644 index 0000000..f896421 --- /dev/null +++ b/src/content/docs/en/api/effector/index.md @@ -0,0 +1,69 @@ +--- +title: effector +redirectFrom: + - /api/effector +--- + +List of the methods + +## Unit Definitions (#unit-definitions) + +- [Event](/en/api/effector/Event) +- [Effect](/en/api/effector/Effect) +- [Store](/en/api/effector/Store) +- [Domain](/en/api/effector/Domain) +- [Scope](/en/api/effector/Scope) + +## Unit Creators (#unit-creators) + +- [createEvent](/en/api/effector/createEvent) +- [createStore](/en/api/effector/createStore) +- [createEffect](/en/api/effector/createEffect) +- [createDomain](/en/api/effector/createDomain) + +## Common Methods (#common-methods) + +- [combine(...stores, f)](/en/api/effector/combine) +- [attach({effect, mapParams?, source?})](/en/api/effector/attach) +- [sample({clock, source, fn, target})](/en/api/effector/sample) +- [merge([eventA, eventB])](/en/api/effector/merge) +- [split(event, cases)](/en/api/effector/split) +- [createApi(store, api)](/en/api/effector/createApi) + +## Fork API (#fork-api) + +- [fork](/en/api/effector/fork) +- [serialize](/en/api/effector/serialize) +- [allSettled](/en/api/effector/allSettled) +- [scopeBind](/en/api/effector/scopeBind) +- [hydrate](/en/api/effector/hydrate) + +## Plugins (#plugins) + +- [effector/babel-plugin](/en/api/effector/babel-plugin) +- [@effector/swc-plugin](https://github.com/effector/swc-plugin) + +## Utilities (#utilities) + +- [is](/en/api/effector/is) +- [fromObservable(observable)](/en/api/effector/fromObservable) + +## Low Level API (#low-level-api) + +- [clearNode](/en/api/effector/clearNode) +- [withRegion](/en/api/effector/withRegion) +- [launch](/en/api/effector/launch) +- [inspect](/en/api/effector/inspect) + +## Import Map (#import-map) + +Package `effector` provides couple different entry points for different purposes: + +- [effector/compat](/en/api/effector/module/compat) +- [effector/inspect](/en/api/effector/module/inspect) +- [effector/babel-plugin](/en/api/effector/module/babel-plugin) + +## Deprecated Methods (#deprecated-methods) + +- [forward({from, to})](/en/api/effector/forward) +- [guard({source, filter, target})](/en/api/effector/guard) diff --git a/src/content/docs/en/api/effector/inspect.md b/src/content/docs/en/api/effector/inspect.md new file mode 100644 index 0000000..63fe880 --- /dev/null +++ b/src/content/docs/en/api/effector/inspect.md @@ -0,0 +1,190 @@ +--- +title: inspect +redirectFrom: + - /api/effector/inspect + - /docs/api/effector/inspect +--- + +```ts +import { inspect } from "effector/inspect"; +``` + +Special API methods designed to handle debugging and monitoring use cases without giving too much access to internals of your actual app. + +Useful to create developer tools and production monitoring and observability instruments. + +# Inspect API (#inspect-api) + +Allows us to track any computations that have happened in the effector's kernel. + +## `inspect()` (#inspect-api-inspect) + +### Example (#inspect-api-inspect-example) + +```ts +import { inspect, type Message } from "effector/inspect"; + +import { someEvent } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +inspect({ + fn: (m) => { + logInspectMessage(m); + }, +}); + +someEvent(42); +// will log something like +// [event] someEvent 42 +// [on] 42 +// [store] $count 1337 +// ☝️ let's say that reducer adds 1295 to provided number +// +// and so on, any triggers +``` + +[Scope](/en/api/effector/Scope) limits the extent to which computations can be tracked. If no scope is provided - default out-of-scope mode computations will be tracked. + +```ts +import { fork, allSettled } from "effector"; +import { inspect, type Message } from "effector/inspect"; + +import { someEvent } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +const myScope = fork(); + +inspect({ + scope: myScope, + fn: (m) => { + logInspectMessage(m); + }, +}); + +someEvent(42); +// ☝️ No logs! That's because tracking was restricted by myScope + +allSettled(someEvent, { scope: myScope, params: 42 }); +// [event] someEvent 42 +// [on] 42 +// [store] $count 1337 +``` + +## Tracing (#inspect-api-tracing) + +Adding `trace: true` setting allows looking up previous computations, that led to this specific one. It is useful to debug the specific reason for some events happening + +### Example (#inspect-api-tracing-example) + +```ts +import { fork, allSettled } from "effector"; +import { inspect, type Message } from "effector/inspect"; + +import { someEvent, $count } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +const myScope = fork(); + +inspect({ + scope: myScope, + trace: true, // <- explicit setting is needed + fn: (m) => { + if (m.kind === "store" && m.sid === $count.sid) { + m.trace.forEach((tracedMessage) => { + logInspectMessage(tracedMessage); + // ☝️ here we are logging the trace of specific store update + }); + } + }, +}); + +allSettled(someEvent, { scope: myScope, params: 42 }); +// [on] 42 +// [event] someEvent 42 +// ☝️ traces are provided in backwards order, because we are looking back in time +``` + +## Errors (#inspect-api-errors) + +Effector does not allow exceptions in pure functions. In such case, branch computation is stopped and an exception is logged. There is also a special message type in such case: + +### Example (#inspect-api-errors-example) + +```ts +inspect({ + fn: (m) => { + if (m.type === "error") { + // do something about it + console.log(`${m.kind} ${m.name} computation has failed with ${m.error}`); + } + }, +}); +``` + +# Inspect Graph (#inspect-graph) + +Allows us to track declarations of units, [factories](/en/api/effector/babel-plugin#factories), and [regions](/en/api/effector/withRegion). + +## Example (#inspect-graph-example) + +```ts +import { createStore } from "effector"; +import { inspectGraph, type Declaration } from "effector/inspect"; + +function printDeclaration(d: Declaration) { + console.log(`${d.kind} ${d.name}`); +} + +inspectGraph({ + fn: (d) => { + printDeclaration(d); + }, +}); + +const $count = createStore(0); +// logs "store $count" to console +``` + +## `withRegion` (#inspect-graph-withRegion) + +Meta-data provided via region's root node is available on declaration. + +### Example (#inspect-graph-withRegion-example) + +```ts +import { createNode, withRegion, createStore } from "effector"; +import { inspectGraph, type Declaration } from "effector/inspect"; + +function createCustomSomething(config) { + const $something = createStore(0); + + withRegion(createNode({ meta: { hello: "world" } }), () => { + // some code + }); + + return $something; +} +inspectGraph({ + fn: (d) => { + if (d.type === "region") console.log(d.meta.hello); + }, +}); + +const $some = createCustomSomething({}); +// logs "world" +``` diff --git a/src/content/docs/en/api/effector/is.md b/src/content/docs/en/api/effector/is.md new file mode 100644 index 0000000..3ddbc5c --- /dev/null +++ b/src/content/docs/en/api/effector/is.md @@ -0,0 +1,382 @@ +--- +title: is +redirectFrom: + - /api/effector/is + - /docs/api/effector/is +--- + +```ts +import { is, type Unit } from "effector"; +``` + +Namespace for unit validators. + +# Methods (#methods) + +## `is.store(value)` (#methods-isStore) + +Checks if given value is [_store_](/en/api/effector/Store) + +### Returns (#methods-isStore-returns) + +`boolean` — Type-guard + +### Examples (#methods-isStore-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.store($store); +// => true + +is.store(event); +// => false + +is.store(fx); +// => false + +is.store(createDomain()); +// => false + +is.store(fx.pending); +// => true + +is.store(fx.done); +// => false + +is.store($store.updates); +// => false + +is.store(null); +// => false +``` + +[Try it](https://share.effector.dev/4vzdWan1) + +## `is.event(value)` (#methods-isEvent) + +Checks if given value is [_event_](/en/api/effector/Event) + +### Returns (#methods-isEvent-returns) + +`boolean` — Type-guard + +### Examples (#methods-isEvent-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.event($store); +// => false + +is.event(event); +// => true + +is.event(fx); +// => false + +is.event(createDomain()); +// => false + +is.event(fx.pending); +// => false + +is.event(fx.done); +// => true + +is.event($store.updates); +// => true + +is.event(null); +// => false +``` + +[Try it](https://share.effector.dev/hB0JEiIo) + +## `is.effect(value)` (#methods-isEffect) + +Checks if given value is [_effect_](/en/api/effector/Effect) + +### Returns (#methods-isEffect-returns) + +`boolean` — Type-guard + +### Examples (#methods-isEffect-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.effect($store); +// => false + +is.effect(event); +// => false + +is.effect(fx); +// => true + +is.effect(createDomain()); +// => false + +is.effect(null); +// => false +``` + +[Try it](https://share.effector.dev/ZdZ2N6VG) + +## `is.targetable` (#methods-isTargetable) + +Checks if given value can be used in operators target (or be called as a function in case of events) + +### Returns (#methods-isTargetable-returns) + +`boolean` — Type-guard + +### Examples (#methods-isTargetable-examples) + +```js +import { is, createStore, createEvent, createEffect } from "effector"; + +const $store = createStore(null); +const $mapped = $store.map((x) => x); +const event = createEvent(); +const mappedEvent = event.map((x) => x); +const fx = createEffect(); + +is.targetable($store); +// => true + +is.targetable($mapped); +// => false + +is.targetable(event); +// => true + +is.targetable(mappedEvent); +// => false + +is.targetable(fx); +// => true +``` + +## `is.domain(value)` (#methods-isDomain) + +Checks if given value is [_domain_](/en/api/effector/Domain) + +### Returns (#methods-isDomain-returns) + +`boolean` — Type-guard + +### Examples (#methods-isDomain-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.domain($store); +// => false + +is.domain(event); +// => false + +is.domain(fx); +// => false + +is.domain(createDomain()); +// => true + +is.domain(null); +// => false +``` + +[Try it](https://share.effector.dev/Iea0gmfD) + +## `is.scope(value)` (#methods-isScope) + +:::info{title="since"} +[effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) +::: + +Checks if given value is [_scope_](/en/api/effector/Scope) since [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0). + +### Returns (#methods-isScope-returns) + +`boolean` — Type-guard + +### Examples (#methods-isScope-examples) + +```js +import { fork } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.scope(scope); +// => true + +is.scope($store); +// => false + +is.scope(event); +// => false + +is.scope(fx); +// => false + +is.scope(createDomain()); +// => false + +is.scope(null); +// => false +``` + +[Try it](https://share.effector.dev/hF0krFUK) + +## `is.unit(value)` (#methods-isUnit) + +Checks if given value is [Unit](/en/explanation/glossary#unit): [Store](/en/api/effector/Store), [Event](/en/api/effector/Event), [Effect](/en/api/effector/Effect), [Domain](/en/api/effector/Domain) or [Scope](/en/api/effector/Scope) + +### Returns (#methods-isUnit-returns) + +`boolean` — Type-guard + +### Examples (#methods-isUnit-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain, fork } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.unit(scope); +// => true + +is.unit($store); +// => true + +is.unit(event); +// => true + +is.unit(fx); +// => true + +is.unit(createDomain()); +// => true + +is.unit(fx.pending); +// => true + +is.unit(fx.done); +// => true + +is.unit($store.updates); +// => true + +is.unit(null); +// => false +``` + +[Try it](https://share.effector.dev/iOpDvweB) + +## `is.attached(value)` (#methods-isAttached) + +:::info{title="since"} +[effector 22.4.0](https://changelog.effector.dev/#effector-22-4-0) +::: + +Checks if given value is [_effect_](/en/api/effector/Effect) created via [_attach_](/en/api/effector/attach) method. If passed not an effect, returns `false`. + +### Returns (#methods-isAttached-returns) + +`boolean` — Type-guard + +### Usage (#methods-isAttached-usage) + +Sometimes you need to add an error log on effects failures, but only on effects that have been "localized" via `attach`. +If you leave `onCreateEffect` as it is, without checks, the error log will be duplicated, because it will happen on the parent and the child effect. + +```js +import { createDomain, attach, is } from "effector"; + +const logFailuresDomain = createDomain(); + +logFailuresDomain.onCreateEffect((effect) => { + if (is.attached(effect)) { + effect.fail.watch(({ params, error }) => { + console.warn(`Effect "${effect.compositeName.fullName}" failed`, params, error); + }); + } +}); + +const baseRequestFx = logFailuresDomain.createEffect((path) => { + throw new Error(`path ${path}`); +}); + +const loadDataFx = attach({ + mapParams: () => "/data", + effect: baseRequestFx, +}); + +const loadListFx = attach({ + mapParams: () => "/list", + effect: baseRequestFx, +}); + +loadDataFx(); +loadListFx(); +``` + +[Try it](https://share.effector.dev/NxQseHOR) + +### Examples (#methods-isAttached-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain, attach } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +const childFx = attach({ + effect: fx, +}); + +is.attached(childFx); +// => true + +is.attached(fx); +// => false + +is.attached($store); +// => false + +is.attached(event); +// => false + +is.attached(createDomain()); +// => false + +is.attached(null); +// => false +``` + +[Try it](https://share.effector.dev/qsdTF7og) diff --git a/src/content/docs/en/api/effector/launch.md b/src/content/docs/en/api/effector/launch.md new file mode 100644 index 0000000..a19030b --- /dev/null +++ b/src/content/docs/en/api/effector/launch.md @@ -0,0 +1,53 @@ +--- +title: launch +redirectFrom: + - /api/effector/launch + - /docs/api/effector/launch +--- + +```ts +import { launch, type Unit, type Node } from "effector"; +``` + +:::info{title="since"} +[effector 20.10.0](https://changelog.effector.dev/#effector-20-10-0) +::: + +# Methods (#methods) + +## `launch({ target, params })` (#methods-launch-config) + +Low level method for running computation in units (events, effects or stores). Mostly used by library developers for fine-grained control of computations. + +### Formulae (#methods-launch-config-formulae) + +```ts +launch({ + target, + params, + defer?: boolean, + page?: any, + scope?: Scope, + meta?: Record, +}): void +``` + +### Arguments (#methods-launch-config-arguments) + +TBD + +### Returns (#methods-launch-config-returns) + +`void` + +## `launch(unit, params)` (#methods-launch-unit-params) + +### Formulae (#methods-launch-unit-params-formulae) + +```ts +launch(unit: Unit | Node, params: T): void +``` + +### Returns (#methods-launch-unit-params-returns) + +`void` diff --git a/src/content/docs/en/api/effector/merge.md b/src/content/docs/en/api/effector/merge.md new file mode 100644 index 0000000..a5e659a --- /dev/null +++ b/src/content/docs/en/api/effector/merge.md @@ -0,0 +1,103 @@ +--- +title: merge +description: merge is a method for creating an event triggered by given units +redirectFrom: + - /api/effector/merge + - /docs/api/effector/merge +--- + +```ts +import { merge, type Unit } from "effector"; +``` + +# Methods (#methods) + +## `merge(units)` (#methods-merge-units) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +Merges an array of units (events, effects, or stores), returning a new event that triggers upon any of the given units being triggered. + +```ts +merge(units: Unit[]): Event +``` + +### Arguments (#methods-merge-units-arguments) + +1. `units`: An array of [units](/en/explanation/glossary#common-unit) to be merged. + +### Returns (#methods-merge-units-returns) + +[_Event_](/en/api/effector/Event): A new event that fires when any of the given units is triggered. + +:::tip +In the case of a store, the resulting event will fire upon store updates. +::: + +### Types (#methods-merge-units-types) + +TBD + +### Examples (#methods-merge-units-examples) + +#### Basic Usage (#methods-merge-units-examples-basic-usage) + +```js +import { createEvent, merge } from "effector"; + +const foo = createEvent(); +const bar = createEvent(); +const baz = merge([foo, bar]); +baz.watch((v) => console.log("merged event triggered: ", v)); + +foo(1); +// => merged event triggered: 1 +bar(2); +// => merged event triggered: 2 +``` + +[Try it](https://share.effector.dev/WxUgr6dZ) + +#### Working with Stores (#methods-merge-units-examples-working-with-stores) + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const setBar = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); +const $bar = createStore(100).on(setBar, (_, v) => v); + +const anyUpdated = merge([$foo, $bar]); +anyUpdated.watch((v) => console.log(`state changed to: ${v}`)); + +setFoo(1); // => state changed to: 1 +setBar(123); // => state changed to: 123 +``` + +[Try it](https://share.effector.dev/Rp9wuRvl) + +#### Merging a Store and an Event (#methods-merge-units-examples-merging-a-store-and-an-event) + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const otherEvent = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); +const merged = merge([$foo, otherEvent]); + +merged.watch((v) => console.log(`merged event payload: ${v}`)); + +setFoo(999); +// => merged event payload: 999 + +otherEvent("bar"); +// => merged event payload: bar +``` + +[Try it](https://share.effector.dev/pKkiyhVQ) diff --git a/src/content/docs/en/api/effector/module/babel-plugin.md b/src/content/docs/en/api/effector/module/babel-plugin.md new file mode 100644 index 0000000..14b1d13 --- /dev/null +++ b/src/content/docs/en/api/effector/module/babel-plugin.md @@ -0,0 +1,10 @@ +--- +title: effector/babel-plugin +description: Separate module of Effector with plugin for Babel that improves DX over the library +--- + +Since Effector allows to automate many common tasks (like setting [Stable IDentifiers](/en/explanation/sids) and providing debug information for [Units](/en/explanation/glossary#unit)), there is a built-in plugin for Babel that enhances the developer experience when using the library. + +# Usage (#methods-babel-plugin-usage) + +Please refer to the [Babel plugin](/en/api/effector/babel-plugin) documentation for usage examples. diff --git a/src/content/docs/en/api/effector/module/inspect.md b/src/content/docs/en/api/effector/module/inspect.md new file mode 100644 index 0000000..46f212f --- /dev/null +++ b/src/content/docs/en/api/effector/module/inspect.md @@ -0,0 +1,14 @@ +--- +title: effector/inspect +description: Separate module of Effector with Inspect API +--- + +Effector has special API methods designed to handle debugging and monitoring use cases without giving too much access to the internals of your actual app — [Inspect API](/en/api/effector/inspect). + +## Why a Separate Module? (#why-a-separate-module) + +Inspect API is designed to be disposable. By design, any feature that uses Inspect API can be removed from the production build without any side effects. To emphasize this, Inspect API is not included in the main module. Instead, it's available in a separate module `effector/inspect`. + +## Usage (#usage) + +Please refer to [Inspect API](/en/api/effector/inspect) docs for usage examples. diff --git "a/src/content/docs/en/api/effector/module/\321\201ompat.md" "b/src/content/docs/en/api/effector/module/\321\201ompat.md" new file mode 100644 index 0000000..959f1c8 --- /dev/null +++ "b/src/content/docs/en/api/effector/module/\321\201ompat.md" @@ -0,0 +1,100 @@ +--- +title: effector/compat +description: Separate module of Effector with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices) +--- + +```ts +import {} from "effector/compat"; +``` + +The library provides a separate module with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices). + +:::warning{title="Bundler, Not Transpiler"} +Since third-party libraries can import `effector` directly, you **should not** use transpilers like Babel to replace `effector` with `effector/compat` in your code because by default, Babel will not transform third-party code. + +**Use a bundler instead**, as it will replace `effector` with `effector/compat` in all modules, including those from third parties. + +::: + +## Required Polyfills (#required-polyfills) + +You need to install polyfills for these objects: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` +- `Map` +- `Set` + +In most cases, a bundler can automatically add polyfills. + +### Vite (#required-polyfills-vite) + +
    +Vite Configuration Example + +```js +import { defineConfig } from "vite"; +import legacy from "@vitejs/plugin-legacy"; + +export default defineConfig({ + plugins: [ + legacy({ + polyfills: ["es.promise", "es.object.assign", "es.array.flat", "es.map", "es.set"], + }), + ], +}); +``` + +
    + +# Usage (#usage) + +## Manual Replacement (#usage-manual) + +You can use `effector/compat` instead of the `effector` package if you need to support old browsers. + +```diff +- import {createStore} from 'effector' ++ import {createStore} from 'effector/compat' +``` + +## Automatic Replacement (#usage-automatic) + +However, you can set up your bundler to automatically replace `effector` with `effector/compat` in your code. + +### Webpack (#usage-automatic-webpack) + +
    +Webpack Configuration Example + +```js +module.exports = { + resolve: { + alias: { + effector: "effector/compat", + }, + }, +}; +``` + +
    + +### Vite (#usage-automatic-vite) + +
    +Vite Configuration Example + +```js +import { defineConfig } from "vite"; + +export default defineConfig({ + resolve: { + alias: { + effector: "effector/compat", + }, + }, +}); +``` + +
    diff --git a/src/content/docs/en/api/effector/restore.md b/src/content/docs/en/api/effector/restore.md new file mode 100644 index 0000000..a130018 --- /dev/null +++ b/src/content/docs/en/api/effector/restore.md @@ -0,0 +1,136 @@ +--- +title: restore +redirectFrom: + - /api/effector/restore + - /docs/api/effector/restore +--- + +```ts +import { restore } from "effector"; +``` + +# Methods (#methods) + +## `restore(event, defaultState)` (#methods-restore-event-defaultState) + +Creates a [_StoreWritable_](/en/api/effector/Store) from an [_Event_](/en/api/effector/Event). It works like a shortcut for `createStore(defaultState).on(event, (_, payload) => payload)` + +:::warning{title="It is not a derived store"} +Restore creates a new store. It is not a [DerivedStore](/en/api/effector/Store#readonly). That means you can modify its state via events, and use it as `target` in [sample](/en/api/effector/sample). +::: + +### Formulae (#methods-restore-event-defaultState-formulae) + +```ts +restore(event: Event, defaultState: T): StoreWritable +``` + +### Arguments (#methods-restore-event-defaultState-arguments) + +1. `event` [_Event_](/en/api/effector/Event) +2. `defaultState` (_Payload_) + +### Returns (#methods-restore-event-defaultState-returns) + +[_StoreWritable_](/en/api/effector/Store): New store + +### Examples (#methods-restore-event-defaultState-examples) + +#### Basic (#methods-restore-event-defaultState-examples-basic) + +```js +import { createEvent, restore } from "effector"; + +const event = createEvent(); +const $store = restore(event, "default"); + +$store.watch((state) => console.log("state: ", state)); +// state: default + +event("foo"); +// state: foo +``` + +[Try it](https://share.effector.dev/MGGQnTlQ) + +## `restore(effect, defaultState)` (#methods-restore-effect-defaultState) + +Creates a [_StoreWritable_](/en/api/effector/Store) out of successful results of an [_Effect_](/en/api/effector/Effect). It works like a shortcut for `createStore(defaultState).on(effect.done, (_, {result}) => result)` + +### Formulae (#methods-restore-effect-defaultState-formulae) + +```ts +restore(effect: Effect, defaultState: Done): StoreWritable +``` + +### Arguments (#methods-restore-effect-defaultState-arguments) + +1. `effect` [_Effect_](/en/api/effector/Effect) +2. `defaultState` (_Done_) + +### Returns (#methods-restore-effect-defaultState-returns) + +[_StoreWritable_](/en/api/effector/Store): New store + +### Types (#methods-restore-effect-defaultState-types) + +Store will have the same type as `Done` from `Effect`. Also, `defaultState` should have `Done` type. + +### Examples (#methods-restore-effect-defaultState-examples) + +#### Effect (#methods-restore-effect-defaultState-examples-effect) + +```js +import { createEffect, restore } from "effector"; + +const fx = createEffect(() => "foo"); +const $store = restore(fx, "default"); + +$store.watch((state) => console.log("state: ", state)); +// => state: default + +await fx(); +// => state: foo +``` + +[Try it](https://share.effector.dev/tP6RQsri) + +## `restore(shape)` (#methods-restore-shape) + +Creates an object with stores from an object with values. + +### Formulae (#methods-restore-shape-formulae) + +TBD + +### Arguments (#methods-restore-shape-arguments) + +1. `shape` (_State_) + +### Returns (#methods-restore-shape-returns) + +[_StoreWritable_](/en/api/effector/Store): New store. + +### Examples (#methods-restore-shape-examples) + +#### Object (#methods-restore-shape-examples-object) + +```js +import { restore } from "effector"; + +const { foo: $foo, bar: $bar } = restore({ + foo: "foo", + bar: 0, +}); + +$foo.watch((foo) => { + console.log("foo", foo); +}); +// => foo 'foo' +$bar.watch((bar) => { + console.log("bar", bar); +}); +// => bar 0 +``` + +[Try it](https://share.effector.dev/NQX0kotI) diff --git a/src/content/docs/en/api/effector/sample.md b/src/content/docs/en/api/effector/sample.md new file mode 100644 index 0000000..56a2a73 --- /dev/null +++ b/src/content/docs/en/api/effector/sample.md @@ -0,0 +1,498 @@ +--- +title: sample +redirectFrom: + - /api/effector/sample + - /docs/api/effector/sample +--- + +```ts +import { sample } from "effector"; +``` + +# Methods (#methods) + +# `sample({ source?, clock?, filter?, fn?, target? })` (#methods-sample-config) + +This method can be used for linking two nodes, resulting in the third one, which will fire only upon the `clock` node trigger. + +Quite a common case, when you need to handle an event with some store's state. Instead of using `store.getState()`, which may cause race conditions and inconsistency of state, it is more suitable to use the `sample` method. + +## Formulae (#methods-sample-config-formulae) + +```ts +sample({ source?, clock?, filter?, fn?, target?}): target +``` + +When `clock` is triggered, read the value from `source` and trigger `target` with it. + +- If the `clock` is not passed, `sample` will be triggered on every `source` update. +- If the `filter` is not passed, continue as it is. If `filter` return `false` or contains `Store` cancel execution otherwise continue +- If the `fn` is passed, pass value from `source` through before passing to `target` +- If the `target` is not passed, create it and return from `sample()` + +## Schema (#methods-sample-config-schema) + +![](/images/sample-visualization.gif) + +## Types (#methods-sample-config-types) + +### Type of the created `target` (#methods-sample-config-types-target) + +If `target` is not passed to `sample()` call, it will be created internally. The type of unit is described in the table below: + +| clock\source | [_Store_](/en/api/effector/Store) | [_Event_](/en/api/effector/Event) | [_Effect_](/en/api/effector/Effect) | +| ----------------------------------- | --------------------------------- | --------------------------------- | ----------------------------------- | +| [_Store_](/en/api/effector/Store) | `Store` | `Event` | `Event` | +| [_Event_](/en/api/effector/Event) | `Event` | `Event` | `Event` | +| [_Effect_](/en/api/effector/Effect) | `Event` | `Event` | `Event` | + +How to read it: + +1. You need to know the type of the `source`, it is a column +2. Type of the `clock` in the rows +3. Match the column and the row + +For example: + +```ts +import { sample } from "effector"; + +const $store = sample({ clock: $store, source: $store }); +// Result will be store, because `source` and `clock` are stores. + +const event = sample({ clock: event, source: $store }); +// Because not all arguments are stores. +``` + +# `sample({clock?, source, filter?, fn?, target?, greedy?})` (#methods-sample-greedy) + +## Formulae (#methods-sample-greedy-formulae) + +TBD + +## Arguments (#methods-sample-greedy-arguments) + +`params` (_Object_): Configuration object + +- `clock?`: [Unit](/en/explanation/glossary#common-unit) or array of units + - If event or effect: trigger `target` upon event or effect is called + - If store: trigger `target` upon store is updated + - If array of units: trigger `target` upon any given unit is called or updated. Shorthand for inline [merge](/en/api/effector/merge) call + - If not passed: `source` is used as `clock` +- `source?`: [Unit](/en/explanation/glossary#common-unit) or object/array with stores + - If event or effect: take last invocation argument value. That event or effect must be invoked at least once + - If store: take current state of given store + - If array or object with stores: take values from given stores combined to object or array. Shorthand for inline [combine](/en/api/effector/combine) call + - If not passed: `clock` is used as `source` +- `target?`: [Unit](/en/explanation/glossary#common-unit) or array of units + - If event or effect: call given event or effect upon `clock` is triggered + - If store: update given store upon `clock` is triggered + - If array of units: trigger every given unit upon `clock` is triggered + - If not passed: new unit will be created under the hood and will be returned as a result of the `sample()` call. Type of created target is described [in table beyond](/en/api/effector/sample#sample-types-target) +- `filter?` _(Function or [Store](/en/api/effector/Store))_ `((sourceData, clockData) => result): boolean | Store`: If returns value of the function or store contains `true` continue execution otherwise cancel +- `fn?` _(Function)_ `((sourceData, clockData) => result)`: Combinator function, which will transform data from `source` and `clock` before passing it to `target`, [should be **pure**](/en/explanation/glossary#purity). If not passed, data from `source` will be passed to `target` as it is +- `greedy?` (boolean) Modifier defines whether sampler will wait for resolving calculation result, and will batch all updates, resulting only one trigger, or will be triggered upon every linked node invocation, e.g. if `greedy` is `true`, `sampler` will fire on trigger of every node, linked to `clock`, whereas `non-greedy sampler(greedy: false)` will fire only upon the last linked node trigger + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) property `greedy` is deprecated. + +Use `batch` instead of `greedy`. +::: + +:::info{title="since"} +Array of units in `target` are supported since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +## Returns (#methods-sample-greedy-returns) + +([_Event_](/en/api/effector/Event) | [_Store_](/en/api/effector/Store)) - Unit, which fires/updates upon `clock` is triggered, if `source` is not passed. [The type of returned unit depends on the types of `clock` and `source`](#sample-types-target). + +## Examples (#methods-sample-greedy-examples) + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const submitForm = createEvent(); +const signInFx = createEffect((params) => { + console.log(params); +}); + +const $userName = createStore("john"); + +sample({ + clock: submitForm /* 1 */, + source: $userName /* 2 */, + fn: (name, password) => ({ name, password }) /* 3 */, + target: signInFx /* 4 */, +}); + +submitForm(12345678); +// 1. when submitForm is called with params (12345678) +// 2. take $userName store`s state ('john') +// 3. transform payload from event (1) and current store`s state (2) +// 4. trigger effect signInFx with params received at the step (3) +``` + +[Try it](https://share.effector.dev/PAjWhOJc) + +# `sample(sourceUnit, clockUnit, fn?)` (#sample-sourceUnit-clockUnit-fn) + +It is just another form of the `sample` invocation, with the same sense. + +## Formulae (#sample-sourceUnit-clockUnit-fn-formulae) + +TBD + +## Arguments (#sample-sourceUnit-clockUnit-fn-arguments) + +- `sourceUnit`: Source [unit](/en/explanation/glossary#common-unit) + - If event or effect. Take last invocation argument value. That event or effect must be invoked at least once + - If store. Take current store's state +- `clockUnit`: Clock [unit](/en/explanation/glossary#common-unit). If not passed, `source` is used as `clock` + - If event or effect. Trigger the sampled unit, upon event or effect is called + - If store. Trigger the sampled unit, upon store is updated +- `fn?` (_(sourceData, clockData) => result_): Optional combinator function, [should be **pure**](/en/explanation/glossary#purity). Since, this handler is supposed to organize data flow, you should avoid declaring side effects here. It's more appropriate to place it in `watch` method for sampled node. + +**Returns** + +([_Event_](/en/api/effector/Event) | [_Store_](/en/api/effector/Store)) – Unit, which fires/updates upon `clock` is triggered, if `source` is not passed. +[The type of returned unit depends on the types of `clock` and `source`](#sample-types-target). + +## Examples (#sample-sourceUnit-clockUnit-fn-examples) + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const submitForm = createEvent(); + +const signInFx = createEffect((params) => { + console.log(params); +}); + +const $userName = createStore("john"); + +const sampleUnit = sample( + $userName /* 2 */, + submitForm /* 1 */, + (name, password) => ({ name, password }) /* 3 */, +); +/* 4 */ +sample({ + clock: sampleUnit, + target: signInFx, +}); + +submitForm(12345678); +// 1. when submitForm is called with params (12345678) +// 2. take $userName store`s state ('john') +// 3. transform payload from event (1) and current store`s state (2) +// 4. when sampleUnit (event in this case) is triggered, +// send it payload to effect signInFx with params received at the step (3) +``` + +[Try it](https://share.effector.dev/WO6UT8bV) + +## `sample({name?})` (#sample-name) + +:::info{title="since"} +[effector 20.4.0](https://changelog.effector.dev/#effector-20-4-0) +::: + +Every [unit](/en/explanation/glossary#unit) in effector may have a name. +You now can name sampled entities in the same manner as basic ones. + +```js +import { createStore, sample } from "effector"; + +const $store = createStore(null); + +const sampled = sample({ + source: $store, + name: "sampled $store", +}); + +console.log(sampled.shortName); // 'sampled foo' +``` + +# Objects and Arrays of _Store_ in `sample({ source })` (#sample-source-objects-arrays) + +## Object of Stores (#sample-source-object-stores) + +:::info{title="since"} +[effector 20.8.0](https://changelog.effector.dev/#effector-20-8-0) +::: + +`sample` can be called with an object of [_Store_](/en/api/effector/Store) as `source`: + +```js +import { createStore, createEvent, sample } from "effector"; + +const trigger = createEvent(); + +const $a = createStore("A"); +const $b = createStore(1); + +// Target has type `Event<{ a: string, b: number }>` +const target = sample({ + clock: trigger, + source: { a: $a, b: $b }, +}); + +target.watch((obj) => { + console.log("sampled object", obj); +}); + +trigger(); +// => sampled object {a: 'A', b: 1} +``` + +[Try it](https://share.effector.dev/Wp9nq14k) + +### Array of Stores (#sample-source-array-stores) + +:::info{title="since"} +[effector 20.8.0](https://changelog.effector.dev/#effector-20-8-0) +::: + +`sample` can be called with an array of [_Store_](/en/api/effector/Store) as `source`: + +> Note: Typescript requires adding `as const` after the array is entered. + +```ts +import { createStore, createEvent, sample } from "effector"; + +const trigger = createEvent(); + +const $a = createStore("A"); +const $b = createStore(1); + +// Target has type `Event<[string, number]>` +const target = sample({ + clock: trigger, + source: [$a, $b] as const, +}); + +target.watch((obj) => { + console.log("sampled array", obj); +}); + +// You can easily destructure arguments to set explicit names +target.watch(([a, b]) => { + console.log("explicit names", a, b); +}); + +trigger(); +// => sampled array ["A", 1] +// => explicit names "A" 1 +``` + +[Try it](https://share.effector.dev/duqTwRgT) + +### Array of _Units_ in `sample({ clock })` (#sample-clock-array) + +:::info{title="since"} +[effector 21.2.0](https://changelog.effector.dev/#effector-21-2-0) +::: + +`clock` field in `sample` supports passing arrays of units, acting similarly to a `merge` call. + +```js +import {createStore, createEvent, createEffect, sample, merge} from 'effector' + +const showNotification = createEvent() +const trigger = createEvent() +const fx = createEffect() +const $store = createStore('') + +// array of units in `clock` +sample({ + clock: [trigger, fx.doneData], + source: $store, + target: showNotification, +}) + +// merged unit in `clock` +sample({ + clock: merge([trigger, fx.doneData]), + source: $store, + target: showNotification, +}) +``` + +[Try it](https://share.effector.dev/1YEHUFs7) + +## Filtering updates with `sample({ filter })` (#sample-filter) + +:::info{title="since"} +[effector 22.2.0](https://changelog.effector.dev/#effector-22-2-0) +::: + +The new variant of the `sample` works the same but with one extra method `filter`. Whenever `filter` returns `true` continue execution otherwise cancel. Let's see an example below. + +Henry wants to send money to William. Henry – sender and William – recipient. To send money, sender should know the recipient address, besides sender has to sign the transaction. This example shows how exactly the `sample` works with a `filter`. The main points are: + +1. Make sure balance is positive and more than sending amount +2. Having recipient address +3. Signed transaction +4. Make sure sender balance has been changed + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const sign = createEvent(); +const sentMoney = createEvent(); +const $recipientAddress = createStore("a23x3xd"); +const $balance = createStore(20000); +const $isSigned = createStore(false); +const transactionFx = createEffect( + ({ amountToSend, recipientAddress }) => + new Promise((res) => + setTimeout(res, 3000, { + amount: amountToSend, + recipientAddress, + }), + ), +); + +$isSigned.on(sign, () => true).reset(transactionFx); +$balance.on(transactionFx.doneData, (balance, { amount }) => balance - amount); + +sample({ + source: { + recipientAddress: $recipientAddress, + isSigned: $isSigned, + balance: $balance, + }, + clock: sentMoney, + filter: ({ isSigned, balance }, amountToSend) => isSigned && balance > amountToSend, + fn({ recipientAddress }, amountToSend) { + return { recipientAddress, amountToSend }; + }, + target: transactionFx, +}); + +$balance.watch((balance) => console.log("balance: ", balance)); +$isSigned.watch((isSigned) => console.log("is signed: ", isSigned)); + +sign(); +sentMoney(1000); +``` + +[Try it](https://share.effector.dev/XTxkCYC0) + + diff --git a/src/content/docs/en/api/effector/scopeBind.md b/src/content/docs/en/api/effector/scopeBind.md new file mode 100644 index 0000000..6b0aa99 --- /dev/null +++ b/src/content/docs/en/api/effector/scopeBind.md @@ -0,0 +1,115 @@ +--- +title: scopeBind +description: scopeBind is a method to bind unit to scope +redirectFrom: + - /api/effector/scopeBind + - /docs/api/effector/scopeBind +--- + +```ts +import { scopeBind } from "effector"; +``` + +`scopeBind` is a method to bind a unit (an Event or Effect) to a [Scope](/en/api/effector/Scope) to be called later. Effector supports imperative calling of events within watchers, however, there are instances where you must explicitly bind events to the scope, such as when triggering events from within `setTimeout` or `setInterval` callbacks. + +# Methods (#scopeBind-methods) + +## `scopeBind(event, options?)` (#scopeBind-methods-scopeBind-event) + +### Formulae (#scopeBind-methods-scopeBind-event-formulae) + +```ts +scopeBind(event: EventCallable): (payload: T) => void +scopeBind(event: EventCallable, options?: {scope?: Scope, safe?: boolean}): (payload: T) => void +``` + +### Arguments (#scopeBind-methods-scopeBind-event-arguments) + +1. `event` [_EventCallable_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect) to be bound to the scope. +2. `options` (_Object_): Optional configuration. + - `scope` (_Scope_): Scope to bind event to. + - `safe` (_Boolean_): Flag for exception suppression if there is no scope. + +### Returns (#scopeBind-methods-scopeBind-event-returns) + +`(payload: T) => void` — A function with the same types as `event`. + +### Examples (#scopeBind-methods-scopeBind-event-examples) + +#### Basic Usage (#scopeBind-methods-scopeBind-event-examples-basic-usage) + +We are going to call `changeLocation` inside `history.listen` callback so there is no way for effector to associate event with corresponding scope, and we should explicitly bind event to scope using `scopeBind`. + +```ts +const $history = createStore(history); +const initHistory = createEvent(); +const changeLocation = createEvent(); + +const installHistoryFx = attach({ + source: $history, + effect: (history) => { + const locationUpdate = scopeBind(changeLocation); + + history.listen((location) => { + locationUpdate(location); + }); + }, +}); + +sample({ + clock: initHistory, + target: installHistoryFx, +}); +``` + +[See full example](https://share.effector.dev/nJo1zRil) + +## `scopeBind(callback, options?)` (#scopeBind-methods-scopeBind-callback) + +Binds arbitrary callback to a scope to be called later. The bound version of the function retains all properties of the original, e.g., if the original function would throw when called with a certain argument, the bound version will also throw under the same circumstances. + +:::info{title="since"} +Feature is available since `effector 23.1.0` release. +::: + +:::warning +To be compatible with the Fork API, callbacks **must** adhere to the same rules as `Effect` handlers: + +- Synchronous functions can be used as they are. +- Asynchronous functions must follow the [rules described in "Imperative Effect calls with scope"](/en/api/effector/scope/). + +::: + +### Formulae (#scopeBind-methods-scopeBind-callback-formulae) + +```ts +scopeBind(callback: T, options?: { scope?: Scope; safe?: boolean }): (payload: T) => void; +``` + +### Arguments (#scopeBind-methods-scopeBind-callback-arguments) + +1. `callback` (_Function_): Any function to be bound to the scope. +2. `options` (_Object_): Optional configuration. + - `scope` (_Scope_): Scope to bind the event to. + - `safe` (_Boolean_): Flag for exception suppression if there is no scope. + +### Returns (#scopeBind-methods-scopeBind-callback-returns) + +`(payload: T) => void` — A function with the same types as `callback`. + +### Examples (#scopeBind-methods-scopeBind-callback-examples) + +```ts +const locationChanged = createEvent(); + +const listenToHistoryFx = attach({ + source: $history, + effect: (history) => { + return history.listen( + scopeBind((location) => { + locationChanged(location); + }), + ); + }, +}); +``` diff --git a/src/content/docs/en/api/effector/serialize.md b/src/content/docs/en/api/effector/serialize.md new file mode 100644 index 0000000..4a282ce --- /dev/null +++ b/src/content/docs/en/api/effector/serialize.md @@ -0,0 +1,107 @@ +--- +title: serialize +description: serialize is a method for serializing application states within a scope +redirectFrom: + - /api/effector/serialize + - /docs/api/effector/serialize +--- + +```ts +import { serialize, type Scope } from "effector"; +``` + +# Methods (#methods) + +## `serialize(scope, params)` (#methods-serialize) + +A companion method for [_fork_](/en/api/effector/fork). It allows us to get a serialized value for all the store states within a [scope](/en/api/effector/Scope). The main purpose is an application state serialization on the server side during SSR. + +:::warning{title="Requirements"} +[_Babel plugin_](/en/api/effector/babel-plugin) or [_SWC plugin_](https://github.com/effector/swc-plugin) is required for using this method, as these plugins provide the SIDs for stores, which are required for stable state serialization. + +You can find deep-dive [explanation here](/en/explanation/sids) +::: + +### Formulae (#methods-serialize-formulae) + +```ts +serialize(scope: Scope, { ignore?: Array>; onlyChanges?: boolean }): {[sid: string]: any} +``` + +### Arguments (#methods-serialize-arguments) + +1. `scope` [_Scope_](/en/api/effector/Scope): a scope object (forked instance) +2. `ignore` Optional array of [_Store_](/en/api/effector/Store) to be omitted during serialization (added 20.14.0) +3. `onlyChanges` Optional boolean flag to ignore stores which didn't change in fork (prevent default values from being carried over network) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) property `onlyChanges` is deprecated. +::: + +### Returns (#methods-serialize-returns) + +An object with store values using sids as a keys + +:::warning{title="Reminder"} +If a store [does not have a sid](/en/api/effector/babel-plugin#sid), its value will be omitted during serialization. +::: + +### Examples (#methods-serialize-examples) + +#### Serialize forked instance state (#methods-serialize-examples-serializeForkedInstanceState) + +```js +import { createDomain, fork, serialize } from "effector"; + +const domain = createDomain(); +const $store = domain.createStore(42); +const scope = fork(domain); + +console.log(serialize(scope)); // => {[sid]: 42} +``` + +[Try it](https://share.effector.dev/zlRJbjei) + +#### Using with `onlyChanges` (#methods-serialize-examples-usingWithOnlyChanges) + +With `onlyChanges`, this method will serialize only stores which were changed by some trigger during work or defined in `values` field by [fork](/en/api/effector/fork) or [hydrate(scope)](/en/api/effector/hydrate). Once being changed, a store will stay marked as changed in given scope even if it was turned back to the default state during work, otherwise client will not update that store on its side, which is unexpected and inconsistent. +This allows us to hydrate client state several times, for example, during route changes in next.js + +```js +import { createDomain, fork, serialize, hydrate } from "effector"; + +const app = createDomain(); + +/** store which we want to hydrate by server */ +const $title = app.createStore("dashboard"); + +/** store which is not used by server */ +const $clientTheme = app.createStore("light"); + +/** scope in client app */ +const clientScope = fork(app, { + values: new Map([ + [$clientTheme, "dark"], + [$title, "profile"], + ]), +}); + +/** server side scope of chats page created for each request */ +const chatsPageScope = fork(app, { + values: new Map([[$title, "chats"]]), +}); + +/** this object will contain only $title data + * as $clientTheme never changed in server scope */ +const chatsPageData = serialize(chatsPageScope, { onlyChanges: true }); +console.log(chatsPageData); +// => {'-l644hw': 'chats'} + +/** thereby, filling values from a server will touch only relevant stores */ +hydrate(clientScope, { values: chatsPageData }); + +console.log(clientScope.getState($clientTheme)); +// => dark +``` + +[Try it](https://share.effector.dev/BQhzISFV) diff --git a/src/content/docs/en/api/effector/split.md b/src/content/docs/en/api/effector/split.md new file mode 100644 index 0000000..bf7c365 --- /dev/null +++ b/src/content/docs/en/api/effector/split.md @@ -0,0 +1,398 @@ +--- +title: split +redirectFrom: + - /api/effector/split + - /docs/api/effector/split +--- + +```ts +import { split } from "effector"; +``` + +Choose one of cases by given conditions. It "splits" source unit into several events, which fires when payload matches their conditions. Works like pattern matching for payload values and external stores + +# Concepts (#concepts) + +## Case mode (#concepts-case-mode) + +Mode in which target case is selected by the name of its field. Case could be selected from data in `source` by [case function](/en/api/effector/split#case-function) or from external [case store](/en/api/effector/split#case-store) which kept current case name. After selection data from `source` will be sent to corresponding `cases[fieldName]` (if there is one), if none of the fields matches, then the data will be sent to `cases.__` (if there is one). + +**See also**: + +- [case store](/en/api/effector/split#case-store) +- [case function](/en/api/effector/split#case-function) + +## Matching mode (#concepts-matching-mode) + +Mode in which each case is sequentially matched by stores and functions in fields of `match` object. +If one of the fields got `true` from store value or return of function, then the data from `source` will be sent to corresponding `cases[fieldName]` (if there is one), if none of the fields matches, then the data will be sent to `cases.__` (if there is one) + +**See also**: + +- [matcher store](/en/api/effector/split#matcher-store) +- [matcher function](/en/api/effector/split#matcher-function) + +## Case store (#concepts-case-store) + +Store with a string which will be used to choose the case by its name. Placed directly in `match` field. + +```ts +split({ + source: Unit + // case store + match: Store<'first' | 'second'>, + cases: { + first: Unit, + second: Unit, + __?: Unit + } +}) +``` + +## Case function (#concepts-case-function) + +String-returning function which will be called with value from `source` to choose the case by its name. Placed directly in `match` field, [should be **pure**](/en/explanation/glossary#purity) + +```ts +split({ + source: Unit + // case function + match: (value: T) => 'first' | 'second', + cases: { + first: Unit, + second: Unit, + __?: Unit + } +}) +``` + +## Matcher store (#concepts-matcher-store) + +Boolean store which indicates whether to choose the particular case or try the next one. Placed in fields of `match` object, might be mixed with [matcher functions](/en/api/effector/split#matcher-function) + +```ts +split({ + source: Unit + match: { + // matcher store + first: Store, + second: Store + }, + cases: { + first: Unit, + second: Unit, + __?: Unit + } +}) +``` + +## Matcher function (#concepts-matcher-function) + +:::info +Case store, case function and matcher store are supported since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +Boolean-returning function which indicates whether to choose the particular case or try the next one. Placed in fields of `match` object, might be mixed with [matcher stores](/en/api/effector/split#matcher-store), [should be **pure**](/en/explanation/glossary#purity) + +```ts +split({ + source: Unit + match: { + // matcher function + first: (value: T) => boolean, + second: (value: T) => boolean + }, + cases: { + first: Unit, + second: Unit, + __?: Unit + } +}) +``` + +# Methods (#methods) + +## `split({ source, match, cases })` (#methods-split-source-match-cases) + +:::info{title="since"} +[effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) +::: + +### Formulae (#methods-split-source-match-cases-formulae) + +```ts +split({ source, match, cases }); +``` + +```ts +split({ + source: Unit + // case function + match: (data: T) => 'a' | 'b', + cases: { + a: Unit, + b: Unit, + __?: Unit + } +}) +split({ + source: Unit + // case store + match: Store<'a' | 'b'>, + cases: { + a: Unit, + b: Unit, + __?: Unit + } +}) +split({ + source: Unit + match: { + // matcher function + a: (data: T) => boolean, + // matcher store + b: Store + }, + cases: { + a: Unit, + b: Unit, + __?: Unit + } +}) +``` + +### Arguments (#methods-split-source-match-cases-arguments) + +- `source`: [Unit](/en/explanation/glossary#common-unit) which will trigger computation in `split` +- `match`: Single [store with string](/en/api/effector/split#case-store), single [function which returns string](/en/api/effector/split#case-function) or object with [boolean stores](/en/api/effector/split#matching-store) and [functions which returns boolean](/en/api/effector/split#matching-function) +- `cases`: Object with [units](/en/explanation/glossary#common-unit) to which data will be passed from `source` after case selection + +### Returns (#methods-split-source-match-cases-returns) + +`void` + +### Examples (#methods-split-source-match-cases-examples) + +#### Basic (#methods-split-source-match-cases-examples-basic) + +```js +import { split, createEffect, createEvent } from "effector"; +const messageReceived = createEvent(); +const showTextPopup = createEvent(); +const playAudio = createEvent(); +const reportUnknownMessageTypeFx = createEffect(({ type }) => { + console.log("unknown message:", type); +}); + +split({ + source: messageReceived, + match: { + text: (msg) => msg.type === "text", + audio: (msg) => msg.type === "audio", + }, + cases: { + text: showTextPopup, + audio: playAudio, + __: reportUnknownMessageTypeFx, + }, +}); + +showTextPopup.watch(({ value }) => { + console.log("new message:", value); +}); + +messageReceived({ + type: "text", + value: "Hello", +}); +// => new message: Hello +messageReceived({ + type: "image", + imageUrl: "...", +}); +// => unknown message: image +``` + +[Try it](https://share.effector.dev/W6VYZbfH) + +#### Direct match (#methods-split-source-match-cases-examples-direct-match) + +You can match directly to store api as well: + +```js +import { split, createStore, createEvent, createApi } from "effector"; + +const messageReceived = createEvent(); + +const $textContent = createStore([]); + +split({ + source: messageReceived, + match: { + text: (msg) => msg.type === "text", + audio: (msg) => msg.type === "audio", + }, + cases: createApi($textContent, { + text: (list, { value }) => [...list, value], + audio: (list, { duration }) => [...list, `audio ${duration} ms`], + __: (list) => [...list, "unknown message"], + }), +}); + +$textContent.watch((messages) => { + console.log(messages); +}); + +messageReceived({ + type: "text", + value: "Hello", +}); +// => ['Hello'] +messageReceived({ + type: "image", + imageUrl: "...", +}); +// => ['Hello', 'unknown message'] +messageReceived({ + type: "audio", + duration: 500, +}); +// => ['Hello', 'unknown message', 'audio 500 ms'] +``` + +[Try it](https://share.effector.dev/32FNNk8H) + +## `split(source, match)` (#methods-split-source-match) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +### Formulae (#methods-split-source-match-formulae) + +```ts +split(source, match); +``` + +### Arguments (#methods-split-source-match-arguments) + +1. `source`: [Unit](/en/explanation/glossary#common-unit) which will trigger computation in `split` +2. `match` (_Object_): Schema of cases, which uses names of resulting events as keys, and matching function*((value) => Boolean)* + +### Returns (#methods-split-source-match-returns) + +(Object) – Object, having keys, defined in `match` argument, plus `__`(two underscores) – which stands for `default` (no matches met) case. + +### Examples (#methods-split-source-match-examples) + +#### Basic (#methods-split-source-match-examples-basic) + +```js +import { createEvent, split } from "effector"; + +const message = createEvent(); + +const messageByAuthor = split(message, { + bob: ({ user }) => user === "bob", + alice: ({ user }) => user === "alice", +}); +messageByAuthor.bob.watch(({ text }) => { + console.log("[bob]: ", text); +}); +messageByAuthor.alice.watch(({ text }) => { + console.log("[alice]: ", text); +}); + +message({ user: "bob", text: "Hello" }); +// => [bob]: Hello +message({ user: "alice", text: "Hi bob" }); +// => [alice]: Hi bob + +/* default case, triggered if no one condition met */ +const { __: guest } = messageByAuthor; +guest.watch(({ text }) => { + console.log("[guest]: ", text); +}); +message({ user: "unregistered", text: "hi" }); +// => [guest]: hi +``` + +[Try it](https://share.effector.dev/QXZsR5yM) + +:::info +Only the first met match will trigger resulting event +::: + +#### Another (#methods-split-source-match-examples-another) + +```js +import { createEvent, split } from "effector"; + +const message = createEvent(); + +const { short, long, medium } = split(message, { + short: (m) => m.length <= 5, + medium: (m) => m.length > 5 && m.length <= 10, + long: (m) => m.length > 10, +}); + +short.watch((m) => console.log(`short message '${m}'`)); +medium.watch((m) => console.log(`medium message '${m}'`)); +long.watch((m) => console.log(`long message '${m}'`)); + +message("Hello, Bob!"); +// => long message 'Hello, Bob!' + +message("Hi!"); +// => short message 'Hi!' +``` + +[Try it](https://share.effector.dev/ke2tM78I) + +## `split({ source, clock?, match, cases })` (#methods-split-source-clock-match-cases) + +:::info{title="since"} +[effector 22.2.0](https://changelog.effector.dev/#effector-22-2-0) +::: + +It works the same as [split with cases](/en/api/effector/split#methods-split-source-match-cases), however computations in `split` will be started after `clock` is triggered. + +### Formulae (#methods-split-source-clock-match-cases-formulae) + +```js +split({source, clock?, match, cases}) +``` + +### Arguments (#methods-split-source-clock-match-cases-arguments) + +TBD + +### Examples (#methods-split-source-clock-match-cases-examples) + +```js +const options = ["save", "delete", "forward"]; +const $message = createStore({ id: 1, text: "Bring me a cup of coffee, please!" }); +const $mode = createStore(""); +const selectedMessageOption = createEvent(); +const saveMessageFx = createEffect(() => "save"); +const forwardMessageFx = createEffect(() => "forward"); +const deleteMessageFx = createEffect(() => "delete"); + +$mode.on(selectedMessageOption, (_, opt) => options.find((item) => item === opt)); + +split({ + source: $message, + clock: selectedMessageOption, + match: $mode, + cases: { + save: saveMessageFx, + delete: deleteMessageFx, + forward: forwardMessageFx, + }, +}); + +selectedMessageOption("delet"); // nothing happens +selectedMessageOption("delete"); +``` + +[Try it](https://share.effector.dev/VJmD5KdN) diff --git a/src/content/docs/en/api/effector/withRegion.md b/src/content/docs/en/api/effector/withRegion.md new file mode 100644 index 0000000..24ac878 --- /dev/null +++ b/src/content/docs/en/api/effector/withRegion.md @@ -0,0 +1,62 @@ +--- +title: withRegion +redirectFrom: + - /api/effector/withRegion + - /docs/api/effector/withRegion +--- + +```ts +import { withRegion } from "effector"; +``` + +The method is based on the idea of region-based memory management (see [Region-based memory management](https://en.wikipedia.org/wiki/Region-based_memory_management) for reference). + +# Methods (#methods) + +## `withRegion(unit, callback)` (#methods-withRegion) + +:::info{title="since"} +[effector 20.11.0](https://changelog.effector.dev/#effector-20-11-0) +::: + +The method allows to explicitly transfer ownership of all units (including links created with `sample`, `forward`, etc...) defined in the callback to `unit`. As an implication, all the created links will be erased as soon as `clearNode` is called on [_Unit_](/en/explanation/glossary#unit). + +### Formulae (#methods-withRegion-unit-callback-formulae) + +```ts +withRegion(unit: Unit | Step, callback: () => void): void +``` + +### Arguments (#methods-withRegion-unit-callback-arguments) + +1. `unit`: _Unit_ | _Step_ — which will serve as "local area" or "region" owning all the units created within the provided callback. +2. `callback`: `() => void` — The callback where all the relevant units should be defined. + +### Examples (#methods-withRegion-unit-callback-examples) + +```js +import { createDomain, createEvent, restore, withRegion, clearNode } from "effector"; + +const first = createEvent(); +const second = createEvent(); +const $store = restore(first, ""); +const domain = createDomain(); + +withRegion(domain, () => { + // Following links created with `forward` or `sample` are owned by the provided unit `domain` + // and will be disposed as soon as `clearNode` is called on `domain`. + forward({ + from: second, + to: first, + }); +}); + +$store.watch(console.log); + +first("hello"); +second("world"); + +clearNode(domain); + +second("will not trigger updates of `$store`"); +``` diff --git a/src/content/docs/en/api/index.mdx b/src/content/docs/en/api/index.mdx new file mode 100644 index 0000000..3762232 --- /dev/null +++ b/src/content/docs/en/api/index.mdx @@ -0,0 +1,49 @@ +--- +title: API Reference +--- + +import FeatureCard from "@components/FeatureCard.astro"; +import IconReact from "@icons/React.astro"; +import IconVue from "@icons/Vue.astro"; +import IconSolid from "@icons/Solid.astro"; +import IconEffector from "@icons/Effector.astro"; + +# Effector Packages + +Effector provides a range of packages to accommodate your specific needs. There are packages supported by the core team. + +
    + + + + + + + + + + + + + + + + + +
    diff --git a/src/content/docs/en/conventions/naming.md b/src/content/docs/en/conventions/naming.md new file mode 100644 index 0000000..adb3a3f --- /dev/null +++ b/src/content/docs/en/conventions/naming.md @@ -0,0 +1,41 @@ +--- +title: Naming +description: Naming conventions for stores, events and effects +redirectFrom: + - /docs/conventions/naming + - /conventions/naming +--- + +First of all, to avoid any misconceptions and get better developer experience for all of us. This document contains several pretty simple rules to keep consistency between different projects written with effector. + +## Stores naming + +Your stores should be distinguished by a `$`. The choice between prefix or postfix is mostly a matter of personal preference. This should be done to have a better search experience in your IDE. + +```js +const $user = createStore({}); +``` + +## Effect naming + +It is recommended to add the `Fx` postfix to the end of your effects. It will let you differentiate your effects from the events. + +```js +const fetchUserFx = createEffect(async () => { + const res = await fetch("my pretty url"); + return res.json(); +}); +``` + +## Event naming + +There are no any specific rules for this. However, the proposal is to name events that directly trigger store updates, as like as they have already happened. + +```js +const emailChanged = createEvent(); + +$user.on(emailChanged, (state, email) => ({ + ...state, + email, +})); +``` diff --git a/src/content/docs/en/core-principles/own-your-data.md b/src/content/docs/en/core-principles/own-your-data.md new file mode 100644 index 0000000..aa24bdf --- /dev/null +++ b/src/content/docs/en/core-principles/own-your-data.md @@ -0,0 +1,11 @@ +--- +title: Own your data principle +redirectFrom: + - /core-principles/own-your-data +--- + +Effector will not force you to turn your data into abstract or custom entities – your data are your data and effector only provides infrastructure to handle it. + +That means that you should not use effector's entities (Store, Event, etc) to represent your data – only to describe the surrounding logic. + +- Effector Store with an array of other Stores inside – anti-pattern, use key-value pattern instead. diff --git a/src/content/docs/en/core-principles/releases.md b/src/content/docs/en/core-principles/releases.md new file mode 100644 index 0000000..278fdb5 --- /dev/null +++ b/src/content/docs/en/core-principles/releases.md @@ -0,0 +1,26 @@ +--- +title: Releases policy +redirectFrom: + - /core-principles/releases +--- + +The main goal of effector is to **make developer experience better**, as a part of this strategy we are committing to some rules of effector releases. + +## No breaking changes without prior deprecation + +Before each breaking change, the effector must provide a deprecation warning for **at least a year before.** + +For example: + +- When version 22 was released, feature "A" was marked as deprecated. The library gives a warning to the console when it is used. +- A year later, in version 23 release, feature "A" is removed. + +## Release cycle + +Major updates (i.e. with breaking changes) of the effector are released **no more than once a year.** + +Minor and patch updates (i.e., with fixes and new features) are released when ready. If a new feature requires breaking changes – it is also released in a major update. + +This is necessary to allow developers to plan their work smoothly, taking into account possible changes in effector. + +It also obliges effector maintainers to be extremely careful when designing new features and breaking changes to old library features, because the opportunity to remove or heavily modify something in the public API only appears once every two years. diff --git a/src/content/docs/en/core-principles/testing.md b/src/content/docs/en/core-principles/testing.md new file mode 100644 index 0000000..9e0a399 --- /dev/null +++ b/src/content/docs/en/core-principles/testing.md @@ -0,0 +1,13 @@ +--- +title: Testing +redirectFrom: + - /core-principles/testing +--- + +We believe that the only way to write good code is to test it. + +This has the following consequences: + +- Every effector function is created with testing in mind, so users don't have to come up with complicated ways to test their code. +- Effector is heavily tested itself. +- Any fixes or features without proper testing **will not be accepted**. diff --git a/src/content/docs/en/core-principles/typings.md b/src/content/docs/en/core-principles/typings.md new file mode 100644 index 0000000..a5e7833 --- /dev/null +++ b/src/content/docs/en/core-principles/typings.md @@ -0,0 +1,17 @@ +--- +title: Typings +redirectFrom: + - /core-principles/typing +--- + +We believe that good type support is a necessary part of good DX. + +## TypeScript + +Effector is aiming to provide first-class support of TypeScript types. +Effector is written in TypeScript, and there are [a lot of type-tests in the codebase, including auto-generated ones.](https://github.com/effector/effector/tree/master/src/types) + +However, TypeScript itself does not aim for [applying a sound or "provably correct" type system](https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals), instead it strikes a balance between correctness and productivity. +So, we cannot guarantee that all the types are correct, but we are going to do our best to provide the best possible type inference. + +Public typings of effector are [located here](https://github.com/effector/effector/blob/master/packages/effector/index.d.ts), separate from the main code of the library. diff --git a/src/content/docs/en/ecosystem-development/unit-shape-protocol.md b/src/content/docs/en/ecosystem-development/unit-shape-protocol.md new file mode 100644 index 0000000..211e8aa --- /dev/null +++ b/src/content/docs/en/ecosystem-development/unit-shape-protocol.md @@ -0,0 +1,69 @@ +--- +title: Protocol @@unitShape +description: Re-use UI-library bindings for your own effector-based libraries +redirectFrom: + - /docs/ecosystem-development/unit-shape-protocol + - /ecosystem-development/unit-shape-protocol +--- + +:::info +Available since [effector-react 22.4.0](https://changelog.effector.dev/#effector-react-22-4-0), effector-solid 0.22.7 +::: + +Effector provides a way to use units ([Stores](/en/api/effector/Store), [Events](/en/api/effector/Event), [Effects](/en/api/effector/Effect)) in UI libraries with a special bindings like `effector-react`, `effector-solid`, etc. Normally, they allow binding any shape of units to a UI-framework: + +```ts +import { createStore } from "effector"; +import { useUnit } from "effector-react"; + +const $value = createStore("Hello!"); + +const Component = () => { + const { value } = useUnit({ value: $value }); + + return

    {value}

    ; +}; +``` + +But what if you want to create your own library on top of effector with some custom entities? For example, you want to create a router library with a custom `Route` entity, and you want to allow users to use it with `effector-react` bindings: + +```ts +import { createRoute } from "my-router-library"; +import { useUnit } from "effector-react"; + +const mainPageRoute = createRoute(/* ... */); + +const Component = () => { + const { params } = useUnit(mainPageRoute); + + return

    {params.name}

    ; +}; +``` + +It is possible with the `@@unitShape` protocol. It allows defining the shape of a unit in the custom entity and then using it in UI libraries. Just add field `@@unitShape` with a function that return shape of units to your entity: + +```ts +function createRoute(/* ... */) { + const $params = createStore(/* ... */); + + return { + "@@unitShape": () => ({ + params: $params, + }), + }; +} +``` + +## FAQ + +--- + +**Q**: How frequently `@@unitShape`-function is called? + +**A**: As many times as `useUnit` itself is called – it depends on a UI-library. For example, `effector-react` calls it as any other hook – once per component render, but `effector-solid` calls `useUnit` once per component mount. + +--- + +**Q**: How can I know what UI-library is used for particular `@@unitShape` call? + +**A**: You cannot. `@@unitShape` has to be universal for all UI-libraries either has to check what UI-library is used inside by UI-library methods (like `Context` in React or Solid). diff --git a/src/content/docs/en/explanation/computation-priority.md b/src/content/docs/en/explanation/computation-priority.md new file mode 100644 index 0000000..7cd9654 --- /dev/null +++ b/src/content/docs/en/explanation/computation-priority.md @@ -0,0 +1,70 @@ +--- +title: Computation priority +description: How effector calculates units +redirectFrom: + - /en/advanced-guide/computation-priority + - /explanation/computation-priority + - /docs/advanced-guide/computation-priority + - /docs/explanation/computation-priority +--- + +For sure, you've noticed that function [should be pure](/en/explanation/glossary#purity)... or watch if there is a place +for side effect. We will talk about this in the current section – **Computation priority** + +A real example of queue priority — people waiting for medical treatment in a hospital, extreme emergency cases will have +the highest priority and move to the start of the queue and less significant to the end. + +Computation priority allows us to have side effects, and it's one of the main reasons to create this concept: + +- Letting pure functions to execute first. +- Side effects can follow a consistent state of the application. + +Actually, pure computation cannot be observed out of the scope, therefore, the definition of **_pure computation_** used +in this library gives us an opportunity to optimize grouping. + +Priority: + +[Source code](https://github.com/effector/effector/blob/master/src/effector/kernel.ts#L169) + +``` +1. child -> forward +2. pure -> map, on +3. sampler -> sample, guard, combine +4. effect -> watch, effect handler +``` + +> Whenever you allow side effects in pure computations, the library will work by the worst scenario. Thereby, increasing non-consistency of application and breaking pure computations. Don't ignore that. + +Let's consider prioritizing in the example below. + +```js +let count = 0; +const fx = createEffect(() => { + // side effect 1 + count += 1; +}); + +fx.done.watch(() => { + // side effect 1 already executed + console.log("expect count to be 1", count === 1); + // side effect 2 + count += 1; +}); + +fx(); +// side effect 1 already executed +// side effect 2 already executed as well +// that's what we expected to happen +// that's watchmen effect +console.log("expect count to be 2", count === 2); +// example which violated that agreement: setState in react +// which defer any side effect long after setState call itself +``` + +[Try it](https://share.effector.dev/IRAmt9Uq) + +:::info +Whenever a library notices side effect in a pure function it moves it to the end of the [**priority queue**](https://en.wikipedia.org/wiki/Priority_queue). +::: + +We hope that this information cleared some things on how the library works. diff --git a/src/content/docs/en/explanation/events.md b/src/content/docs/en/explanation/events.md new file mode 100644 index 0000000..59c84ab --- /dev/null +++ b/src/content/docs/en/explanation/events.md @@ -0,0 +1,183 @@ +--- +title: Events +keywords: + - event + - unit +description: How events works, where to use +--- + +The **Event** in effector represents a user action, a step in the application process, a command to execute, or an intention to make modifications, among other things. This unit is designed to be a carrier of information/intention/state within the application, not the holder of a state. + +In most situations, it is recommended to create events directly within the module, rather than placing them within conditional statements or classes, in order to maintain simplicity and readability. An exception to this recommendation is the use of factory functions; however, these should also be invoked at the root level of the module. + +:::info +Event instances persist throughout the entire runtime of the application and inherently represent a portion of the business logic. + +Attempting to delete instances and clear memory for the purpose of saving resources is not advised, as it may adversely impact the functionality and performance of the application. +::: + +## Calling the event (#event-calling) + +There are two ways to trigger event: imperative and declarative. + +The **imperative** method involves invoking the event as if it were a function: + +```ts +import { createEvent } from "effector"; + +const callHappened = createEvent(); + +callHappened(); // event triggered +``` + +The **declarative** approach utilizes the event as a target for operators, such as sample, or as an argument when passed into factory functions: + +```ts +import { createEvent, sample } from "effector"; + +const firstTriggered = createEvent(); +const secondTriggered = createEvent(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); +``` + +> When the `firstTriggered` event is invoked, the `secondTriggered` event will be subsequently called, creating a sequence of events. + +This method is employed to link various units within a single event chain. In most cases, the chain will have multiple branches, allowing for diverse interactions and processes within the application logic. + +**You need to know:** In Effector, any event supports only **a single argument**. +It is not possible to call an event with two or more arguments, as in `someEvent(first, second)`. + +All arguments beyond the first will be ignored. +The core team has implemented this rule for specific reasons related to the design and functionality. +This approach enables the argument to be accessed in any situation without adding types complexity. + +If multiple arguments need to be passed, encapsulate them within an object: + +```ts +import { createEvent } from "effector"; +const requestReceived = createEvent<{ id: number; title: string }>(); +requestReceived({ id: 1, title: "example" }); +``` + +This rule also contributes to the clarity of each argument's meaning, both at the call side and subscription side. It promotes clean and organized code, making it easier to understand and maintain. + +## Watching the event (#event-watch) + +To ascertain when an event is called, effector and its ecosystem offer various methods with distinct capabilities. Debugging is the primary use case for this purpose, and we highly recommend using [`patronum/debug`](https://patronum.effector.dev/methods/debug/) to display when an event is triggered and the argument it carries. + +```ts +import { createEvent, sample } from "effector"; +import { debug } from "patronum"; + +const firstTriggered = createEvent(); +const secondTriggered = createEvent(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); + +debug(firstTriggered, secondTriggered); + +firstTriggered(); +// => [event] firstTriggered undefined +// => [event] secondTriggered undefined +``` + +However, if your environment does not permit the addition of further dependencies, you may use the `.watch()` method with caution. + +```ts +import { createEvent, sample } from "effector"; + +const firstTriggered = createEvent(); +const secondTriggered = createEvent(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); + +firstTriggered.watch(() => console.info("[event] firstTriggered")); +secondTriggered.watch(() => console.info("[event] secondTriggered")); + +firstTriggered(); +// => [event] firstTriggered +// => [event] secondTriggered +``` + +:::tip{title="Keep in mind"} +The `watch` method neither handles nor reports exceptions, manages the completion of asynchronous operations, nor addresses data race issues. + +Its primary intended use is for short-term debugging and logging purposes. +::: + +## Working with TypeScript (#typescript) + +When an event is invoked, TypeScript will verify that the type of the argument passed matches the type defined in the event, ensuring consistency and type safety within the code. + +This is also works for operators like `sample` or `split`: + +```ts +import { sample, createEvent } from "effector"; + +const someHappened = createEvent(); +const anotherHappened = createEvent(); + +sample({ + // @ts-expect-error error: "clock should extend target type"; targets: { clockType: number; targetType: string; } + clock: someHappened, + target: anotherHappened, +}); +``` + +[Try it](https://tsplay.dev/WyoPKN) + +To specify the argument type for an event, it is essential to first determine the intended purpose, what do you want to do with this event: + +- If you intend to **invoke** an event or use it as a target, you should utilize the `EventCallable` type. +- If your goal is to **subscribe** to updates, or use the event as a `clock` or `source`, you should employ the `Event` type. + +_Where `T` represents the type of the event's argument._ + +```ts +import { type Event, createStore, createEvent } from "effector"; + +function createCounter(counterChanged: Event) { + const $counter = createStore(0); + sample({ + clock: $counter, + target: counterChanged, + }); +} + +const whenCounterChanged = createEvent(); +createCounter(whenCounterChanged); +``` + +## Using `Event` (#event-using) + +A `Event` is a super type of `EventCallable` with different approach. Firstly, invoking a `Event` is not allowed, and it cannot be used as a target in the sample operator, and so on. + +The primary purpose of a `Event` is to be triggered by internal code withing the effector library or ecosystem. For instance, the `.map()` method returns a `Event`, which is subsequently called by the `.map()` method itself. + +To utilize the `Event` type, simply import it from the `"effector"` package and integrate it into your code as needed: + +```ts +import { type Event, createStore, createEvent } from "effector"; + +function createCounter(increment: Event) { + const $counter = createStore(0); + + $counter.on(increment, (count) => count + 1); +} + +const incrementCounter = createEvent(); +createCounter(incrementCounter); +incrementCounter(); +``` + +It is allowed to pass `EventCallable` into argument with type `Event`. The primary purpose of Event is to accept any event type while explicitly signaling the code's intention to listen to the event, rather than invoking it. diff --git a/src/content/docs/en/explanation/glossary.md b/src/content/docs/en/explanation/glossary.md new file mode 100644 index 0000000..f09aebc --- /dev/null +++ b/src/content/docs/en/explanation/glossary.md @@ -0,0 +1,162 @@ +--- +title: Glossary +description: Glossary of basic terms in effector +redirectFrom: + - /docs/glossary + - /docs/explanation/glossary + - /explanation/glossary + - /en/glossary +--- + +Glossary of basic terms in effector. + +## Event (#event) + +_Event_ is a function you can subscribe to. It can be an intention to change the store, indication of something happening in the application, a command to be executed, aggregated analytics trigger and so on. + +[Event](/en/api/effector/Event) in api documentation + +## Store (#store) + +_Store_ is an object that holds state. +There can be multiple stores. + +[Store](/en/api/effector/Store) in api documentation + +## Effect (#effect) + +_Effect_ is a container for (possibly async) side effects. +It exposes special events and stores, such as `.pending`, `.done`, `.fail`, `.finally`, etc... + +It can be safely used in place of the original async function. + +It returns promise with the result of a function call. + +The only requirement for the function: + +- **Must** have zero or one argument + +[Effect](/en/api/effector/Effect) in api documentation + +## Domain (#domain) + +_Domain_ is a namespace for your events, stores and effects. + +Domains are notified when events, stores, effects, or nested domains are created via `.onCreateEvent`, `.onCreateStore`, `.onCreateEffect`, `.onCreateDomain` methods. + +It is useful for logging or other side effects. + +[Domain](/en/api/effector/Domain) in api documentation + +## Unit (#unit) + +Data type used to describe business logic of applications. Most of the effector methods deal with unit processing. +There are five unit types: [Store](/en/api/effector/Store), [Event](/en/api/effector/Event), [Effect](/en/api/effector/Effect), [Domain](/en/api/effector/Domain) and [Scope](/en/api/effector/Scope). + +## Common unit (#common-unit) + +Common units can be used to trigger updates of other units. There are three common unit types: [Store](/en/api/effector/Store), [Event](/en/api/effector/Event) and [Effect](/en/api/effector/Effect). **When a method accepts units, it means that it accepts events, effects, and stores** as a source of reactive updates. + +## Purity (#purity) + +Most of the functions in api must not call other events or effects: it's easier to reason about application's data flow when imperative triggers are grouped inside watchers and effect handlers rather than spread across entire business logic. + +**Correct**, imperative: + +```js +import { createStore, createEvent } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => login.length); + +$loginSize.watch((size) => { + submitLoginSize(size); +}); +``` + +[Try it](https://share.effector.dev/D5hV8C70) + +Reference: [Store.map](/en/api/effector/Store#map-fn), [Store.watch](/en/api/effector/Store#watch-watcher) + +**Better**, declarative: + +```js +import { createStore, createEvent, sample } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => login.length); + +sample({ + clock: $loginSize, + target: submitLoginSize, +}); +``` + +[Try it](https://share.effector.dev/it0gXQLI) + +Reference: [sample](/en/api/effector/sample) + +**Incorrect**: + +```js +import { createStore, createEvent } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => { + // no! use `sample` instead + submitLoginSize(login.length); + return login.length; +}); +``` + +## Reducer (#reducer) + +```typescript +type StoreReducer = (state: State, payload: E) => State | void; +type EventOrEffectReducer = (state: T, payload: E) => T; +``` + +_Reducer_ calculates a new state given the previous state and an event's payload. For stores, if reducer returns undefined or the same state (`===`), then there will be no update for a given store. + +## Watcher (#watcher) + +```typescript +type Watcher = (update: T) => any; +``` + +_Watcher_ is used for **side effects**. Accepted by [Event.watch](/en/api/effector/Event#watch-watcher), [Store.watch](/en/api/effector/Store#watchwatcher) and [Domain.onCreate\* hooks](/en/api/effector/Domain#oncreateeventhook). Return value of a watcher is ignored. + +## Subscription (#subscription) + +```ts +import { type Subscription } from "effector"; +``` + +Looks like: + +```typescript +type Subscription = { + (): void; + unsubscribe(): void; +}; +``` + +**Function**, returned by [forward](/en/api/effector/forward), [Event.watch](/en/api/effector/Event#event-watch-watcher), [Store.watch](/en/api/effector/Store#methods-watch-watcher) and some other methods. Used for cancelling a subscription. After the first call, subscription will do nothing. + +:::warning +**Managing subscriptions manually distracts from business logic improvements.** +

    +Effector provides a wide range of features to minimize the need to remove subscriptions. This sets it apart from most other reactive libraries. +::: + +[effect]: /en/api/effector/Effect +[store]: /en/api/effector/Store +[event]: /en/api/effector/Event +[domain]: /en/api/effector/Domain +[scope]: /en/api/effector/Scope diff --git a/src/content/docs/en/explanation/prior-art.md b/src/content/docs/en/explanation/prior-art.md new file mode 100644 index 0000000..b2c7df0 --- /dev/null +++ b/src/content/docs/en/explanation/prior-art.md @@ -0,0 +1,33 @@ +--- +id: prior-art +title: Prior Art +redirectFrom: + - /en/advanced-guide/prior-art + - /explanation/prior-art + - /docs/explanation/prior-art + - /advanced-guide/prior-art +--- + +## Papers + +- **Functional Pearl. Weaving a Web** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/weaver+zipper.pdf) _Ralf Hinze and Johan Jeuring_ +- **A graph model of data and workflow provenance** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/A+graph+model+of+data+and+workflow+provenance.pdf)
    _Umut Acar, Peter Buneman, James Cheney, Jan Van den Bussche, Natalia Kwasnikowska and Stijn Vansummeren_ +- **An Applicative Control-Flow Graph Based on Huet’s Zipper** [[pdf]](http://zero-bias-papers.s3-website-eu-west-1.amazonaws.com/zipcfg.pdf)
    _Norman Ramsey and Joao Dias_ +- **Elm: Concurrent FRP for Functional GUIs** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/elm-concurrent-frp.pdf)
    _Evan Czaplicki_ +- **Inductive Graphs and Functional Graph Algorithms** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Inductive+Graphs+and+Functional+Graph+Algorithms.pdf)
    _Martin Erwig_ +- **Notes on Graph Algorithms Used in Optimizing Compilers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Graph+Algorithms+Used+in+Optimizing+Compilers.pdf)
    _Carl D. Offner_ +- **Backtracking, Interleaving, and Terminating Monad Transformers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Backtracking%2C+Interleaving%2C+and+Terminating+Monad+Transformers.pdf)
    _Oleg Kiselyov, Chung-chieh Shan, Daniel P. Friedman and Amr Sabry_ +- **Typed Tagless Final Interpreters** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Typed+Tagless+Final+Interpreters.pdf) _Oleg Kiselyov_ + +## Books + +- **Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions** [[book]](https://www.amazon.com/o/asin/0321200683/ref=nosim/enterpriseint-20), [[messaging patterns overview]](https://www.enterpriseintegrationpatterns.com/patterns/messaging/)
    _Gregor Hohpe and Bobby Woolf_ + +## API + +- [re-frame](https://github.com/day8/re-frame) +- [flux](https://facebook.github.io/flux/) +- [redux](https://redux.js.org/) +- [redux-act](https://github.com/pauldijou/redux-act) +- [most](https://github.com/cujojs/most) +- nodejs [events](https://nodejs.org/dist/latest-v12.x/docs/api/events.html#events_emitter_on_eventname_listener) diff --git a/src/content/docs/en/explanation/sids.md b/src/content/docs/en/explanation/sids.md new file mode 100644 index 0000000..4d158ff --- /dev/null +++ b/src/content/docs/en/explanation/sids.md @@ -0,0 +1,322 @@ +--- +title: SIDs +description: Stable IDentifiers +redirectFrom: + - /en/explanation/sids + - /explanation/sids + - /docs/explanation/sids +--- + +The SID is a Stable IDentifier of an effector unit. It can be used for different purposes, but the main use case is Server Side Rendering. + +The SIDs have two important properties: + +1. They are **unique** – each SID for each unit should be unique. +2. They are **stable** between different environments – each SID of each unit in some environment (e.g. server code) should be equal to a SID of this unit in any other environment (e.g. client code). + +## How to add SIDs (#how-to-add-sids) + +The SIDs can be added manually and automatically, but it is important that they are set before any bundling happens — otherwise, there is no way to guarantee stability. + +### Manual way (#how-to-add-sids-manual) + +```tsx +import { createStore } from "effector"; + +export const $myStore = createStore(42, { sid: "my-stable-id" }); +``` + +It is important, that all SIDs are also **unique**. If you are using the manual way, you have to guarantee that by yourself. + +### Automatic way (#how-to-add-sids-automatic) + +For sure, manually creating unique ids is a quite boring job. + +Thankfully, there are [`effector/babel-plugin`](/api/effector/babel-plugin) and [`@effector/swc-plugin`](https://github.com/effector/swc-plugin), which will provide SIDs automatically. + +Because code-transpilation tools are working at the file level and are run before bundling happens – it is possible to make SIDs **stable** for every environment. + +:::tip +It is preferable to use [`effector/babel-plugin`](/api/effector/babel-plugin) or [`@effector/swc-plugin`](https://github.com/effector/swc-plugin) instead of adding SIDs manually. +::: + +## Why do we need Stable Identifiers (#why-do-we-need-sids) + +Because of **multi-store** architecture, Effector code in the applications is written in **atomic** and **distributed** way and there is no single central "root store" or "controller", which needs to be notified about all stores/reducers/etc, created anywhere in the app. + +And since there is no central "root store" – no additional setup (like Reducer Manager, etc) is required to support micro-frontends and code-splitting, everything works out of the box. + +**Code example** + +Notice, that there is no central point at all – any event of any "feature" can be triggered from anywhere and the rest of them will react accordingly. + +```tsx +// src/features/first-name/model.ts +import { createStore, createEvent } from "effector"; + +export const firstNameChanged = createEvent(); +export const $firstName = createStore(""); + +$firstName.on(firstNameChanged, (_, firstName) => firstName); + +// src/features/last-name/model.ts +import { createStore, createEvent } from "effector"; + +export const lastNameChanged = createEvent(); +export const $lastName = createStore(""); + +$lastName.on(lastNameChanged, (_, lastName) => lastName); + +// src/features/form/model.ts +import { createEvent, sample, combine } from "effector"; + +import { $firstName, firstNameChanged } from "@/features/first-name"; +import { $lastName, lastNameChanged } from "@/features/last-name"; + +export const formValuesFilled = createEvent<{ firstName: string; lastName: string }>(); + +export const $fullName = combine($firstName, $lastName, (first, last) => `${first} ${last}`); + +sample({ + clock: formValuesFilled, + fn: (values) => values.firstName, + target: firstNameChanged, +}); + +sample({ + clock: formValuesFilled, + fn: (values) => values.lastName, + target: lastNameChanged, +}); +``` + +If this application was a SPA or any other kind of client-only app — this would be the end of the article. + +### Serialization boundary (#serialization-boundary) + +But in the case of Server Side Rendering, there is always a **serialization boundary** — a point, where all state is stringified, added to a server response, and sent to a client browser. + +#### Problem (#serialization-boundary-problem) + +And at this point we **still need to collect the states of all stores of the app** somehow! + +Also, after the client browser has received a page — we need to "hydrate" everything back: unpack these values at the client and add this "server-calculated" state to client-side instances of all stores. + +#### Solution (#serialization-boundary-solution) + +This is a hard problem and to solve this, `effector` needs a way to connect the "server-calculated" state of some store with its client-side instance. + +While **it could be** done by introducing a "root store" or something like that, which would manage store instances and their state for us, it would also bring to us all the downsides of this approach, e.g. much more complicated code-splitting – so this is still undesirable. + +This is where SIDs will help us a lot. +Because SID is, by definition, the same for the same store in any environment, `effector` can simply rely on it to handle state serializing and hydration. + +#### Example (#serialization-boundary-example) + +This is a generic server-side rendering handler. The `renderHtmlToString` function is an implementation detail, which will depend on the framework you use. + +```tsx +// src/server/handler.ts +import { fork, allSettled, serialize } from "effector"; + +import { formValuesFilled } from "@/features/form"; + +async function handleServerRequest(req) { + const scope = fork(); // creates isolated container for application state + + // calculates the state of the app in this scope + await allSettled(formValuesFilled, { + scope, + params: { + firstName: "John", + lastName: "Doe", + }, + }); + + // extract scope values to simple js object of `{[storeSid]: storeState}` + const values = serialize(scope); + + const serializedState = JSON.stringify(values); + + return renderHtmlToString({ + scripts: [ + ` + + `, + ], + }); +} +``` + +Notice, that there are no direct imports of any stores of the application here. +The state is collected automatically and its serialized version already has all the information, which will be needed for hydration. + +When the generated response arrives in a client browser, the server state must be hydrated to the client stores. +Thanks to SIDs, state hydration also works automatically: + +```tsx +// src/client/index.ts +import { Provider } from "effector-react"; + +const serverState = window._SERVER_STATE_; + +const clientScope = fork({ + values: serverState, // simply assign server state to scope +}); + +clientScope.getState($lastName); // "Doe" + +hydrateApp( + + + , +); +``` + +At this point, the state of all stores in the `clientScope` is the same, as it was at the server and there was **zero** manual work to do it. + +## Unique SIDs (#unique-sids) + +The stability of SIDs is ensured by the fact, that they are added to the code before any bundling has happened. + +But since both `babel` and `swc` plugins are able "to see" contents of one file at each moment, there is a case, where SIDs will be stable, but **might not be unique** + +To understand why, we need to dive a bit deeper into plugin internals. + +Both `effector` plugins use the same approach to code transformation. Basically, they do two things: + +1. Add `sid`-s and any other meta-information to raw Effector's factories calls, like `createStore` or `createEvent`. +2. Wrap any custom factories with `withFactory` helper that allows you to make `sid`-s of inner units unique as well. + +### Built-in unit factories (#built-in-factories) + +Let's take a look at the first case. For the following source code: + +```ts +const $name = createStore(null); +``` + +The plugin will apply these transformations: + +```ts +const $name = createStore(null, { sid: "j3l44" }); +``` + +:::tip +Plugins create `sid`-s as a hash of the location in the source code of a unit. It allows making `sid`-s unique and stable. +::: + +### Custom factories (#custom-factories) + +The second case is about custom factories. These are usually created to abstract away some common pattern. + +Examples of custom factories: + +- `createQuery`, `createMutation` from [`farfetched`](https://farfetched.pages.dev/) +- `debounce`, `throttle`, etc from [`patronum`](https://patronum.effector.dev/) +- Any custom factory in your code, e.g. factory of a [feature-flag entity](https://farfetched.pages.dev/recipes/feature_flags.html) + +For this explanation, we will create a very simple factory: + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { createName } from "@/shared/lib/create-name"; + +const personOne = createName(); +const personTwo = createName(); +``` + +First, the plugin will add `sid` to the inner stores of the factory + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null, { sid: "ffds2" }); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { createName } from "@/shared/lib/create-name"; + +const personOne = createName(); +const personTwo = createName(); +``` + +But it's not enough, because we can create two instances of `createName` and internal stores of both of these instances will have the same SIDs! +These SIDs will be stable, but not unique. + +To fix it we need to inform the plugin about our custom factory: + +```json +// .babelrc +{ + "plugins": [ + [ + "effector/babel-plugin", + { + "factories": ["@/shared/lib/create-name"] + } + ] + ] +} +``` + +Since the plugin "sees" only one file at a time, we need to provide it with the actual import path used in the module. + +:::tip +If relative import paths are used in the module, then the full path from the project root must be added to the `factories` list, so the plugin could resolve it. + +If absolute or aliased (like in the example) paths are used, then specifically this aliased path must be added to the `factories` list. + +Most of the popular ecosystem projects are already included in plugin's default settings. +::: + +Now the plugin knows about our factory and it will wrap `createName` with the internal `withFactory` helper: + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null, { sid: "ffds2" }); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { withFactory } from "effector"; +import { createName } from "@/shared/lib/create-name"; + +const personOne = withFactory({ + sid: "gre24f", + fn: () => createName(), +}); +const personTwo = withFactory({ + sid: "lpefgd", + fn: () => createName(), +}); +``` + +Thanks to that `sid`-s of inner units of a factory are also unique, and we can safely serialize and deserialize them. + +```ts +personOne.$name.sid; // gre24f|ffds2 +personTwo.$name.sid; // lpefgd|ffds2 +``` diff --git a/src/content/docs/en/guides/migration-guide-v23.md b/src/content/docs/en/guides/migration-guide-v23.md new file mode 100644 index 0000000..7d67e1a --- /dev/null +++ b/src/content/docs/en/guides/migration-guide-v23.md @@ -0,0 +1,115 @@ +--- +title: Migration guide +redirectFrom: + - /guides/migration-guide-v23 + - /guides/migration-guide + - /en/guides/migration-guide +--- + +This guide covers the steps required to migrate to Effector 23 from a previous version. +Several features were declared deprecated in this release: + +- `forward` and `guard` operators +- `greedy` option of `sample` was renamed into `batch` +- "derived" and "callable" unit types are officially separated now +- the ability to use `undefined` as a magic "skip" value in reducers + +## Deprecation of `forward` and `guard` + +Those operators are pretty old and lived through many releases of Effector. +But all of their use-cases are already covered by `sample` now, so it is their time to go. You will see a deprecation warning in console for every call of those operators in your code. + +:::tip +You can migrate from both of them by using the official [Effector's ESLint plugin](https://eslint.effector.dev/), which has `no-forward` and `no-guard` rules with built-in [auto-fix feature](https://eslint.org/docs/latest/use/command-line-interface#fix-problems). +::: + +## `greedy` to `batch` + +The `sample` operator had `greedy` option to disable updates batching in rare edge-cases. +But the name "greedy" wasn't that obvious for the users, so it is renamed into `batch` and it's signature is reversed. + +You will see a deprecation warning in console for every usage of `greedy` option in your code. + +:::tip +You can migrate from one to the other by simply running "Find and Replace" from `greedy: true` to `batch: false` in your favorite IDE. +::: + +## Separate types for derived and callable units + +Derived units now fully separated from "callable/writable" ones: + +- Main factories `createEvent` and `createStore` now return types `EventCallable` and `StoreWritable` (because you can call and write to these units at any moment). +- Methods and operators like `unit.map(...)` or `combine(...)` now return types `Event` and `Store`, which are "read-only" i.e. you can only use them as `clock` or `source`, but not as a `target`. +- `EventCallable` type is assignable to `Event`, but not the other way around, same for stores. +- There are also runtime exceptions for types mismatch. + +Most likely you will not need to do anything, you will just get better types. + +But you might have issues with external libraries, **which are not updated to Effector 23 yet**: + +- Most of the libraries are just _accepting_ units as clocks and sources – those cases are ok. +- If some operator from the external library is accepting some unit as a `target`, you still will see an good-old `Event` type in this case, so you will not have a type error here even if there is actually an issue. +- If some _factory_ returns an event, which you are expected to call in your own code, then you will get a type error and you will need to typecast this event to `EventCallable`. + +:::tip +If you run into any of these cases, just create an issue in the repo of this library with a request to support Effector 23 version. +Owners of the project will see relevant type errors in their own source code and tests, once they update Effector in their repo. +::: + +If you have these issues in your own custom factories or libraries, then you should already see a relevant type errors in the source code of your library. +Just replace `Event` with `EventCallable`, `Store` with `StoreWritable` or `Unit` with `UnitTargetable` everywhere it is relevant (i.e. you are going to call or write into these units somehow). + +## Magic `undefined` skip is deprecated + +There is an old feature in Effector: `undefined` is used as a "magic" value to skip updates in reducers in rare cases, e.g. + +```ts +const $value = createStore(0).on(newValueReceived, (_oldValue, newValue) => newValue); +``` + +☝️ if `newValue` is `undefined`, then update will be skipped. + +The idea of making each mapper and reducer work as a sort of `filterMap` was considered useful in early Effector, but is very rarely used properly, and is confusing and distracting, so it should be deprecated and removed. + +To do so each and every store factory now supports special `skipVoid` configuration setting, which controls, how specifically store should handle `undefined` value. If set to `false` – store will use `undefined` as a value. +If set to `true` (deprecated), store will read `undefined` as a "skip update" command and will do nothing. + +You will see a warning for each return of undefined in your mappers or reducers in your code, with a requirement to provide an explicit `skipVoid` setting on your store. + +:::tip +If you do want to skip store update in certain cases, then it is better to explicitly return previous state, when possible. +::: + +It is recommended to use `{skipVoid: false}` at all times, so you are able to use an `undefined` as a normal value. + +If you do need `undefined` as a "magic skip" value – then you can use `{skipVoid: true}` to preserve current behavior. You still will get a deprecation warning though, but only one for declaration instead of one for every such update. + +The `skipVoid` setting is temporary and only needed as a way to properly deprecate this feature from Effector. In Effector 24 `skipVoid` itself will be deprecated and then removed. + +## `useStore` and `useEvent` to `useUnit` in `effector-react` + +We merged two old hooks into one, its advantage is that you can pass many units to it at once and it batches all the stores' updates into one single update. + +It's safe to just swap the calls of the old hooks with the new one: + +```ts +const Component = () => { + const foo = useStore($foo) + const bar = useStore($bar) + const onSubmit = useEvent(triggerSubmit) +} +``` +Becomes: +```ts +const Component = () => { + const foo = useUnit($foo) + const bar = useUnit($bar) + const onSubmit = useUnit(triggerSubmit) +} +``` +Or shorter: +```ts +const Component = () => { + const [foo, bar, onSubmit] = useUnit([$foo, $bar, triggerSubmit]) +} +``` diff --git a/src/content/docs/en/guides/server-side-rendering.md b/src/content/docs/en/guides/server-side-rendering.md new file mode 100644 index 0000000..57fbd52 --- /dev/null +++ b/src/content/docs/en/guides/server-side-rendering.md @@ -0,0 +1,311 @@ +--- +title: Server Side Rendering +redirectFrom: + - /guides/ssr + - /guides/server-side-rendering + - /en/guides/ssr + - /en/guides/server-side-rendering +--- + +Server-side rendering (SSR) means that the content of your site is generated on the server and then sent to the browser – which these days is achieved in very different ways and forms. + +:::info +Generally, if the rendering happens at the runtime – it is called SSR. If the rendering happens at the build-time – it is usually called Server Side Generation (SSG), which in fact is basically a subset of SSR. + +This difference it is not important for this guide, everything said applies both to SSR and SSG. +::: + +In this guide we will cover two main kinds of Server Side Rendering patterns and how effector should be used in these cases. + +## Non-Isomorphic SSR + +You don't need to do anything special to support non-isomorphic SSR/SSG workflow. + +This way initial HTML is usually generated separately, by using some sort of template engine, which is quite often run with different (not JS) programming language. +The frontend code in this case works only at the client browser and **is not used in any way** to generate the server response. + +This approach works for effector, as well as any javascript code. Any SPA application is basically an edge-case of it, as its HTML template does not contain any content, except for ` + +