From 07f6616ae9d6d6f41f7f4b1cf6b3298eae4bb32a Mon Sep 17 00:00:00 2001 From: mathuo <6710312+mathuo@users.noreply.github.com> Date: Thu, 26 May 2022 20:31:34 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=2055e21?= =?UTF-8?q?eacb3140bac6879375fb13e905599af1757=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/.editorconfig | 10 + build/.eslintignore | 2 + build/.eslintrc.js | 19 + build/.gitignore | 15 + build/.prettierignore | 3 + build/.prettierrc | 6 + build/.vscode/extensions.json | 14 + build/.vscode/settings.json | 1 + build/LICENSE | 21 + build/README.md | 52 + build/docs/.gitignore | 20 + build/docs/README.md | 41 + build/docs/babel.config.js | 3 + build/docs/blog/2022-05-11-dockview-1.4.1.mdx | 24 + build/docs/blog/2022-05-16-dockview-1.4.2.mdx | 15 + build/docs/blog/2022-05-26-dockview-1.4.3.mdx | 23 + build/docs/blog/authors.yml | 17 + build/docs/docs/api/_category_.json | 7 + build/docs/docs/api/dockview.mdx | 285 + build/docs/docs/api/gridview.mdx | 116 + build/docs/docs/api/paneview.mdx | 185 + build/docs/docs/api/splitview.mdx | 243 + build/docs/docs/basics.mdx | 117 + build/docs/docs/index.mdx | 150 + build/docs/docs/theme.mdx | 80 + build/docs/docusaurus.config.js | 170 + build/docs/jsexamples/dockview.html | 27 + build/docs/package.json | 54 + build/docs/scripts/package-docs.js | 8 + build/docs/sidebars.js | 31 + .../src/components/HomepageFeatures/index.tsx | 70 + .../HomepageFeatures/styles.module.css | 11 + .../docs/src/components/console/console.scss | 27 + build/docs/src/components/console/console.tsx | 52 + .../src/components/dockview/contextMenu.tsx | 115 + .../src/components/dockview/customCss.tsx | 58 + build/docs/src/components/dockview/dnd.tsx | 105 + build/docs/src/components/dockview/events.tsx | 342 + .../src/components/dockview/rendering.tsx | 158 + build/docs/src/components/gridview/events.tsx | 339 + build/docs/src/components/release.tsx | 2 + build/docs/src/components/simpleDockview.tsx | 116 + build/docs/src/components/simpleGridview.tsx | 99 + build/docs/src/components/simplePaneview.tsx | 102 + build/docs/src/components/simpleSplitview.tsx | 54 + .../docs/src/components/simpleSplitview2.tsx | 60 + .../docs/src/components/splitview/active.tsx | 161 + build/docs/src/components/splitview/math.scss | 63 + build/docs/src/components/splitview/math.tsx | 342 + build/docs/src/css/custom.css | 32 + build/docs/src/misc/math/constraints.jpg | Bin 0 -> 137417 bytes build/docs/src/misc/math/math.mdx | 378 + build/docs/src/misc/math/visual_1.jpg | Bin 0 -> 35574 bytes build/docs/src/pages/index.module.css | 23 + build/docs/src/pages/index.tsx | 46 + build/docs/src/pages/markdown-page.md | 7 + build/docs/src/theme/Root.tsx | 7 + build/docs/static/img/docusaurus.png | Bin 0 -> 5142 bytes build/docs/static/img/favicon.ico | Bin 0 -> 3626 bytes build/docs/static/img/logo.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 171 + .../static/img/undraw_docusaurus_react.svg | 170 + .../static/img/undraw_docusaurus_tree.svg | 40 + build/docs/tsconfig.json | 7 + build/docs/yarn.lock | 7764 ++++++++ build/jest.config.base.js | 20 + build/jest.config.js | 17 + build/lerna.json | 13 + build/module-build/tsconfig.esm.json | 24 + build/module-build/tsconfig.json | 24 + build/package.json | 63 + build/packages/dockview-demo/.eslintrc | 8 + .../packages/dockview-demo/.storybook/main.js | 23 + .../dockview-demo/.storybook/preview.js | 5 + build/packages/dockview-demo/package.json | 51 + .../packages/dockview-demo/public/index.html | 14 + build/packages/dockview-demo/src/dom.ts | 13 + build/packages/dockview-demo/src/events.ts | 122 + build/packages/dockview-demo/src/index.scss | 66 + build/packages/dockview-demo/src/index.tsx | 15 + .../src/layout-grid/activitybar.scss | 34 + .../src/layout-grid/activitybar.tsx | 71 + .../src/layout-grid/application.tsx | 108 + .../src/layout-grid/controlCenter.scss | 30 + .../src/layout-grid/controlCenter.tsx | 150 + .../src/layout-grid/customTab.tsx | 6 + .../dockview-demo/src/layout-grid/footer.tsx | 27 + .../src/layout-grid/layoutGrid.layout.json | 101 + .../src/layout-grid/layoutGrid.scss | 22 + .../src/layout-grid/layoutGrid.tsx | 334 + .../dockview-demo/src/layout-grid/panel.tsx | 67 + .../layout-grid/panels/exampleFunctions.scss | 14 + .../layout-grid/panels/exampleFunctions.tsx | 102 + .../dockview-demo/src/layout-grid/registry.ts | 25 + .../src/layout-grid/settingsPanel.tsx | 38 + .../src/layout-grid/sidebar.layout.json | 57 + .../src/layout-grid/sidebar.scss | 18 + .../dockview-demo/src/layout-grid/sidebar.tsx | 97 + .../src/layout-grid/splitPanel.scss | 0 .../src/layout-grid/splitPanel.tsx | 145 + .../src/layout-grid/splitpanel.layout.json | 29 + build/packages/dockview-demo/src/lifecycle.ts | 54 + .../src/panels/gridview/gridview.tsx | 328 + .../src/panels/splitview/splitview.scss | 76 + .../src/panels/splitview/splitview.tsx | 308 + .../src/panels/welcome/welcome.scss | 33 + .../src/panels/welcome/welcome.tsx | 53 + .../src/resources/dockview-logo.svg | 16 + .../src/resources/gridview-logo.svg | 8 + .../dockview-demo/src/resources/logo.svg | 25 + .../src/resources/paneview-logo.svg | 8 + .../src/resources/splitview-logo.svg | 5 + .../src/services/sidebarItem.tsx | 144 + .../dockview-demo/src/services/view.ts | 64 + .../src/services/viewContainer.ts | 126 + .../src/services/viewRegistry.tsx | 94 + .../dockview-demo/src/services/viewService.ts | 213 + .../dockview-demo/src/services/widgets.scss | 32 + .../dockview-demo/src/services/widgets.tsx | 474 + .../src/stories/Introduction.stories.mdx | 64 + .../src/stories/assets/code-brackets.svg | 1 + .../src/stories/assets/colors.svg | 1 + .../src/stories/assets/comments.svg | 1 + .../src/stories/assets/direction.svg | 1 + .../dockview-demo/src/stories/assets/flow.svg | 1 + .../src/stories/assets/plugin.svg | 1 + .../dockview-demo/src/stories/assets/repo.svg | 1 + .../src/stories/assets/stackalt.svg | 1 + .../dockview.documentation.stories.mdx | 7 + .../dockview/dockview.iframe.stories.tsx | 108 + .../dockview/dockview.params.stories.tsx | 126 + .../dockview/dockview.simple.stories.tsx | 93 + .../stories/dockview/dockview.tab.stories.tsx | 85 + .../dockview/dockview.watermark.stories.tsx | 145 + .../gridview.documentation.stories.mdx | 7 + .../gridview/gridview.params.stories.tsx | 107 + .../gridview/gridview.simple.stories.tsx | 137 + .../src/stories/introduction.css | 100 + .../paneview.deserialization.stories.tsx | 161 + .../paneview.documentation.stories.mdx | 7 + .../paneview/paneview.persistance.stories.tsx | 174 + .../paneview/paneview.simple.stories.tsx | 145 + .../src/stories/splitview/constraints.jpg | Bin 0 -> 137417 bytes .../src/stories/splitview/splitview.css | 74 + .../splitview.deserialization.stories.tsx | 122 + .../splitview.documentation.stories.mdx | 349 + .../splitview/splitview.params.stories.tsx | 107 + .../splitview.persistance.stories.tsx | 138 + .../splitview/splitview.simple.stories.tsx | 110 + .../splitview/splitview.snap.stories.tsx | 104 + .../src/stories/splitview/splitview.tsx | 341 + .../src/stories/splitview/visual_1.jpg | Bin 0 -> 35574 bytes build/packages/dockview-demo/tsconfig.json | 16 + .../packages/dockview-demo/webpack.config.js | 52 + build/packages/dockview/README.md | 52 + build/packages/dockview/gulpfile.js | 6 + build/packages/dockview/jest.config.js | 27 + build/packages/dockview/package.json | 77 + build/packages/dockview/rollup.config.js | 102 + .../dockview/scripts/publishExperimental.js | 63 + .../dockview/scripts/rollupEntryTarget.ts | 2 + .../src/__tests__/__mocks__/resizeObserver.js | 13 + .../src/__tests__/__test_utils__/utils.ts | 14 + .../dockview/src/__tests__/api/api.spec.ts | 52 + .../src/__tests__/api/component.api.spec.ts | 155 + .../src/__tests__/api/groupPanelApi.spec.ts | 79 + .../dockview/src/__tests__/array.spec.ts | 57 + .../__tests__/dnd/abstractDragHandler.spec.ts | 87 + .../src/__tests__/dnd/dataTransfer.spec.ts | 101 + .../src/__tests__/dnd/droptarget.spec.ts | 162 + .../dockview/defaultGroupPanelView.spec.ts | 46 + .../dockview/dockviewComponent.spec.ts | 1692 ++ .../dockview/dockviewGroupPanel.spec.ts | 114 + .../dockview/src/__tests__/events.spec.ts | 100 + .../gridview/baseComponentGridview.spec.ts | 170 + .../src/__tests__/gridview/gridview.spec.ts | 28 + .../gridview/gridviewComponent.spec.ts | 1886 ++ .../src/__tests__/groupview/groupview.spec.ts | 571 + .../__tests__/groupview/panel/content.spec.ts | 140 + .../src/__tests__/groupview/tab.spec.ts | 25 + .../dockview/src/__tests__/lifecycle.spec.ts | 51 + .../dockview/src/__tests__/math.spec.ts | 17 + .../__tests__/panel/componentFactory.spec.ts | 102 + .../src/__tests__/paneview/paneview.spec.ts | 139 + .../paneview/paneviewComponent.spec.ts | 404 + .../react/dockview/dockview.spec.tsx | 52 + .../react/gridview/gridview.spec.tsx | 65 + .../react/paneview/paneview.spec.tsx | 52 + .../src/__tests__/react/react.spec.tsx | 90 + .../react/splitview/splitview.spec.tsx | 65 + .../splitview/core/splitview.spec.ts | 589 + .../splitview/splitviewComponent.spec.ts | 485 + .../src/actionbar/actionsContainer.scss | 30 + .../src/actionbar/actionsContainer.ts | 24 + .../dockview/src/api/component.api.ts | 473 + .../dockview/src/api/gridviewPanelApi.ts | 68 + .../dockview/src/api/groupPanelApi.ts | 109 + build/packages/dockview/src/api/panelApi.ts | 155 + .../dockview/src/api/paneviewPanelApi.ts | 55 + .../dockview/src/api/splitviewPanelApi.ts | 65 + build/packages/dockview/src/array.ts | 84 + .../dockview/src/dnd/abstractDragHandler.ts | 56 + .../packages/dockview/src/dnd/dataTransfer.ts | 90 + build/packages/dockview/src/dnd/dnd.ts | 86 + .../packages/dockview/src/dnd/droptarget.scss | 55 + build/packages/dockview/src/dnd/droptarget.ts | 235 + .../dockview/components/tab/defaultTab.scss | 81 + .../src/dockview/components/tab/defaultTab.ts | 111 + .../components/watermark/watermark.scss | 21 + .../components/watermark/watermark.ts | 107 + .../src/dockview/defaultGroupPanelView.ts | 90 + .../dockview/src/dockview/deserializer.ts | 6 + .../src/dockview/dockviewComponent.scss | 83 + .../src/dockview/dockviewComponent.ts | 817 + .../src/dockview/dockviewGroupPanel.ts | 186 + .../packages/dockview/src/dockview/options.ts | 99 + build/packages/dockview/src/dom.ts | 166 + build/packages/dockview/src/events.ts | 122 + .../src/gridview/baseComponentGridview.ts | 318 + .../dockview/src/gridview/basePanelView.ts | 134 + .../dockview/src/gridview/branchNode.ts | 300 + .../dockview/src/gridview/gridview.scss | 5 + .../dockview/src/gridview/gridview.ts | 714 + .../src/gridview/gridviewComponent.ts | 423 + .../dockview/src/gridview/gridviewPanel.ts | 245 + .../dockview/src/gridview/leafNode.ts | 134 + .../packages/dockview/src/gridview/options.ts | 19 + build/packages/dockview/src/gridview/types.ts | 4 + build/packages/dockview/src/groupview/dnd.ts | 5 + .../dockview/src/groupview/groupPanel.ts | 44 + .../dockview/src/groupview/groupview.scss | 23 + .../dockview/src/groupview/groupview.ts | 731 + .../dockview/src/groupview/groupviewPanel.ts | 103 + .../dockview/src/groupview/panel/content.ts | 120 + build/packages/dockview/src/groupview/tab.ts | 157 + .../src/groupview/titlebar/tabsContainer.scss | 60 + .../src/groupview/titlebar/tabsContainer.ts | 306 + .../packages/dockview/src/groupview/types.ts | 75 + .../packages/dockview/src/hostedContainer.ts | 92 + build/packages/dockview/src/index.ts | 59 + build/packages/dockview/src/lifecycle.ts | 54 + build/packages/dockview/src/math.ts | 11 + .../dockview/src/panel/componentFactory.ts | 52 + build/packages/dockview/src/panel/types.ts | 39 + .../src/paneview/defaultPaneviewHeader.ts | 61 + .../src/paneview/draggablePaneviewPanel.ts | 141 + .../packages/dockview/src/paneview/options.ts | 26 + .../dockview/src/paneview/paneview.scss | 116 + .../dockview/src/paneview/paneview.ts | 214 + .../src/paneview/paneviewComponent.ts | 472 + .../dockview/src/paneview/paneviewPanel.ts | 331 + .../dockview/src/react/deserializer.ts | 59 + .../dockview/src/react/dockview/dockview.scss | 4 + .../dockview/src/react/dockview/dockview.tsx | 236 + .../src/react/dockview/reactContentPart.ts | 113 + .../src/react/dockview/reactHeaderPart.ts | 69 + .../src/react/dockview/reactWatermarkPart.ts | 88 + .../react/dockview/v2/reactContentRenderer.ts | 105 + .../react/dockview/v2/reactGroupPanelView.ts | 30 + .../dockview/v2/webviewContentRenderer.ts | 59 + .../dockview/src/react/gridview/gridview.tsx | 123 + .../dockview/src/react/gridview/view.ts | 34 + build/packages/dockview/src/react/index.ts | 9 + .../dockview/src/react/paneview/paneview.tsx | 158 + .../dockview/src/react/paneview/view.tsx | 55 + build/packages/dockview/src/react/react.ts | 185 + .../src/react/splitview/splitview.tsx | 117 + .../dockview/src/react/splitview/view.ts | 31 + build/packages/dockview/src/react/types.ts | 9 + .../dockview/src/splitview/core/options.ts | 29 + .../src/splitview/core/splitview.scss | 143 + .../dockview/src/splitview/core/splitview.ts | 1050 + .../dockview/src/splitview/core/viewItem.ts | 101 + .../src/splitview/splitviewComponent.ts | 428 + .../dockview/src/splitview/splitviewPanel.ts | 169 + build/packages/dockview/src/theme.scss | 84 + build/packages/dockview/src/types.ts | 9 + build/packages/dockview/tsconfig.esm.json | 11 + build/packages/dockview/tsconfig.json | 11 + build/packages/dockview/typedoc.json | 7 + build/scripts/build.js | 15 + build/scripts/package-docs.js | 8 + build/scripts/package.js | 15 + build/sonar-project.properties | 20 + build/tsconfig.eslint.json | 9 + build/tsconfig.test.json | 22 + build/yarn.lock | 16352 ++++++++++++++++ 287 files changed, 56543 insertions(+) create mode 100644 build/.editorconfig create mode 100644 build/.eslintignore create mode 100644 build/.eslintrc.js create mode 100644 build/.gitignore create mode 100644 build/.prettierignore create mode 100644 build/.prettierrc create mode 100644 build/.vscode/extensions.json create mode 100644 build/.vscode/settings.json create mode 100644 build/LICENSE create mode 100644 build/README.md create mode 100644 build/docs/.gitignore create mode 100644 build/docs/README.md create mode 100644 build/docs/babel.config.js create mode 100644 build/docs/blog/2022-05-11-dockview-1.4.1.mdx create mode 100644 build/docs/blog/2022-05-16-dockview-1.4.2.mdx create mode 100644 build/docs/blog/2022-05-26-dockview-1.4.3.mdx create mode 100644 build/docs/blog/authors.yml create mode 100644 build/docs/docs/api/_category_.json create mode 100644 build/docs/docs/api/dockview.mdx create mode 100644 build/docs/docs/api/gridview.mdx create mode 100644 build/docs/docs/api/paneview.mdx create mode 100644 build/docs/docs/api/splitview.mdx create mode 100644 build/docs/docs/basics.mdx create mode 100644 build/docs/docs/index.mdx create mode 100644 build/docs/docs/theme.mdx create mode 100644 build/docs/docusaurus.config.js create mode 100644 build/docs/jsexamples/dockview.html create mode 100644 build/docs/package.json create mode 100644 build/docs/scripts/package-docs.js create mode 100644 build/docs/sidebars.js create mode 100644 build/docs/src/components/HomepageFeatures/index.tsx create mode 100644 build/docs/src/components/HomepageFeatures/styles.module.css create mode 100644 build/docs/src/components/console/console.scss create mode 100644 build/docs/src/components/console/console.tsx create mode 100644 build/docs/src/components/dockview/contextMenu.tsx create mode 100644 build/docs/src/components/dockview/customCss.tsx create mode 100644 build/docs/src/components/dockview/dnd.tsx create mode 100644 build/docs/src/components/dockview/events.tsx create mode 100644 build/docs/src/components/dockview/rendering.tsx create mode 100644 build/docs/src/components/gridview/events.tsx create mode 100644 build/docs/src/components/release.tsx create mode 100644 build/docs/src/components/simpleDockview.tsx create mode 100644 build/docs/src/components/simpleGridview.tsx create mode 100644 build/docs/src/components/simplePaneview.tsx create mode 100644 build/docs/src/components/simpleSplitview.tsx create mode 100644 build/docs/src/components/simpleSplitview2.tsx create mode 100644 build/docs/src/components/splitview/active.tsx create mode 100644 build/docs/src/components/splitview/math.scss create mode 100644 build/docs/src/components/splitview/math.tsx create mode 100644 build/docs/src/css/custom.css create mode 100644 build/docs/src/misc/math/constraints.jpg create mode 100644 build/docs/src/misc/math/math.mdx create mode 100644 build/docs/src/misc/math/visual_1.jpg create mode 100644 build/docs/src/pages/index.module.css create mode 100644 build/docs/src/pages/index.tsx create mode 100644 build/docs/src/pages/markdown-page.md create mode 100644 build/docs/src/theme/Root.tsx create mode 100644 build/docs/static/img/docusaurus.png create mode 100644 build/docs/static/img/favicon.ico create mode 100644 build/docs/static/img/logo.svg create mode 100644 build/docs/static/img/undraw_docusaurus_mountain.svg create mode 100644 build/docs/static/img/undraw_docusaurus_react.svg create mode 100644 build/docs/static/img/undraw_docusaurus_tree.svg create mode 100644 build/docs/tsconfig.json create mode 100644 build/docs/yarn.lock create mode 100644 build/jest.config.base.js create mode 100644 build/jest.config.js create mode 100644 build/lerna.json create mode 100644 build/module-build/tsconfig.esm.json create mode 100644 build/module-build/tsconfig.json create mode 100644 build/package.json create mode 100644 build/packages/dockview-demo/.eslintrc create mode 100644 build/packages/dockview-demo/.storybook/main.js create mode 100644 build/packages/dockview-demo/.storybook/preview.js create mode 100644 build/packages/dockview-demo/package.json create mode 100644 build/packages/dockview-demo/public/index.html create mode 100644 build/packages/dockview-demo/src/dom.ts create mode 100644 build/packages/dockview-demo/src/events.ts create mode 100644 build/packages/dockview-demo/src/index.scss create mode 100644 build/packages/dockview-demo/src/index.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/activitybar.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/activitybar.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/application.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/controlCenter.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/controlCenter.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/customTab.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/footer.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/layoutGrid.layout.json create mode 100644 build/packages/dockview-demo/src/layout-grid/layoutGrid.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/layoutGrid.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/panel.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/registry.ts create mode 100644 build/packages/dockview-demo/src/layout-grid/settingsPanel.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/sidebar.layout.json create mode 100644 build/packages/dockview-demo/src/layout-grid/sidebar.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/sidebar.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/splitPanel.scss create mode 100644 build/packages/dockview-demo/src/layout-grid/splitPanel.tsx create mode 100644 build/packages/dockview-demo/src/layout-grid/splitpanel.layout.json create mode 100644 build/packages/dockview-demo/src/lifecycle.ts create mode 100644 build/packages/dockview-demo/src/panels/gridview/gridview.tsx create mode 100644 build/packages/dockview-demo/src/panels/splitview/splitview.scss create mode 100644 build/packages/dockview-demo/src/panels/splitview/splitview.tsx create mode 100644 build/packages/dockview-demo/src/panels/welcome/welcome.scss create mode 100644 build/packages/dockview-demo/src/panels/welcome/welcome.tsx create mode 100644 build/packages/dockview-demo/src/resources/dockview-logo.svg create mode 100644 build/packages/dockview-demo/src/resources/gridview-logo.svg create mode 100644 build/packages/dockview-demo/src/resources/logo.svg create mode 100644 build/packages/dockview-demo/src/resources/paneview-logo.svg create mode 100644 build/packages/dockview-demo/src/resources/splitview-logo.svg create mode 100644 build/packages/dockview-demo/src/services/sidebarItem.tsx create mode 100644 build/packages/dockview-demo/src/services/view.ts create mode 100644 build/packages/dockview-demo/src/services/viewContainer.ts create mode 100644 build/packages/dockview-demo/src/services/viewRegistry.tsx create mode 100644 build/packages/dockview-demo/src/services/viewService.ts create mode 100644 build/packages/dockview-demo/src/services/widgets.scss create mode 100644 build/packages/dockview-demo/src/services/widgets.tsx create mode 100644 build/packages/dockview-demo/src/stories/Introduction.stories.mdx create mode 100644 build/packages/dockview-demo/src/stories/assets/code-brackets.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/colors.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/comments.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/direction.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/flow.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/plugin.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/repo.svg create mode 100644 build/packages/dockview-demo/src/stories/assets/stackalt.svg create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.documentation.stories.mdx create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.iframe.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.params.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.simple.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.tab.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/dockview/dockview.watermark.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/gridview/gridview.documentation.stories.mdx create mode 100644 build/packages/dockview-demo/src/stories/gridview/gridview.params.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/gridview/gridview.simple.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/introduction.css create mode 100644 build/packages/dockview-demo/src/stories/paneview/paneview.deserialization.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/paneview/paneview.documentation.stories.mdx create mode 100644 build/packages/dockview-demo/src/stories/paneview/paneview.persistance.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/paneview/paneview.simple.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/constraints.jpg create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.css create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.deserialization.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.documentation.stories.mdx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.params.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.persistance.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.simple.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.snap.stories.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/splitview.tsx create mode 100644 build/packages/dockview-demo/src/stories/splitview/visual_1.jpg create mode 100644 build/packages/dockview-demo/tsconfig.json create mode 100644 build/packages/dockview-demo/webpack.config.js create mode 100644 build/packages/dockview/README.md create mode 100644 build/packages/dockview/gulpfile.js create mode 100644 build/packages/dockview/jest.config.js create mode 100644 build/packages/dockview/package.json create mode 100644 build/packages/dockview/rollup.config.js create mode 100644 build/packages/dockview/scripts/publishExperimental.js create mode 100644 build/packages/dockview/scripts/rollupEntryTarget.ts create mode 100644 build/packages/dockview/src/__tests__/__mocks__/resizeObserver.js create mode 100644 build/packages/dockview/src/__tests__/__test_utils__/utils.ts create mode 100644 build/packages/dockview/src/__tests__/api/api.spec.ts create mode 100644 build/packages/dockview/src/__tests__/api/component.api.spec.ts create mode 100644 build/packages/dockview/src/__tests__/api/groupPanelApi.spec.ts create mode 100644 build/packages/dockview/src/__tests__/array.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dnd/abstractDragHandler.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dnd/dataTransfer.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dnd/droptarget.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dockview/defaultGroupPanelView.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dockview/dockviewComponent.spec.ts create mode 100644 build/packages/dockview/src/__tests__/dockview/dockviewGroupPanel.spec.ts create mode 100644 build/packages/dockview/src/__tests__/events.spec.ts create mode 100644 build/packages/dockview/src/__tests__/gridview/baseComponentGridview.spec.ts create mode 100644 build/packages/dockview/src/__tests__/gridview/gridview.spec.ts create mode 100644 build/packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts create mode 100644 build/packages/dockview/src/__tests__/groupview/groupview.spec.ts create mode 100644 build/packages/dockview/src/__tests__/groupview/panel/content.spec.ts create mode 100644 build/packages/dockview/src/__tests__/groupview/tab.spec.ts create mode 100644 build/packages/dockview/src/__tests__/lifecycle.spec.ts create mode 100644 build/packages/dockview/src/__tests__/math.spec.ts create mode 100644 build/packages/dockview/src/__tests__/panel/componentFactory.spec.ts create mode 100644 build/packages/dockview/src/__tests__/paneview/paneview.spec.ts create mode 100644 build/packages/dockview/src/__tests__/paneview/paneviewComponent.spec.ts create mode 100644 build/packages/dockview/src/__tests__/react/dockview/dockview.spec.tsx create mode 100644 build/packages/dockview/src/__tests__/react/gridview/gridview.spec.tsx create mode 100644 build/packages/dockview/src/__tests__/react/paneview/paneview.spec.tsx create mode 100644 build/packages/dockview/src/__tests__/react/react.spec.tsx create mode 100644 build/packages/dockview/src/__tests__/react/splitview/splitview.spec.tsx create mode 100644 build/packages/dockview/src/__tests__/splitview/core/splitview.spec.ts create mode 100644 build/packages/dockview/src/__tests__/splitview/splitviewComponent.spec.ts create mode 100644 build/packages/dockview/src/actionbar/actionsContainer.scss create mode 100644 build/packages/dockview/src/actionbar/actionsContainer.ts create mode 100644 build/packages/dockview/src/api/component.api.ts create mode 100644 build/packages/dockview/src/api/gridviewPanelApi.ts create mode 100644 build/packages/dockview/src/api/groupPanelApi.ts create mode 100644 build/packages/dockview/src/api/panelApi.ts create mode 100644 build/packages/dockview/src/api/paneviewPanelApi.ts create mode 100644 build/packages/dockview/src/api/splitviewPanelApi.ts create mode 100644 build/packages/dockview/src/array.ts create mode 100644 build/packages/dockview/src/dnd/abstractDragHandler.ts create mode 100644 build/packages/dockview/src/dnd/dataTransfer.ts create mode 100644 build/packages/dockview/src/dnd/dnd.ts create mode 100644 build/packages/dockview/src/dnd/droptarget.scss create mode 100644 build/packages/dockview/src/dnd/droptarget.ts create mode 100644 build/packages/dockview/src/dockview/components/tab/defaultTab.scss create mode 100644 build/packages/dockview/src/dockview/components/tab/defaultTab.ts create mode 100644 build/packages/dockview/src/dockview/components/watermark/watermark.scss create mode 100644 build/packages/dockview/src/dockview/components/watermark/watermark.ts create mode 100644 build/packages/dockview/src/dockview/defaultGroupPanelView.ts create mode 100644 build/packages/dockview/src/dockview/deserializer.ts create mode 100644 build/packages/dockview/src/dockview/dockviewComponent.scss create mode 100644 build/packages/dockview/src/dockview/dockviewComponent.ts create mode 100644 build/packages/dockview/src/dockview/dockviewGroupPanel.ts create mode 100644 build/packages/dockview/src/dockview/options.ts create mode 100644 build/packages/dockview/src/dom.ts create mode 100644 build/packages/dockview/src/events.ts create mode 100644 build/packages/dockview/src/gridview/baseComponentGridview.ts create mode 100644 build/packages/dockview/src/gridview/basePanelView.ts create mode 100644 build/packages/dockview/src/gridview/branchNode.ts create mode 100644 build/packages/dockview/src/gridview/gridview.scss create mode 100644 build/packages/dockview/src/gridview/gridview.ts create mode 100644 build/packages/dockview/src/gridview/gridviewComponent.ts create mode 100644 build/packages/dockview/src/gridview/gridviewPanel.ts create mode 100644 build/packages/dockview/src/gridview/leafNode.ts create mode 100644 build/packages/dockview/src/gridview/options.ts create mode 100644 build/packages/dockview/src/gridview/types.ts create mode 100644 build/packages/dockview/src/groupview/dnd.ts create mode 100644 build/packages/dockview/src/groupview/groupPanel.ts create mode 100644 build/packages/dockview/src/groupview/groupview.scss create mode 100644 build/packages/dockview/src/groupview/groupview.ts create mode 100644 build/packages/dockview/src/groupview/groupviewPanel.ts create mode 100644 build/packages/dockview/src/groupview/panel/content.ts create mode 100644 build/packages/dockview/src/groupview/tab.ts create mode 100644 build/packages/dockview/src/groupview/titlebar/tabsContainer.scss create mode 100644 build/packages/dockview/src/groupview/titlebar/tabsContainer.ts create mode 100644 build/packages/dockview/src/groupview/types.ts create mode 100644 build/packages/dockview/src/hostedContainer.ts create mode 100644 build/packages/dockview/src/index.ts create mode 100644 build/packages/dockview/src/lifecycle.ts create mode 100644 build/packages/dockview/src/math.ts create mode 100644 build/packages/dockview/src/panel/componentFactory.ts create mode 100644 build/packages/dockview/src/panel/types.ts create mode 100644 build/packages/dockview/src/paneview/defaultPaneviewHeader.ts create mode 100644 build/packages/dockview/src/paneview/draggablePaneviewPanel.ts create mode 100644 build/packages/dockview/src/paneview/options.ts create mode 100644 build/packages/dockview/src/paneview/paneview.scss create mode 100644 build/packages/dockview/src/paneview/paneview.ts create mode 100644 build/packages/dockview/src/paneview/paneviewComponent.ts create mode 100644 build/packages/dockview/src/paneview/paneviewPanel.ts create mode 100644 build/packages/dockview/src/react/deserializer.ts create mode 100644 build/packages/dockview/src/react/dockview/dockview.scss create mode 100644 build/packages/dockview/src/react/dockview/dockview.tsx create mode 100644 build/packages/dockview/src/react/dockview/reactContentPart.ts create mode 100644 build/packages/dockview/src/react/dockview/reactHeaderPart.ts create mode 100644 build/packages/dockview/src/react/dockview/reactWatermarkPart.ts create mode 100644 build/packages/dockview/src/react/dockview/v2/reactContentRenderer.ts create mode 100644 build/packages/dockview/src/react/dockview/v2/reactGroupPanelView.ts create mode 100644 build/packages/dockview/src/react/dockview/v2/webviewContentRenderer.ts create mode 100644 build/packages/dockview/src/react/gridview/gridview.tsx create mode 100644 build/packages/dockview/src/react/gridview/view.ts create mode 100644 build/packages/dockview/src/react/index.ts create mode 100644 build/packages/dockview/src/react/paneview/paneview.tsx create mode 100644 build/packages/dockview/src/react/paneview/view.tsx create mode 100644 build/packages/dockview/src/react/react.ts create mode 100644 build/packages/dockview/src/react/splitview/splitview.tsx create mode 100644 build/packages/dockview/src/react/splitview/view.ts create mode 100644 build/packages/dockview/src/react/types.ts create mode 100644 build/packages/dockview/src/splitview/core/options.ts create mode 100644 build/packages/dockview/src/splitview/core/splitview.scss create mode 100644 build/packages/dockview/src/splitview/core/splitview.ts create mode 100644 build/packages/dockview/src/splitview/core/viewItem.ts create mode 100644 build/packages/dockview/src/splitview/splitviewComponent.ts create mode 100644 build/packages/dockview/src/splitview/splitviewPanel.ts create mode 100644 build/packages/dockview/src/theme.scss create mode 100644 build/packages/dockview/src/types.ts create mode 100644 build/packages/dockview/tsconfig.esm.json create mode 100644 build/packages/dockview/tsconfig.json create mode 100644 build/packages/dockview/typedoc.json create mode 100644 build/scripts/build.js create mode 100644 build/scripts/package-docs.js create mode 100644 build/scripts/package.js create mode 100644 build/sonar-project.properties create mode 100644 build/tsconfig.eslint.json create mode 100644 build/tsconfig.test.json create mode 100644 build/yarn.lock diff --git a/build/.editorconfig b/build/.editorconfig new file mode 100644 index 000000000..c5337b8b6 --- /dev/null +++ b/build/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +quote_type = single \ No newline at end of file diff --git a/build/.eslintignore b/build/.eslintignore new file mode 100644 index 000000000..15755e534 --- /dev/null +++ b/build/.eslintignore @@ -0,0 +1,2 @@ +dist/ +*.scss \ No newline at end of file diff --git a/build/.eslintrc.js b/build/.eslintrc.js new file mode 100644 index 000000000..f9ad98125 --- /dev/null +++ b/build/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + root: true, + parserOptions: { + sourceType: 'module', + project: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'], + tsconfigRootDir: __dirname, + }, + plugins: ['@typescript-eslint'], + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + rules: { + 'no-case-declarations': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + }, +}; diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 000000000..5f1ae726d --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +coverage/ +dist/ +output/ +.idea/ +typedocs/ +.DS_Store +*-debug.log +.build +storybook-static/ +.rollup.cache/ +test-report.xml +*.code-workspace +yarn-error.log +/build diff --git a/build/.prettierignore b/build/.prettierignore new file mode 100644 index 000000000..22f8a40ab --- /dev/null +++ b/build/.prettierignore @@ -0,0 +1,3 @@ +typedocs/ +dist/ +build/ \ No newline at end of file diff --git a/build/.prettierrc b/build/.prettierrc new file mode 100644 index 000000000..f91488470 --- /dev/null +++ b/build/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": true, + "singleQuote": true +} diff --git a/build/.vscode/extensions.json b/build/.vscode/extensions.json new file mode 100644 index 000000000..9e9271d02 --- /dev/null +++ b/build/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "esbenp.prettier-vscode", + "redhat.vscode-yaml", + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig" + ], + // List of extensions recommended by VS Code that should not be recommended for users of this workspace. + "unwantedRecommendations": [] +} diff --git a/build/.vscode/settings.json b/build/.vscode/settings.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/build/.vscode/settings.json @@ -0,0 +1 @@ +{} diff --git a/build/LICENSE b/build/LICENSE new file mode 100644 index 000000000..7ec9c3431 --- /dev/null +++ b/build/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 mathuo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/build/README.md b/build/README.md new file mode 100644 index 000000000..1983f0c99 --- /dev/null +++ b/build/README.md @@ -0,0 +1,52 @@ +
+

dockview

+ +

Zero dependency layout manager supporting tabs, grids and splitviews with ReactJS support written in TypeScript

+ +
+ +--- + +[![npm version](https://badge.fury.io/js/dockview.svg)](https://www.npmjs.com/package/dockview) +[![CI Build](https://github.com/mathuo/dockview/workflows/CI/badge.svg)](https://github.com/mathuo/dockview/actions?query=workflow%3ACI) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=mathuo_dockview&metric=coverage)](https://sonarcloud.io/summary/overall?id=mathuo_dockview) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mathuo_dockview&metric=alert_status)](https://sonarcloud.io/summary/overall?id=mathuo_dockview) +[![Bundle Phobia](https://badgen.net/bundlephobia/minzip/dockview)](https://bundlephobia.com/result?p=dockview) + +## + +Please see the website: https://mathuo.github.io/dockview/docs + +Want to inspect the latest deployment? Go to https://unpkg.com/browse/dockview@latest/ + +## Features + +- Simple splitviews, nested splitviews (i.e. gridviews) supporting full layout managment with + dockable and tabular views +- Extensive API support at the component level and view level +- Themable and customizable +- Serialization / deserialization support +- Tabular docking and Drag and Drop support +- Documentation and examples + +This project was inspired by many popular IDE editors. Some parts of the core resizable panelling are inspired by code found in the VSCode codebase, [splitview](https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview) and [gridview](https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid). + +## Quick start + +Dockview has a peer dependency on `react >= 16.8.0` and `react-dom >= 16.8.0`. You can install dockview from [npm](https://www.npmjs.com/package/dockview). Please see the [Getting Started Guide](https://mathuo.github.io/dockview/docs/). + +``` +npm install --save dockview +``` + +Within your project you must import or reference the stylesheet at `dockview/dist/styles/dockview.css` and attach a theme. + +```css +@import '~dockview/dist/styles/dockview.css'; +``` + +You should also attach a dockview theme to an element containing your components. For example: + +```html + +``` diff --git a/build/docs/.gitignore b/build/docs/.gitignore new file mode 100644 index 000000000..b2d6de306 --- /dev/null +++ b/build/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/build/docs/README.md b/build/docs/README.md new file mode 100644 index 000000000..aaba2fa1e --- /dev/null +++ b/build/docs/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/build/docs/babel.config.js b/build/docs/babel.config.js new file mode 100644 index 000000000..e00595dae --- /dev/null +++ b/build/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/build/docs/blog/2022-05-11-dockview-1.4.1.mdx b/build/docs/blog/2022-05-11-dockview-1.4.1.mdx new file mode 100644 index 000000000..13ebcad79 --- /dev/null +++ b/build/docs/blog/2022-05-11-dockview-1.4.1.mdx @@ -0,0 +1,24 @@ +--- +slug: dockview-1.4.1-release +title: Dockview 1.4.1 +tags: [release] +--- + +# Release Notes + +## πŸš€ Features + +- Fix Drag and Drop issues in Dockview on Firefox [#103](https://github.com/mathuo/dockview/pull/103) + +## πŸ›  Miscs + +- Documentation enhancements https://mathuo.github.io/dockview/docs/ + +## πŸ”₯ Breaking changes + +All breaking changes here are designed to simplify the library with only one way to do something. + +- Remove `setVisible` and `setActive` from the Splitview API. You can still achieve the same behaviors through calling `setVisible` and `setActive` on the Splitview Panel API. [#105](https://github.com/mathuo/dockview/pull/105) +- Remove `setVisible`, `setActive` and `toggleVisiblity` from Gridview API. You can still achieve the same behaviors through calling `setVisible` and `setActive` on the Gridview Panel API [#105](https://github.com/mathuo/dockview/pull/105) +- Remove `onFocusEvent` from Panel API as this was not intended to be a public method. You can use `onDidFocusChange` instead [#105](https://github.com/mathuo/dockview/pull/105) +- Remove HOC ``, ``, `` and `` [#105](https://github.com/mathuo/dockview/pull/105) diff --git a/build/docs/blog/2022-05-16-dockview-1.4.2.mdx b/build/docs/blog/2022-05-16-dockview-1.4.2.mdx new file mode 100644 index 000000000..9b1323c21 --- /dev/null +++ b/build/docs/blog/2022-05-16-dockview-1.4.2.mdx @@ -0,0 +1,15 @@ +--- +slug: dockview-1.4.2-release +title: Dockview 1.4.2 +tags: [release] +--- + +# Release Notes + +## πŸš€ Features + +- Fix deserialization issue where previously active panel wasn't display correctly after deserialization [#108](https://github.com/mathuo/dockview/pull/108) + +## πŸ”₯ Breaking changes + +- Rename `onDidAddGroup` to `onDidAddPanel`, `onDidRemoveGroup` to `onDidRemovePanel` and `onDidActiveGroupChange` to `onDidActivePanelChange` on the Gridview API [#106](https://github.com/mathuo/dockview/pull/106) diff --git a/build/docs/blog/2022-05-26-dockview-1.4.3.mdx b/build/docs/blog/2022-05-26-dockview-1.4.3.mdx new file mode 100644 index 000000000..9f3b8f359 --- /dev/null +++ b/build/docs/blog/2022-05-26-dockview-1.4.3.mdx @@ -0,0 +1,23 @@ +--- +slug: dockview-1.4.3-release +title: Dockview 1.4.3 +tags: [release] +--- + +# Release Notes + +## πŸš€ Features + +- Small adjusted to behaviours of default paneview header componnet [#116](https://github.com/mathuo/dockview/pull/116) [#120](https://github.com/mathuo/dockview/pull/120) +- Improved support for external dnd events in the dockview component. `showDndOverlay` prop on `DockviewReact` exposes more parameters to interact with [#110](https://github.com/mathuo/dockview/pull/110) +- Improved to underlying events exposes through all components [#114](https://github.com/mathuo/dockview/pull/114) +- Add .clear() to the component APIs providing an easy way to clear a layout [#119](https://github.com/mathuo/dockview/pull/119) +- Udate orientation via componnet APIs is now working correctly [#119](https://github.com/mathuo/dockview/pull/119) + +## πŸ›  Miscs + +- Documentation enhancements https://mathuo.github.io/dockview/docs/ [#101](https://github.com/mathuo/dockview/pull/101) + +## πŸ”₯ Breaking changes + +- Fix typo by renaming `onDidLayoutfromJSON` to `onDidLayoutFromJSON` in dockview component api [#112](https://github.com/mathuo/dockview/pull/112/files) diff --git a/build/docs/blog/authors.yml b/build/docs/blog/authors.yml new file mode 100644 index 000000000..bcb299156 --- /dev/null +++ b/build/docs/blog/authors.yml @@ -0,0 +1,17 @@ +endi: + name: Endilie Yacop Sucipto + title: Maintainer of Docusaurus + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png + +yangshun: + name: Yangshun Tay + title: Front End Engineer @ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png + +slorber: + name: SΓ©bastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/build/docs/docs/api/_category_.json b/build/docs/docs/api/_category_.json new file mode 100644 index 000000000..234c2c6d5 --- /dev/null +++ b/build/docs/docs/api/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "API", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/build/docs/docs/api/dockview.mdx b/build/docs/docs/api/dockview.mdx new file mode 100644 index 000000000..dc00eb9df --- /dev/null +++ b/build/docs/docs/api/dockview.mdx @@ -0,0 +1,285 @@ +import { SimpleDockview } from '../../src/components/simpleDockview'; +import { + RenderingDockview, + Checkbox, +} from '../../src/components/dockview/rendering'; +import { DndDockview } from '../../src/components/dockview/dnd'; +import { EventsDockview } from '../../src/components/dockview/events'; +import Link from '@docusaurus/Link'; + +# Dockview + +## Introduction + +Dockview is an abstraction built on top of [Gridviews](/docs/api/gridview) where each view is a tabbed container. + +
+ +
+ +```tsx +const panel = event.api.addPanel(...); +const anotherPanel = event.api.getPanel('somePanelid'); +``` + +You can access the panels associated group through the `panel.group` variable. +The group will always be defined and will change if a panel is moved into another group. + +## DockviewReact Component + +```tsx +import { ReactDockview } from 'dockview'; +``` + +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | --------------------------------------------------------------- | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| tabComponents | object | Yes | | | +| watermarkComponent | object | Yes | | | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | +| onTabContextMenu | Event | Yes | false | | +| onDidDrop | Event | Yes | false | | +| showDndOverlay | Event | Yes | false | | + +## Dockview API + +```tsx +const MyComponent = (props: IDockviewPanelProps<{ title: string }>) => { + // props.containerApi... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +```tsx +const onReady = (event: DockviewReadyEvent) => { + // event.api... +}; +``` + +| Property | Type | Description | +| ---------------------- | ---------------------------------------------------- | ----------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumHeight | `number` | | +| maximumHeight | `number` | | +| maximumWidth | `number` | | +| maximumWidth | `number` | | +| length | `number` | Number of panels | +| size | `number` | Number of Groups | +| panels | `IDockviewPanel[]` | | +| groups | `GroupPanel[]` | | +| activePanel | `IDockviewPanel \| undefined` | | +| activeGroup | `IDockviewPanel \| undefined` | | +| | | | +| onDidLayoutChange | `Event` | | +| onDidLayoutFromJSON | `Event` | | +| onDidAddGroup | `Event` | | +| onDidRemoveGroup | `Event` | | +| onDidActiveGroupChange | `Event` | | +| onDidAddPanel | `Event` | | +| onDidRemovePanel | `Event` | | +| onDidActivePanelChange | `Event` | | +| onDidDrop | `EventAuto Resizing | +| fromJSON | `(data: SerializedDockview): void` | Serialization | +| toJSON | `(): SerializedDockview` | Serialization | +| clear | `(): void` | Clears the current layout | + +## Dockview Panel API + +```tsx +const MyComponent = (props: IDockviewPanelProps<{ title: string }>) => { + // props.api... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | --------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| width | `number` | Panel width | +| height | `number` | Panel height | +| onDidDimensionsChange | `Event` | | +| onDidFocusChange | `Event` | | +| onDidVisibilityChange | `Event` | | +| onDidActiveChange | `Event` | | +| setActive | `(): void` | | +| | | | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: SizeEvent): void` | | +| | | | +| group | `GroupPanel | undefined` | +| isGroupActive | `boolean` | | +| title | `string` | | +| suppressClosable | `boolean` | | +| close | `(): void` | | +| setTitle | `(title: string): void` | | + +## Advanced Features + +### Locked group + +Locking a group will disable all drop events for this group ensuring a user can not add additional panels to the group. +You can still add groups to a locked panel programatically using the api. + +```tsx +panel.group.locked = true; +``` + +### Group header + +You may wish to hide the header section of a group. This can achieved through setting the `hidden` variable on `panel.group.header`. + +```tsx +panel.group.header.hidden = true; +``` + +### Context Menu + +import { ContextMenuDockview } from '../../src/components/dockview/contextMenu'; + +
+ +
+ +### Rendering + +Although `DockviewReact` will only add those tabs that are visible to the DOM all associated React Components for each tab including those that +are not initially visible will be created. +This will mean that any hooks in those components will run and if you running expensive operations in the tabs you may end up doing a lot of initial +work for what are hidden tabs. + +This is the default behaviour to ensure the greatest flexibility for the user but you can create a Higher-Order component wrapping your components that +will ensure the component is only created if the tab is visible as below: + +```tsx +import { PanelApi } from 'dockview'; +import * as React from 'react'; + +function RenderWhenVisible< + T extends { api: Pick } +>(component: React.FunctionComponent) { + const HigherOrderComponent = (props: T) => { + const [visible, setVisible] = React.useState( + props.api.isVisible + ); + + React.useEffect(() => { + const disposable = props.api.onDidVisibilityChange((event) => + setVisible(event.isVisible) + ); + + return () => { + disposable.dispose(); + }; + }, [props.api]); + + if (!visible) { + return null; + } + + return React.createElement(component, props); + }; + return HigherOrderComponent; +} +``` + +```tsx +const component = RenderWhenVisible(MyComponent); +``` + +Through toggling the checkbox you can see that when you only render those panels which are visible the underling React component is destroyed when it becomes hidden and re-created when it becomes visible. + + +
+ +
+ +### Drag And Drop + +The component exposes some method to help determine whether external drag events should be interacted with or not. + +```tsx +/** + * called when an ondrop event which does not originate from the dockview libray and + * passes the showDndOverlay condition occurs + **/ +const onDidDrop = (event: DockviewDropEvent) => { + const { group } = event; + + event.api.addPanel({ + id: 'test', + component: 'default', + position: { + referencePanel: group.activePanel.id, + direction: 'within', + }, + }); +}; + +/** + * called for drag over events which do not originate from the dockview library + * allowing the developer to decide where the overlay should be shown for a + * particular drag event + **/ +const showDndOverlay = (event: DockviewDndOverlayEvent) => { + return true; +}; + +return ( + +); +``` + + + +### Events + + diff --git a/build/docs/docs/api/gridview.mdx b/build/docs/docs/api/gridview.mdx new file mode 100644 index 000000000..05b72565c --- /dev/null +++ b/build/docs/docs/api/gridview.mdx @@ -0,0 +1,116 @@ +import { SimpleGridview } from '../../src/components/simpleGridview'; +import { EventsGridview } from '../../src/components/gridview/events'; +import Link from '@docusaurus/Link'; + +# Gridview + +## Introduction + +
+ +
+ +## GridviewReact Component + +```tsx +import { ReactGridview } from 'dockview'; +``` + +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ---------------------- | --------------------------------------------------------------------------- | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| orientation | Orientation | Yes | Orientation.HORIZONTAL | | +| proportionalLayout | boolean | Yes | true | See Proportional layout | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | + +## Gridview API + +```tsx +const MyComponent = (props: IGridviewPanelProps<{ title: string }>) => { + // props.containerApi... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +```tsx +const onReady = (event: GridviewReadyEvent) => { + // event.api... +}; +``` + +| Property | Type | Description | +| ---------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumHeight | `number` | | +| maximumHeight | `number` | | +| maximumWidth | `number` | | +| maximumWidth | `number` | | +| length | `number` | Number of panels | +| panels | `ISplitviewPanel[]` | all panels | +| orientation | `Orientation` | | +| | | | +| onDidLayoutChange | `Event` | Fires on layout change | +| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | +| onDidAddPanel | `Event` | Fires when a view is added | +| onDidRemovePanel | `Event` | Fires when a view is removed | +| onDidActivePanelChange | `Event` | Fires when the active group changes | +| | | | +| addPanel | `addPanel(options: AddComponentOptions): IGridviewPanel` | | +| removePanel | `(panel: IGridviewPanel, sizing?: Sizing): void` | | +| movePanel | `(panel: IGridviewPanel, options: {direction: Direction, refernece:string, size?: number}): void` | | +| getPanel | `(id: string) \| IGridviewPanel \| undefined` | | +| | | | +| updateOptions | `(options:SplitviewComponentUpdateOptions): void` | | +| focus | `(): void` | Focus the active panel, if exists | +| layout | `(width: number, height:number): void` | Auto Resizing | +| fromJSON | `(data: SerializedGridview): void` | Serialization | +| toJSON | `(): SerializedGridview` | Serialization | +| clear | `(): void` | Clears the current layout | + +## Gridview Panel API + +```tsx +const MyComponent = (props: IGridviewPanelProps<{ title: string }>) => { + // props.api... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | ---------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| isVisible | `boolean` | Is panel visible | +| width | `number` | Panel width | +| height | `number` | Panel height | +| | | | +| onDidDimensionsChange | `Event` | | +| onDidFocusChange | `Event` | | +| onDidVisibilityChange | `Event` | | +| onDidActiveChange | `Event` | | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | | +| | | | +| setVisible | `(isVisible: boolean): void` | | +| setActive | `(): void` | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: SizeEvent): void` | | + +## Events + +`GridviewReact` exposes a number of events that the developer can listen to and below is a simple example with a log panel showing those events that occur. + + diff --git a/build/docs/docs/api/paneview.mdx b/build/docs/docs/api/paneview.mdx new file mode 100644 index 000000000..5030c11dd --- /dev/null +++ b/build/docs/docs/api/paneview.mdx @@ -0,0 +1,185 @@ +import { SimplePaneview } from '../../src/components/simplePaneview'; +import Link from '@docusaurus/Link'; + +# Paneview + +# Introduction + +
+ +
+ +## PaneviewReact Component + +```tsx +import { ReactPaneview } from 'dockview'; +``` + +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | ----------------------------------------------------------- | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| headerComponents | object | Yes | | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | Auto Resizing | +| disableDnd | boolean | Yes | false | | +| onDidDrop | Event | Yes | | | + +## Paneview API + +```tsx +const MyComponent = (props: IGridviewPanelProps<{ title: string }>) => { + // props.containerApi... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +```tsx +const onReady = (event: GridviewReadyEvent) => { + // event.api... +}; +``` + +| Property | Type | Description | +| ------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumSize | `number` | The sum of the `minimumSize` property for each panel | +| maximumSize | `number` | The sum of the `maximumSize` property for each panel | +| length | `number` | Number of panels | +| panels | `IPaneviewPanel[]` | All panels | +| | | | +| onDidLayoutChange | `Event` | Fires on layout change | +| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | +| onDidAddView | `Event` | Fires when a view is added | +| onDidRemoveView | `Event` | Fires when a view is removed | +| onDidDrop | `EventDrag and Drop) | +| | | | +| addPanel | `addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel` | | +| removePanel | `(panel: IPaneviewPanel): void` | | +| movePanel | `(from: number, to: number): void` | | +| getPanel | `(id:string): IPaneviewPanel \| undefined` | | +| | | | +| focus | `(): void` | Focus the active panel, if exists | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedPaneview): void` | Serialization | +| toJSON | `(): SerializedPaneview` | Serialization | +| clear | `(): void` | Clears the current layout | + +## Gridview Panel API + +```tsx +const MyComponent = (props: IGridviewPanelProps<{ title: string }>) => { + // props.api... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | ---------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| isVisible | `boolean` | Is panel visible | +| width | `number` | Panel width | +| height | `number` | Panel height | +| | | +| onDidDimensionsChange | `Event` | | +| onDidFocusChange | `Event` | | +| onDidVisibilityChange | `Event` | | +| onDidActiveChange | `Event` | | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | | +| | | +| setVisible | `(isVisible: boolean): void` | | +| setActive | `(): void` | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: SizeEvent): void` | | + +## Advanced Features + +### Custom Header + +The above example shows the default header and will render the `title` along with a small icon to indicate a collapsed or expanded state. +You can provide a custom header: + +```tsx +const onReady = (event: PaneviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + headerComponent: 'myHeaderComponent', + params: { + valueA: 'A', + }, + title: 'Panel 1', + }); +}; +``` + +The above example shows the default header and will render the `title` along with a small icon to indicate a collapsed or expanded state. +You can provide a custom header: + +```tsx +const onReady = (event: PaneviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + headerComponent: 'myHeaderComponent', + params: { + valueA: 'A', + }, + title: 'Panel 1', + }); +}; +``` + +You can define a header component and listen to the expanded state to update the component accordingly. + +```tsx +const CustomHeader = (props: IPaneviewPanelProps) => { + const [expanded, setExpanded] = React.useState( + props.api.isExpanded + ); + + React.useEffect(() => { + const disposable = props.api.onDidExpansionChange((event) => { + setExpanded(event.isExpanded); + }); + + return () => { + disposable.dispose(); + }; + }, []); + + const onClick = () => { + props.api.setExpanded(!expanded); + }; + + return ( + + ); +}; +``` + +You should provide a value for the `headerComponents` React prop. + +```tsx +const headerComponents = { myHeaderComponent: CustomHeader }; +``` + +### Drag And Drop diff --git a/build/docs/docs/api/splitview.mdx b/build/docs/docs/api/splitview.mdx new file mode 100644 index 000000000..b6daf2c4f --- /dev/null +++ b/build/docs/docs/api/splitview.mdx @@ -0,0 +1,243 @@ +import { SimpleSplitview } from '../../src/components/simpleSplitview'; +import { SplitviewExample1 } from '../../src/components/splitview/active'; +import Link from '@docusaurus/Link'; + +# Splitview + +## Introduction + +A Splitview is a collection resizable horizontally or vertically stacked panels. +The Splitview exposes a component level API through the `onReady` event and through the `props.containerApi` variable on the panel props. +A panel level API is exposed on each panel through it's props as `props.api`. + +
+ +
+ +```tsx title="Simple Splitview example" +import { + ISplitviewPanelProps, + Orientation, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; + +const components = { + default: (props: ISplitviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const SimpleSplitview = () => { + const onReady = (event: SplitviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + }; + + return ( + + ); +}; +``` + +## SplitviewReact Component + +You can create a Splitview through the use of the `ReactSplitview` component. + +```tsx +import { ReactSplitview } from 'dockview'; +``` + +Using the `onReady` prop you can access to the component `api` and add panels either through deserialization or indivial addition of panels. + +| Property | Type | Optional | Default | Description | +| ------------------- | -------------------------------------- | -------- | ------------------------ | --------------------------------------------------------------------------- | +| onReady | `(event: SplitviewReadyEvent) => void` | No | | Function | +| components | `Record` | No | | Panel renderers | +| orientation | `Orientation` | Yes | `Orientation.HORIZONTAL` | Orientation of the Splitview | +| proportionalLayout | `boolean` | Yes | `true` | See Proportional layout | +| hideBorders | `boolean` | Yes | `false` | Hide the borders between panels | +| className | `string` | Yes | `''` | Attaches a classname | +| disableAutoResizing | `boolean` | Yes | `false` | See Auto Resizing | + +## Splitview API + +The Splitview API is exposed both at the `onReady` event and on each panel through `props.containerApi`. + +```tsx title="Splitview API via Panel component" +const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { + // props.containerApi... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +```tsx title="Splitview API via the onReady callback" +const onReady = (event: SplitviewReadyEvent) => { + // event.api... +}; +``` + +| Property | Type | Description | +| ------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumSize | `number` | The sum of the `minimumSize` property for each panel | +| maximumSize | `number` | The sum of the `maximumSize` property for each panel | +| length | `number` | Number of panels | +| panels | `ISplitviewPanel[]` | All panels | +| | | | +| onDidLayoutChange | `Event` | Fires on layout change | +| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | +| onDidAddView | `Event` | Fires when a view is added | +| onDidRemoveView | `Event` | Fires when a view is removed | +| | | | +| addPanel | `addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel` | | +| removePanel | `(panel: ISplitviewPanel, sizing?: Sizing): void` | | +| getPanel | `(id:string): ISplitviewPanel \| undefined` | | +| movePanel | `(from: number, to: number): void` | | +| | | +| updateOptions | `(options: SplitviewComponentUpdateOptions): void` | | +| focus | `(): void` | Focus the active panel, if exists | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedSplitview): void` | Serialization | +| toJSON | `(): SerializedSplitview` | Serialization | +| clear | `(): void` | Clears the current layout | + +## Splitview Panel API + +The Splitview panel API is exposed on each panel and contains actions and variables specific to that panel. + +```tsx title="Splitview panel API via Panel component" +const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { + // props.api... + + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| isVisible | `boolean` | Is panel visible | +| width | `number` | Panel width | +| height | `number` | Panel height | +| | | | +| onDidDimensionsChange | `Event` | Fires when panel dimensions change | +| onDidFocusChange | `Event` | Fire when panel is focused and blurred | +| onDidVisibilityChange | `Event` | Fires when the panels visiblity property is changed (see Panel Visibility) | +| onDidActiveChange | `Event` | Fires when the panels active property is changed (see Active Panel) | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | Fires when the panels size contrainsts change (see Panel Constraints) | +| | | | +| setVisible | `(isVisible: boolean): void` | | +| setActive | `(): void` | | +| | | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: PanelSizeEvent): void` | | + +## Advanced Features + +Listed below are some functionality avalaible to you through both the panel and component APIs. The live demo shows examples of these in real-time. + +
+ +
+ +### Visibility + +A panels visibility can be controlled and monitoring through the following code. +A panel with visibility set to `false` will remain as a part of the components list of panels but will not be rendered. + +```tsx +const disposable = props.api.onDidVisibilityChange(({ isVisible }) => { + // +}); +``` + +```tsx +api.setVisible(true); +``` + +### Active + +Only one panel in the `splitview` can be the active panel at any one time. +Setting a panel as active will set all the others as inactive. +A focused panel is always the active panel but an active panel is not always focused. + +```tsx +const disposable = props.api.onDidActiveChange(({ isActive }) => { + // +}); +``` + +```tsx +api.setActive(); +``` + +### Contraints + +When adding a panel you can specify pixel size contraints + +```tsx +event.api.addPanel({ + id: 'panel_3', + component: 'default', + minimumSize: 100, + maximumSize: 1000, +}); +``` + +These contraints can be updated throughout the lifecycle of the `splitview` using the panel API + +```tsx +props.api.onDidConstraintsChange(({ maximumSize, minimumSize }) => { + // +}); +``` + +```tsx +api.setConstraints({ + maximumSize: 200, + minimumSize: 400, +}); +``` diff --git a/build/docs/docs/basics.mdx b/build/docs/docs/basics.mdx new file mode 100644 index 000000000..2ad80bb6d --- /dev/null +++ b/build/docs/docs/basics.mdx @@ -0,0 +1,117 @@ +--- +sidebar_position: 1 +--- + +import { SimpleSplitview } from '../src/components/simpleSplitview'; +import { SimpleSplitview2 } from '../src/components/simpleSplitview2'; + +# Basics + +This section will take you through a number of concepts that can be applied to all dockview components. + +## Panels + +The below examples use `ReactSplitview` but the logic holds for `ReactPaneview`, `ReactGridview` and `ReactDockview` using their respective implementations and interfaces. +All components require you to provide an `onReady` prop which you can use to build and control your component. + +### Adding a panel with parameters + +You can pass parameters to a panel through the `params` object + +```tsx +const onReady = (event: SplitviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'myComponent', + params: { + title: 'My Title', + }, + }); +}; +``` + +and you can access those properties through the `props.params` object. The TypeScript interface accepts an optional generic type `T` that corresponds to the params objects type. + +```tsx +const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { + return
{`My first panel has the title: ${props.params.title}`}
; +}; +``` + +## API + +There are two types of API you will interact with using `dockview`. + +- The `panel API` is accessible via `props.api` in user defined panels and via the `.api` variable found on panel instances. This API contains actions and variable related to the the individual panel. +- The `container API` is accessible via `event.api` in the `onReady` events and `props.containerApi` in user defined panels. This API contains actions and variable related to the component as a whole. + +```tsx +const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { + React.useEffect(() => { + const disposable = props.api.onDidActiveChange((event) => { + console.log(`is panel active: ${event.isActive}`); + }); + + return () => { + disposable.dispose(); // remember to dispose of any subscriptions + }; + }, [props.api]); + + const addAnotherPanel = React.useCallback(() => { + props.containerApi.addPanel({ + id: 'another_id', + component: 'anotherComponent', + }); + }, [props.containerApi]); + + return ( +
+ {`My first panel has the title: ${props.params.title}`} + +
+ ); +}; +``` + +### Serialization + +All components support `toJSON(): T` which returns a Typed object representation of the components state. This same Typed object can be used to deserialize a view using `fromJSON(object: T): void`. + +## Auto resizing + +`SplitviewReact`, `GridviewReact`, `PaneviewReact` and `DockviewReact` will all automatically resize to fill the size of their parent element. +Internally this is achieved using a [ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) which some users may need to polyfill. +You can disable this by settings the `disableAutoResizing` prop to be `true`. + +You can manually resize a component using the API method `layout(width: number, height: number): void`. +An advanced case may use this in conjunction with `disableAutoResizing=true` to allow a parent component to have ultimate control over the dimensions of the component. + +## Events + +Many API properties can be listened on using the `Event` pattern. For example `api.onDidFocusChange(() => {...})`. +You should dispose of any event listeners you create cleaning up any listeners you would have created. + +```tsx +React.useEffect(() => { + const disposable = api.onDidFocusChange(() => { + // write some code + }); + + return () => { + disposable.dispose(); + }; +}, []); +``` + +## Proportional layout + +The `proportionalLayout` property indicates the expected behaviour of the component as it's container resizes, should all views resize equally or should just one view expand to fill the new space. `proportionalLayout` can be set as a property on `SplitviewReact` and `GridviewReact` components. +Although not configurable on `DockviewReact` and `PaneviewReact` these both behave as if `proportionalLayout=true` was set for them. + + + + + +## Browser support + +dockview is intended to support all major browsers. Some users may require a polyfill for [ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver). diff --git a/build/docs/docs/index.mdx b/build/docs/docs/index.mdx new file mode 100644 index 000000000..1056e63ba --- /dev/null +++ b/build/docs/docs/index.mdx @@ -0,0 +1,150 @@ +--- +sidebar_position: 0 +--- + +import { SimpleSplitview } from '../src/components/simpleSplitview'; +import { SimpleGridview } from '../src/components/simpleGridview'; +import { SimplePaneview } from '../src/components/simplePaneview'; +import { SimpleDockview } from '../src/components/simpleDockview'; + +# Dockview + +## Introduction + +**dockview** is a zero dependency layout manager that supports tab, grids and splitviews. + +## Features + +- Themable and customizable +- Support for the serialization and deserialization of layouts +- Drag and drop support + +## Quick start + +`dockview` has a peer dependency on `react >= 16.8.0` and `react-dom >= 16.8.0`. To install `dockview` you can run: + +```shell +npm install dockview +``` + +You must also import the dockview stylesheet found under [`dockview/dict/styles/dockview.css`](https://unpkg.com/browse/dockview@latest/dist/styles/dockview.css), +depending on your solution this might be: + +```css +@import './node_modules/dockview/dist/styles/dockview.css'; +``` + +A dark and light theme are provided, one of these classes (or a custom theme) must be attached at any point above your components in the HTML tree. To cover the entire web page you might attach the class to the `body` component: + +```html + + ... + + + ... + +``` + +There are 4 components you may want to use: + +Splitview + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +```tsx +import { + DockviewReact, + DockviewReadyEvent, + PanelCollection, + IDockviewPanelProps, + IDockviewPanelHeaderProps, +} from 'dockview'; + +const components: PanelCollection = { + default: (props: IDockviewPanelProps<{ someProps: string }>) => { + return
{props.params.someProps}
; + }, +}; + +const headers: PanelCollection = { + customTab: (props: IDockviewPanelHeaderProps) => { + return ( +
+ {props.api.title} + props.api.close()}>{'[x]'} +
+ ); + }, +}; + +const Component = () => { + const onReady = (event: DockviewReadyEvent) => { + event.api.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'customTab', // optional custom header + params: { + someProps: 'Hello', + }, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + params: { + someProps: 'World', + }, + position: { referencePanel: 'panel1', direction: 'below' }, + }); + }; + + return ( + + ); +}; +``` diff --git a/build/docs/docs/theme.mdx b/build/docs/docs/theme.mdx new file mode 100644 index 000000000..1833dbdaa --- /dev/null +++ b/build/docs/docs/theme.mdx @@ -0,0 +1,80 @@ +--- +sidebar_position: 3 +--- + +import { CustomCSSDockview } from '../src/components/dockview/customCss'; + +# Theme + +## Introduction + +`dockview` requires some css to work correctly. +The css is exported as one file under [`dockview/dict/styles/dockview.css`](https://unpkg.com/browse/dockview@latest/dist/styles/dockview.css) +and depending can be imported + +```css +@import './node_modules/dockview/dist/styles/dockview.css'; +``` + +## Customizing Theme + +`dockview` supports theming through the use of css properties. +You can view the built-in themes at [`dockview/src/theme.scss`](https://github.com/mathuo/dockview/blob/master/packages/dockview/src/theme.scss) +and are free to build your own themes based on these css properties. + +| CSS Property | Description | +| ---------------------------------------------------- | ----------- | +| --dv-paneview-active-outline-color | | +| --dv-tabs-and-actions-container-font-size | | +| --dv-tabs-and-actions-container-height | | +| --dv-tab-close-icon | | +| --dv-drag-over-background-color | | +| --dv-drag-over-border-color | | +| --dv-tabs-container-scrollbar-color | | +| | | +| --dv-group-view-background-color | | +| | | +| --dv-tabs-and-actions-container-background-color | | +| | | +| --dv-activegroup-visiblepanel-tab-background-color | | +| --dv-activegroup-hiddenpanel-tab-background-color | | +| --dv-inactivegroup-visiblepanel-tab-background-color | | +| --dv-inactivegroup-hiddenpanel-tab-background-color | | +| --dv-tab-divider-color | | +| | | +| --dv-activegroup-visiblepanel-tab-color | | +| --dv-activegroup-hiddenpanel-tab-color | | +| --dv-inactivegroup-visiblepanel-tab-color | | +| --dv-inactivegroup-hiddenpanel-tab-color | | +| | | +| --dv-separator-border | | +| --dv-paneview-header-border-color | | + +You can further customise the theme through adjusting class properties but this is up you. +As an example if you wanted to add a bottom border to the tab container for an active group in the `DockviewReact` component you could write: + +```css +.groupview { + &.active-group { + > .tabs-and-actions-container { + border-bottom: 2px solid var(--dv-activegroup-visiblepanel-tab-background-color); + } + } + &.inactive-group { + > .tabs-and-actions-container { + border-bottom: 2px solid var(--dv-inactivegroup-visiblepanel-tab-background-color); + } + } +} +``` + +
+ +
diff --git a/build/docs/docusaurus.config.js b/build/docs/docusaurus.config.js new file mode 100644 index 000000000..bfee82b6f --- /dev/null +++ b/build/docs/docusaurus.config.js @@ -0,0 +1,170 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +const lightCodeTheme = require('prism-react-renderer/themes/github'); +const darkCodeTheme = require('prism-react-renderer/themes/dracula'); + +const path = require('path'); + +console.log(`isCI: ${process.env.CI}`); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Dockview', + tagline: 'Zero dependency layout manager for React', + url: 'https://your-docusaurus-test-site.com', + baseUrl: process.env.CI ? `/` : '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.ico', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'mathuo', // Usually your GitHub org/user name. + projectName: 'dockview', // Usually your repo name. + + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + plugins: [ + 'docusaurus-plugin-sass', + (context, options) => { + return { + name: 'webpack', + configureWebpack: (config, isServer, utils) => { + return { + // externals: ['react', 'react-dom'], + devtool: 'source-map', + resolve: { + alias: { + react: path.join( + __dirname, + 'node_modules', + 'react' + ), + 'react-dom': path.join( + __dirname, + 'node_modules', + 'react-dom' + ), + }, + }, + }; + }, + }; + }, + ], + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: 'Dockview', + logo: { + alt: 'My Site Logo', + src: 'img/logo.svg', + }, + items: [ + { + type: 'doc', + docId: 'index', + position: 'left', + label: 'Docs', + }, + { to: '/blog', label: 'Blog', position: 'left' }, + { + href: 'https://github.com/mathuo/dockview', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Learn', + items: [ + { + label: 'Docs', + to: '/docs', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/dockview', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/mathuo/dockview', + }, + ], + }, + ], + copyright: `Copyright Β© ${new Date().getFullYear()} Dockview, Inc. Built with Docusaurus.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + additionalLanguages: ['java', 'markdown', 'latex'], + magicComments: [ + { + className: 'theme-code-block-highlighted-line', + line: 'highlight-next-line', + block: { + start: 'highlight-start', + end: 'highlight-end', + }, + }, + { + className: 'code-block-error-line', + line: 'This will error', + }, + ], + }, + }), +}; + +module.exports = config; diff --git a/build/docs/jsexamples/dockview.html b/build/docs/jsexamples/dockview.html new file mode 100644 index 000000000..84a4e165e --- /dev/null +++ b/build/docs/jsexamples/dockview.html @@ -0,0 +1,27 @@ + + + + + + + + + + +
+ + + diff --git a/build/docs/package.json b/build/docs/package.json new file mode 100644 index 000000000..a4ce0fce7 --- /dev/null +++ b/build/docs/package.json @@ -0,0 +1,54 @@ +{ + "name": "dockview-docs", + "version": "1.4.2", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "deploy-docs": "node scripts/package-docs.js" + }, + "dependencies": { + "@docusaurus/core": "2.0.0-beta.20", + "@docusaurus/preset-classic": "2.0.0-beta.20", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.1.1", + "dockview": "^1.4.2", + "prism-react-renderer": "^1.3.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "recoil": "^0.7.3-alpha.2" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "2.0.0-beta.20", + "@tsconfig/docusaurus": "^1.0.5", + "docusaurus-plugin-sass": "^0.2.2", + "fs-extra": "^10.1.0", + "install": "^0.13.0", + "sass": "^1.52.1", + "typescript": "^4.6.4" + }, + "resolutions": { + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/build/docs/scripts/package-docs.js b/build/docs/scripts/package-docs.js new file mode 100644 index 000000000..298cd0a9c --- /dev/null +++ b/build/docs/scripts/package-docs.js @@ -0,0 +1,8 @@ +const fs = require('fs-extra'); +const path = require('path'); + +const output = path.join(__dirname, '../../build'); + +const docsDir = path.join(__dirname, '../build'); + +fs.copySync(docsDir, path.join(output)); diff --git a/build/docs/sidebars.js b/build/docs/sidebars.js new file mode 100644 index 000000000..fd342f2cd --- /dev/null +++ b/build/docs/sidebars.js @@ -0,0 +1,31 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + { + type: 'category', + label: 'Tutorial', + items: ['hello'], + }, + ], + */ +}; + +module.exports = sidebars; diff --git a/build/docs/src/components/HomepageFeatures/index.tsx b/build/docs/src/components/HomepageFeatures/index.tsx new file mode 100644 index 000000000..91ef4601d --- /dev/null +++ b/build/docs/src/components/HomepageFeatures/index.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +type FeatureItem = { + title: string; + Svg: React.ComponentType>; + description: JSX.Element; +}; + +const FeatureList: FeatureItem[] = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({title, Svg, description}: FeatureItem) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures(): JSX.Element { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/build/docs/src/components/HomepageFeatures/styles.module.css b/build/docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/build/docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/build/docs/src/components/console/console.scss b/build/docs/src/components/console/console.scss new file mode 100644 index 000000000..f2896c044 --- /dev/null +++ b/build/docs/src/components/console/console.scss @@ -0,0 +1,27 @@ +.console-container { + background-color: black; + color: white; + padding-left: 8px; + max-height: 200px; + overflow-y: scroll; + overflow-x: auto; + + .console-line { + height: 20px; + line-height: 20px; + font-size: 13px; + border-bottom: 1px solid rgb(30, 30, 30); + display: flex; + padding-left: 4px; + + .console-line-timestamp { + color: lightgray; + padding-right: 4px; + } + + .console-line-text { + padding: 0px 4px; + flex-grow: 1; + } + } +} diff --git a/build/docs/src/components/console/console.tsx b/build/docs/src/components/console/console.tsx new file mode 100644 index 000000000..c936a1476 --- /dev/null +++ b/build/docs/src/components/console/console.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import './console.scss'; + +const formatTime = (now: Date) => { + const pad = (x: number) => (x < 10 ? `0${x}` : `${x}`); + + return `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad( + now.getSeconds() + )}.${now.getMilliseconds()}`; +}; + +export interface Line { + timestamp: Date; + text: string; + css?: React.CSSProperties; +} + +export interface IConsoleProps { + lines: Line[]; +} + +export const Console = (props: IConsoleProps) => { + const ref = React.useRef(); + + React.useLayoutEffect(() => { + if (!ref.current) { + return; + } + + ref.current.scrollTop = Math.max( + 0, + ref.current.scrollHeight - ref.current.clientHeight + ); + }, [props.lines]); + + return ( +
+ {props.lines.map((line, i) => { + return ( +
+ + {formatTime(line.timestamp)} + + + {line.text} + +
+ ); + })} +
+ ); +}; diff --git a/build/docs/src/components/dockview/contextMenu.tsx b/build/docs/src/components/dockview/contextMenu.tsx new file mode 100644 index 000000000..cac359aa3 --- /dev/null +++ b/build/docs/src/components/dockview/contextMenu.tsx @@ -0,0 +1,115 @@ +import { + DockviewReact, + DockviewReadyEvent, + IDockviewPanelHeaderProps, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; + +// +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +const DefaultTab = (props: IDockviewPanelHeaderProps) => { + const [active, setActive] = React.useState(props.api.isActive); + const [groupActive, setGroupActive] = React.useState( + props.api.isGroupActive + ); + + React.useEffect(() => { + const disposable1 = props.api.onDidActiveChange((e) => { + setActive(e.isActive); + }); + const disposable2 = props.containerApi.onDidActiveGroupChange((e) => { + setGroupActive(props.api.isGroupActive); + }); + + return () => { + disposable1.dispose(); + disposable2.dispose(); + }; + }, [props.api]); + + return ( +
+ + {props.api.title} + + props.api.setActive()} + style={{ + display: 'flex', + alignItems: 'center', + paddingRight: '8px', + }} + > + {'βœ•'} + +
+ ); +}; + +const tabComponents = { + default: DefaultTab, +}; + +export const ContextMenuDockview = () => { + const onReady = (event: DockviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + tabComponent: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + tabComponent: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + tabComponent: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + tabComponent: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/dockview/customCss.tsx b/build/docs/src/components/dockview/customCss.tsx new file mode 100644 index 000000000..868bd176e --- /dev/null +++ b/build/docs/src/components/dockview/customCss.tsx @@ -0,0 +1,58 @@ +import { + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; + +// +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const CustomCSSDockview = () => { + const onReady = (event: DockviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/dockview/dnd.tsx b/build/docs/src/components/dockview/dnd.tsx new file mode 100644 index 000000000..344f30d07 --- /dev/null +++ b/build/docs/src/components/dockview/dnd.tsx @@ -0,0 +1,105 @@ +import { + DockviewDndOverlayEvent, + DockviewDropEvent, + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return ( +
+
{props.params.title}
+
+ ); + }, +}; + +export const DndDockview = (props: { renderVisibleOnly: boolean }) => { + const onReady = (event: DockviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + }; + + const onDidDrop = (event: DockviewDropEvent) => { + const { group } = event; + + event.api.addPanel({ + id: 'test', + component: 'default', + position: { + referencePanel: group.activePanel.id, + direction: 'within', + }, + }); + }; + + const showDndOverlay = (event: DockviewDndOverlayEvent) => { + return true; + }; + + return ( + <> +
+ Drag me +
+
+ +
+ + ); +}; diff --git a/build/docs/src/components/dockview/events.tsx b/build/docs/src/components/dockview/events.tsx new file mode 100644 index 000000000..0ee2b3e43 --- /dev/null +++ b/build/docs/src/components/dockview/events.tsx @@ -0,0 +1,342 @@ +import { + Orientation, + DockviewReact, + DockviewReadyEvent, + DockviewApi, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; +import { Console, Line } from '../console/console'; + +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const EventsDockview = () => { + const [lines, setLines] = React.useState([]); + const [checked, setChecked] = React.useState(false); + + const [api, setApi] = React.useState(); + + React.useEffect(() => { + if (!api) { + return () => { + //noop + }; + } + + const disposables = [ + api.onDidAddPanel((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidAddPanel: ${panel.id}`, + }, + ]); + }), + api.onDidRemovePanel((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidRemovePanel: ${panel.id}`, + }, + ]); + }), + api.onDidActivePanelChange((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidActivePanelChange: ${panel?.id}`, + }, + ]); + }), + api.onDidAddGroup((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidAddGroup: ${panel.id}`, + }, + ]); + }), + api.onDidRemoveGroup((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidRemoveGroup: ${panel.id}`, + }, + ]); + }), + api.onDidActiveGroupChange((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidActiveGroupChange: ${panel?.id}`, + }, + ]); + }), + api.onDidLayoutChange((panel) => { + setLines((lines) => [ + ...lines, + { timestamp: new Date(), text: `onDidLayoutChange` }, + ]); + }), + api.onDidLayoutFromJSON((panel) => { + setLines((lines) => [ + ...lines, + { timestamp: new Date(), text: `onDidLayoutFromJSON` }, + ]); + }), + ]; + + return () => { + disposables.forEach((disposable) => disposable.dispose()); + }; + }, [api]); + + React.useEffect(() => { + if (!api) { + return; + } + + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `Rebuilding view fromJSON:${checked}`, + css: { color: 'yellow', backgroundColor: 'grey' }, + }, + ]); + + if (checked) { + api.fromJSON({ + grid: { + root: { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel_1', 'panel_2', 'panel_3'], + activeView: 'panel_3', + id: '77', + }, + size: 262, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel_5'], + activeView: 'panel_5', + id: '79', + }, + size: 100, + }, + { + type: 'leaf', + data: { + views: ['panel_6', 'panel_8'], + activeView: 'panel_8', + id: '80', + }, + size: 100, + }, + { + type: 'leaf', + data: { + views: ['panel_7'], + activeView: 'panel_7', + id: '81', + }, + size: 100, + }, + ], + size: 262, + }, + { + type: 'leaf', + data: { + views: ['panel_4'], + activeView: 'panel_4', + id: '78', + }, + size: 263.75, + }, + ], + size: 300, + }, + width: 787.75, + height: 300, + orientation: Orientation.HORIZONTAL, + }, + panels: { + panel_1: { + id: 'panel_1', + view: { content: { id: 'default' } }, + params: { title: 'Panel 1' }, + title: 'panel_1', + }, + panel_2: { + id: 'panel_2', + view: { content: { id: 'default' } }, + params: { title: 'Panel 2' }, + title: 'panel_2', + }, + panel_3: { + id: 'panel_3', + view: { content: { id: 'default' } }, + params: { title: 'Panel 3' }, + title: 'panel_3', + }, + panel_4: { + id: 'panel_4', + view: { content: { id: 'default' } }, + params: { title: 'Panel 4' }, + title: 'panel_4', + }, + panel_5: { + id: 'panel_5', + view: { content: { id: 'default' } }, + params: { title: 'Panel 5' }, + title: 'panel_5', + }, + panel_6: { + id: 'panel_6', + view: { content: { id: 'default' } }, + params: { title: 'Panel 6' }, + title: 'panel_6', + }, + panel_8: { + id: 'panel_8', + view: { content: { id: 'default' } }, + params: { title: 'Panel 8' }, + title: 'panel_8', + }, + panel_7: { + id: 'panel_7', + view: { content: { id: 'default' } }, + params: { title: 'Panel 7' }, + title: 'panel_7', + }, + }, + activeGroup: '80', + options: {}, + }); + return; + } + + api.clear(); + + api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + + api.addPanel({ + id: 'panel_5', + component: 'default', + params: { + title: 'Panel 5', + }, + position: { referencePanel: 'panel_3', direction: 'right' }, + }); + + api.addPanel({ + id: 'panel_6', + component: 'default', + params: { + title: 'Panel 6', + }, + position: { referencePanel: 'panel_5', direction: 'below' }, + }); + + api.addPanel({ + id: 'panel_7', + component: 'default', + params: { + title: 'Panel 7', + }, + position: { referencePanel: 'panel_6', direction: 'below' }, + }); + + api.addPanel({ + id: 'panel_8', + component: 'default', + params: { + title: 'Panel 8', + }, + position: { referencePanel: 'panel_6', direction: 'within' }, + }); + }, [api, checked]); + + const onReady = (event: DockviewReadyEvent) => { + setApi(event.api); + }; + + return ( + <> + +
+ +
+ + + + ); +}; diff --git a/build/docs/src/components/dockview/rendering.tsx b/build/docs/src/components/dockview/rendering.tsx new file mode 100644 index 000000000..9dcf9d152 --- /dev/null +++ b/build/docs/src/components/dockview/rendering.tsx @@ -0,0 +1,158 @@ +import { + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + PanelApi, +} from 'dockview'; +import * as React from 'react'; + +import { atom, useRecoilState, useRecoilValue } from 'recoil'; + +const renderVisibleComponentsOnlyAtom = atom({ + key: 'renderVisibleComponentsOnlyAtom', + default: false, +}); + +function RenderWhenVisible< + T extends { api: Pick } +>(component: React.FunctionComponent) { + const HigherOrderComponent = (props: T) => { + const [visible, setVisible] = React.useState( + props.api.isVisible + ); + + const render = useRecoilValue(renderVisibleComponentsOnlyAtom); + + React.useEffect(() => { + const disposable = props.api.onDidVisibilityChange((event) => + setVisible(event.isVisible) + ); + + return () => { + disposable.dispose(); + }; + }, [props.api]); + + if (!visible && render) { + return null; + } + + return React.createElement(component, props); + }; + return HigherOrderComponent; +} + +const formatLine = (line: string) => { + const now = new Date(); + + const pad = (x: number) => (x < 10 ? `0${x}` : `${x}`); + + const time = `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad( + now.getSeconds() + )}`; + + return `[${time}] ${line}`; +}; + +const components = { + default: RenderWhenVisible( + (props: IDockviewPanelProps<{ title: string }>) => { + const [lines, setLines] = React.useState([ + formatLine('Component created'), + ]); + + React.useEffect(() => { + setLines((lines) => [ + ...lines, + formatLine('Running task for 5 seconds'), + ]); + const timeout = setTimeout(() => { + setLines((lines) => [ + ...lines, + formatLine('Task completed'), + ]); + }, 5000); + + return () => { + clearTimeout(timeout); + }; + }, []); + + return ( +
+
{props.params.title}
+ {lines.map((line, i) => ( +
{line}
+ ))} +
+ ); + } + ), +}; + +export const RenderingDockview = (props: { renderVisibleOnly: boolean }) => { + const [render, setRender] = useRecoilState(renderVisibleComponentsOnlyAtom); + + React.useEffect( + () => setRender(props.renderVisibleOnly), + [props.renderVisibleOnly] + ); + + const onReady = (event: DockviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + }; + + return ( + + ); +}; + +export const Checkbox = () => { + const [render, setRender] = useRecoilState(renderVisibleComponentsOnlyAtom); + + return ( + + ); +}; diff --git a/build/docs/src/components/gridview/events.tsx b/build/docs/src/components/gridview/events.tsx new file mode 100644 index 000000000..ee26959f9 --- /dev/null +++ b/build/docs/src/components/gridview/events.tsx @@ -0,0 +1,339 @@ +import { + IGridviewPanelProps, + Orientation, + GridviewReact, + GridviewReadyEvent, + GridviewApi, +} from 'dockview'; +import * as React from 'react'; +import { Console, Line } from '../console/console'; + +const components = { + default: (props: IGridviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const EventsGridview = () => { + const [lines, setLines] = React.useState([]); + const [checked, setChecked] = React.useState(false); + + const [api, setApi] = React.useState(); + + React.useEffect(() => { + if (!api) { + return () => { + //noop + }; + } + + const disposables = [ + api.onDidAddPanel((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidAddPanel: ${panel.id}`, + }, + ]); + }), + api.onDidRemovePanel((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidRemovePanel: ${panel.id}`, + }, + ]); + }), + api.onDidActivePanelChange((panel) => { + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `onDidActivePanelChange: ${panel?.id}`, + }, + ]); + }), + api.onDidLayoutChange((panel) => { + setLines((lines) => [ + ...lines, + { timestamp: new Date(), text: `onDidLayoutChange` }, + ]); + }), + api.onDidLayoutFromJSON((panel) => { + setLines((lines) => [ + ...lines, + { timestamp: new Date(), text: `onDidLayoutFromJSON` }, + ]); + }), + ]; + + return () => { + disposables.forEach((disposable) => disposable.dispose()); + }; + }, [api]); + + React.useEffect(() => { + if (!api) { + return; + } + + setLines((lines) => [ + ...lines, + { + timestamp: new Date(), + text: `Rebuilding view fromJSON:${checked}`, + css: { color: 'yellow', backgroundColor: 'grey' }, + }, + ]); + + if (checked) { + api.fromJSON({ + grid: { + root: { + type: 'branch', + data: [ + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + id: 'panel_3', + component: 'default', + params: { title: 'Panel 3' }, + snap: false, + }, + size: 394, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + id: 'panel_5', + component: 'default', + params: { + title: 'Panel 5', + }, + snap: false, + }, + size: 50, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + id: 'panel_6', + component: + 'default', + params: { + title: 'Panel 6', + }, + minimumWidth: 10, + snap: false, + }, + size: 131, + }, + { + type: 'leaf', + data: { + id: 'panel_8', + component: + 'default', + params: { + title: 'Panel 8', + }, + minimumWidth: 10, + snap: false, + }, + size: 131, + }, + { + type: 'leaf', + data: { + id: 'panel_7', + component: + 'default', + params: { + title: 'Panel 7', + }, + minimumWidth: 10, + snap: false, + }, + size: 132, + }, + ], + size: 50, + }, + ], + size: 394, + }, + ], + size: 100, + }, + { + type: 'leaf', + data: { + id: 'panel_2', + component: 'default', + params: { title: 'Panel 2' }, + snap: false, + }, + size: 100, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + id: 'panel_1', + component: 'default', + params: { title: 'Panel 1' }, + snap: false, + }, + size: 394, + }, + { + type: 'leaf', + data: { + id: 'panel_4', + component: 'default', + params: { title: 'Panel 4' }, + snap: false, + }, + size: 394, + }, + ], + size: 100, + }, + ], + size: 788, + }, + width: 788, + height: 300, + orientation: Orientation.VERTICAL, + }, + activePanel: 'panel_8', + }); + return; + } + + api.clear(); + api.orientation = Orientation.VERTICAL; + + api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + console.log('sdf'); + + api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + + api.addPanel({ + id: 'panel_5', + component: 'default', + params: { + title: 'Panel 5', + }, + position: { referencePanel: 'panel_3', direction: 'right' }, + }); + + api.addPanel({ + id: 'panel_6', + component: 'default', + params: { + title: 'Panel 6', + }, + position: { referencePanel: 'panel_5', direction: 'below' }, + minimumWidth: 10, + }); + + api.addPanel({ + id: 'panel_7', + component: 'default', + params: { + title: 'Panel 7', + }, + position: { referencePanel: 'panel_6', direction: 'right' }, + minimumWidth: 10, + }); + + api.addPanel({ + id: 'panel_8', + component: 'default', + params: { + title: 'Panel 8', + }, + position: { referencePanel: 'panel_6', direction: 'right' }, + minimumWidth: 10, + }); + }, [api, checked]); + + const onReady = (event: GridviewReadyEvent) => { + setApi(event.api); + }; + + return ( + <> + +
+ +
+ + + + ); +}; diff --git a/build/docs/src/components/release.tsx b/build/docs/src/components/release.tsx new file mode 100644 index 000000000..9f60e71f2 --- /dev/null +++ b/build/docs/src/components/release.tsx @@ -0,0 +1,2 @@ +import * as React from 'react'; +const URL = 'https://api.github.com/repos/mathuo/dockview/releases'; diff --git a/build/docs/src/components/simpleDockview.tsx b/build/docs/src/components/simpleDockview.tsx new file mode 100644 index 000000000..64a704d93 --- /dev/null +++ b/build/docs/src/components/simpleDockview.tsx @@ -0,0 +1,116 @@ +import { + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + PanelApi, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +const RenderWhenVisible = ( + props: T & { + children: React.FunctionComponent; + api: Pick; + } +) => { + const [visible, setVisible] = React.useState(props.api.isVisible); + + React.useEffect(() => { + const disposable = props.api.onDidVisibilityChange((event) => + setVisible(event.isVisible) + ); + + return () => { + disposable.dispose(); + }; + }, [props.api]); + + if (!visible) { + return null; + } + + return React.createElement(props.children, props); +}; + +export const SimpleDockview = () => { + const onReady = (event: DockviewReadyEvent) => { + const panel = event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + panel.group.locked = true; + panel.group.header.hidden = true; + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + + const panel5 = event.api.addPanel({ + id: 'panel_5', + component: 'default', + params: { + title: 'Panel 5', + }, + position: { referencePanel: 'panel_3', direction: 'right' }, + }); + + // panel5.group!.model.header.hidden = true; + // panel5.group!.model.locked = true; + + event.api.addPanel({ + id: 'panel_6', + component: 'default', + params: { + title: 'Panel 6', + }, + position: { referencePanel: 'panel_5', direction: 'below' }, + }); + + event.api.addPanel({ + id: 'panel_7', + component: 'default', + params: { + title: 'Panel 7', + }, + position: { referencePanel: 'panel_6', direction: 'right' }, + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/simpleGridview.tsx b/build/docs/src/components/simpleGridview.tsx new file mode 100644 index 000000000..1d468e339 --- /dev/null +++ b/build/docs/src/components/simpleGridview.tsx @@ -0,0 +1,99 @@ +import { + IGridviewPanelProps, + Orientation, + GridviewReact, + GridviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: IGridviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const SimpleGridview = () => { + const onReady = (event: GridviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + }); + + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { + title: 'Panel 4', + }, + position: { referencePanel: 'panel_1', direction: 'right' }, + }); + + event.api.addPanel({ + id: 'panel_5', + component: 'default', + params: { + title: 'Panel 5', + }, + position: { referencePanel: 'panel_3', direction: 'right' }, + }); + + event.api.addPanel({ + id: 'panel_6', + component: 'default', + params: { + title: 'Panel 6', + }, + position: { referencePanel: 'panel_5', direction: 'below' }, + minimumWidth: 10, + }); + + event.api.addPanel({ + id: 'panel_7', + component: 'default', + params: { + title: 'Panel 7', + }, + position: { referencePanel: 'panel_6', direction: 'right' }, + minimumWidth: 10, + }); + + event.api.addPanel({ + id: 'panel_8', + component: 'default', + params: { + title: 'Panel 8', + }, + position: { referencePanel: 'panel_6', direction: 'right' }, + minimumWidth: 10, + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/simplePaneview.tsx b/build/docs/src/components/simplePaneview.tsx new file mode 100644 index 000000000..d906406e5 --- /dev/null +++ b/build/docs/src/components/simplePaneview.tsx @@ -0,0 +1,102 @@ +import { + IPaneviewPanelProps, + PaneviewReact, + PaneviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: IPaneviewPanelProps<{ title: string }>) => { + return ( +
+ {props.params.title} +
+ ); + }, +}; + +const MyHeaderComponent = (props: IPaneviewPanelProps<{ title: string }>) => { + const [expanded, setExpanded] = React.useState( + props.api.isExpanded + ); + + React.useEffect(() => { + const disposable = props.api.onDidExpansionChange((event) => { + setExpanded(event.isExpanded); + }); + + return () => { + disposable.dispose(); + }; + }, []); + + const onClick = () => { + props.api.setExpanded(!expanded); + }; + + return ( +
+ ); +}; + +const headerComponents = { + myHeaderComponent: MyHeaderComponent, +}; + +export const SimplePaneview = () => { + const onReady = (event: PaneviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + title: 'Panel 1', + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + title: 'Panel 2', + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + title: 'Panel 3', + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/simpleSplitview.tsx b/build/docs/src/components/simpleSplitview.tsx new file mode 100644 index 000000000..219bf6088 --- /dev/null +++ b/build/docs/src/components/simpleSplitview.tsx @@ -0,0 +1,54 @@ +import { + ISplitviewPanelProps, + Orientation, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: ISplitviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, +}; + +export const SimpleSplitview = (props: { proportional?: boolean }) => { + const onReady = (event: SplitviewReadyEvent) => { + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + minimumSize: 100, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + minimumSize: 100, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + minimumSize: 100, + }); + }; + + return ( + + ); +}; diff --git a/build/docs/src/components/simpleSplitview2.tsx b/build/docs/src/components/simpleSplitview2.tsx new file mode 100644 index 000000000..1ffd12356 --- /dev/null +++ b/build/docs/src/components/simpleSplitview2.tsx @@ -0,0 +1,60 @@ +import { SimpleSplitview } from './simpleSplitview'; +import * as React from 'react'; + +export const SimpleSplitview2 = (props: { proportional?: boolean }) => { + const [value, setValue] = React.useState(50); + + const onChange = (event: React.ChangeEvent) => { + setValue(Number(event.target.value)); + }; + + return ( +
+
+ + + Slide to resize the splitview container + +
+
+
+ +
+
+
+
+ ); +}; diff --git a/build/docs/src/components/splitview/active.tsx b/build/docs/src/components/splitview/active.tsx new file mode 100644 index 000000000..bf8f5fcd9 --- /dev/null +++ b/build/docs/src/components/splitview/active.tsx @@ -0,0 +1,161 @@ +import { + ISplitviewPanel, + ISplitviewPanelProps, + Orientation, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; + +const components = { + default: (props: ISplitviewPanelProps<{ title: string }>) => { + const [active, setActive] = React.useState(props.api.isActive); + const [visible, setVisible] = React.useState( + props.api.isVisible + ); + const [focused, setFocused] = React.useState( + props.api.isFocused + ); + const [dimensions, setDimensions] = React.useState<{ + height: number; + width: number; + }>({ + height: props.api.height, + width: props.api.width, + }); + + React.useEffect(() => { + const disposable1 = props.api.onDidActiveChange((event) => + setActive(event.isActive) + ); + const disposable2 = props.api.onDidVisibilityChange((event) => + setVisible(event.isVisible) + ); + const disposable3 = props.api.onDidFocusChange((event) => + setFocused(event.isFocused) + ); + const disposable4 = props.api.onDidDimensionsChange((event) => { + setDimensions({ height: event.height, width: event.width }); + }); + + return () => { + disposable1.dispose(); + disposable2.dispose(); + disposable3.dispose(); + disposable4.dispose(); + }; + }, []); + + return ( +
+ {'Panel ID: '} + {props.api.id} + {'Height: '} + {`${dimensions.height}px`} + {'Width: '} + {`${dimensions.width}px`} + {'Focused: '} + {`${ + focused ? 'True' : 'False' + }`} + + {'Active: '} + {`${ + active ? 'True' : 'False' + }`} + + {'Visible: '} + {`${ + visible ? 'True' : 'False' + }`} +
+ ); + }, +}; + +export const SplitviewExample1 = (props: { proportional?: boolean }) => { + const [panels, setPanels] = React.useState([]); + + const onReady = React.useCallback((event: SplitviewReadyEvent) => { + event.api.onDidAddView((panel) => setPanels(event.api.panels)); + event.api.onDidRemoveView((panel) => setPanels(event.api.panels)); + + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { + title: 'Panel 1', + }, + minimumSize: 100, + }); + + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { + title: 'Panel 2', + }, + minimumSize: 100, + }); + + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { + title: 'Panel 3', + }, + minimumSize: 100, + }); + }, []); + + return ( + <> +
+ +
+
+ {panels.map((panel) => { + return ( +
+
{panel.id}
+
+ + +
+
+ ); + })} +
+ + ); +}; diff --git a/build/docs/src/components/splitview/math.scss b/build/docs/src/components/splitview/math.scss new file mode 100644 index 000000000..b62b97281 --- /dev/null +++ b/build/docs/src/components/splitview/math.scss @@ -0,0 +1,63 @@ +.splitview-math-blog { + .sash { + background-color: orange; + position: absolute; + top: 0px; + width: 4px; + height: 100%; + z-index: 2; + cursor: ew-resize; + user-select: none; + } + + .debug-sash-max { + height: 10px; + width: 1px; + position: absolute; + z-index: 999; + top: -10px; + } + + .debug-sash-min { + height: 10px; + width: 1px; + position: absolute; + z-index: 999; + top: 100%; + } + + .debug-sash-text { + height: 20px; + line-height: 20px; + width: 80px; + display: flex; + justify-content: center; + position: absolute; + z-index: 999; + font-size: 14px; + } + + .sash-container { + position: absolute; + height: 100%; + } + + .view-container { + position: relative; + height: 100%; + } + + .view { + position: absolute; + height: 100%; + background-color: dodgerblue; + z-index: 1; + top: 0px; + padding: 10px; + color: white; + } + + .sash.drag-sash { + background-color: red; + } +} diff --git a/build/docs/src/components/splitview/math.tsx b/build/docs/src/components/splitview/math.tsx new file mode 100644 index 000000000..eeec3b559 --- /dev/null +++ b/build/docs/src/components/splitview/math.tsx @@ -0,0 +1,342 @@ +import * as React from 'react'; +import './math.scss'; + +const min = 100; +const max = 300; + +interface IDebugResize { + leftmin: number; + leftmax: number; + rightmin: number; + rightmax: number; + min: number; + max: number; +} + +const resize = ( + index: number, + delta: number, + sizes: number[], + mode: number +) => { + const nextSizes = [...sizes]; + + const left = nextSizes.filter((_, i) => i <= index); + const right = nextSizes.filter((_, i) => i > index); + + let result: IDebugResize = { + leftmin: undefined, + leftmax: undefined, + rightmin: undefined, + rightmax: undefined, + max: undefined, + min: undefined, + }; + + // step 3 + if (mode > 2) { + const leftMinimumsDelta = left + .map((x) => min - x) + .reduce((x, y) => x + y, 0); + const leftMaximumsDelta = left + .map((x) => max - x) + .reduce((x, y) => x + y, 0); + const rightMinimumsDelta = right + .map((x) => x - min) + .reduce((x, y) => x + y, 0); + const rightMaximumsDelta = right + .map((x) => x - max) + .reduce((x, y) => x + y, 0); + const _min = Math.max(leftMinimumsDelta, rightMaximumsDelta); + const _max = Math.min(leftMaximumsDelta, rightMinimumsDelta); + const clamp = Math.max(_min, Math.min(_max, delta)); + + result = { + leftmin: leftMinimumsDelta, + leftmax: leftMaximumsDelta, + rightmin: rightMinimumsDelta, + rightmax: rightMaximumsDelta, + max: _max, + min: _min, + }; + delta = clamp; + } + + let usedDelta = 0; + let remainingDelta = delta; + + // Step 1 + for (let i = left.length - 1; i > -1; i--) { + const x = Math.max(min, Math.min(max, left[i] + remainingDelta)); + const viewDelta = x - left[i]; + usedDelta += viewDelta; + remainingDelta -= viewDelta; + left[i] = x; + } + + // Step 2 + if (mode > 1) { + for (let i = 0; i < right.length; i++) { + const x = Math.max(min, Math.min(max, right[i] - usedDelta)); + const viewDelta = x - right[i]; + usedDelta += viewDelta; + right[i] = x; + } + } + + return { ...result, sizes: [...left, ...right] }; +}; + +interface ILayoutState { + sashes: number[]; + views: number[]; + deltas: number[]; + left: number; + right: number; + debug: IDebugResize; + drag: number; +} + +export const Splitview = (props: { mode: number; debug: boolean }) => { + // keep the sashes and views in one state to prevent weird out-of-sync-ness + const [layout, setLayout] = React.useState({ + sashes: [200, 400], + views: [200, 200, 200], + deltas: [0, 0, 0], + left: 0, + right: 0, + debug: undefined, + drag: -1, + }); + + const ref = React.useRef(); + + const onMouseDown = (index: number) => (ev: React.MouseEvent) => { + const start = ev.clientX; + const sizes = [...layout.views]; + + const mousemove = (ev: MouseEvent) => { + const current = ev.clientX; + const delta = current - start; + const { + sizes: nextLayout, + rightmin, + rightmax, + leftmin, + leftmax, + max, + min, + } = resize(index, delta, sizes, props.mode); + const sashes = nextLayout.reduce( + (x, y) => [...x, y + (x.length === 0 ? 0 : x[x.length - 1])], + [] + ); + sashes.splice(sashes.length - 1, 1); + const deltas = sizes.map((x, i) => nextLayout[i] - x); + + const offset = start - ref.current?.getBoundingClientRect().left; + + setLayout({ + views: nextLayout, + sashes, + deltas, + left: deltas + .filter((_, i) => i <= index) + .reduce((x, y) => x + y, 0), + right: deltas + .filter((_, i) => i > index) + .reduce((x, y) => x + y, 0), + debug: { + leftmax: leftmax + offset, + leftmin: leftmin + offset, + rightmax: rightmax + offset, + rightmin: rightmin + offset, + min: min + offset, + max: max + offset, + }, + drag: index, + }); + }; + + const end = (ev: MouseEvent) => { + document.removeEventListener('mousemove', mousemove); + document.removeEventListener('mouseup', end); + setLayout((_) => ({ + ..._, + deltas: _.deltas.map((_) => 0), + left: 0, + right: 0, + drag: -1, + })); + }; + + document.addEventListener('mousemove', mousemove); + document.addEventListener('mouseup', end); + }; + + const extras = React.useMemo(() => { + if (!props.debug || !layout.debug || props.mode < 3) { + return null; + } + return ( + <> +
+ left-max +
+
+ left-min +
+
+ right-max +
+
+ right-min +
+
+
+
+
+ + ); + }, [layout.debug]); + + return ( +
+ {props.debug && ( +
+ {`Change to left ${layout?.left}`} + {`Change to right ${layout?.right}`} + {`Total size ${layout?.views.reduce( + (x, y) => x + y, + 0 + )}`} +
+ )} +
+
+ {layout.sashes.map((x, i) => { + const className = + layout.drag === i ? 'sash drag-sash' : 'sash'; + return ( +
+ ); + })} + {extras} +
+
+ {layout.views.map((x, i) => { + const isMax = x >= max; + const isMin = x <= min; + + return ( +
+ {props.debug && ( + <> +
+ {`${layout.views[i]} (${ + layout.deltas[i] > -1 ? '+' : '' + }${layout.deltas[i]})`} +
+
{`isMin = ${isMin}`}
+
{`isMax = ${isMax}`}
+ + )} +
+ ); + })} +
+
+
+ ); +}; diff --git a/build/docs/src/css/custom.css b/build/docs/src/css/custom.css new file mode 100644 index 000000000..9a917885e --- /dev/null +++ b/build/docs/src/css/custom.css @@ -0,0 +1,32 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} + +@import "~dockview/dist/styles/dockview.css" diff --git a/build/docs/src/misc/math/constraints.jpg b/build/docs/src/misc/math/constraints.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a43a30933c6879ed4668e84e97e4730de71c5d39 GIT binary patch literal 137417 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 z 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 literal 0 HcmV?d00001 diff --git a/build/docs/src/misc/math/math.mdx b/build/docs/src/misc/math/math.mdx new file mode 100644 index 000000000..47b146f66 --- /dev/null +++ b/build/docs/src/misc/math/math.mdx @@ -0,0 +1,378 @@ +import { Splitview } from '../../src/components/splitview/math'; + +Wondering how to create a resizable split view, pane or window; whichever you may call it? +Here's a langauge indepedant walkthrough of how to design a split view control from scratch and the simple math behind it. +You will find links to all examples which are written using TypeScript. + +Here's the end result and you can continue to read on to see how we got here. + + + +## First of all, what is a split view control? + +Not all split view controls are born equal, but for our purposes + +> A split view control is comprised from a number of 'views' layed out either horizontally or vertically. +> Each view can be indepedantly resized by dragging on the edge of a particular view. + +In order to explain how this works we are going to need some more in-depth definitions so lets start with the two +fundamental components of this control, the View and the Sash (I will explain). +The below assumes the split view control has n views, where n is positive number. +For example if n=4 then our split view controls has 4 views. This generic approach will make it much easier to explain going forwards. + +

+
View
+
    +
  • + The size of the nth view will be known as Vn +
  • +
  • + The minimum size of the nth view will be known as V + min + n +
  • +
  • + The maximum size of the nth view will be known as V + max + n +
  • +
+
+ +Additional by definition we can known Vminn <= Vn <= Vmaxn + +To be able to resize a view we need to be able to drag on the edge of a view to increase or decrease it's size. +This can be achieved by introducing a narrow component that sits between each view acting as a 'drag handle'. +We will call this component a Sash because sash is also the word for those [windows](https://en.wikipedia.org/wiki/Sash_window) with movable panels. + +
+
Sash
+
    +
  • If we have n views then we will have n-1 sashes. There is no sash before V0 nor after Vn
  • +
  • The sash between Vn and Vn+1 is known as Sn
  • +
  • The sash is of fixed width, and it's sole purpose is to act a drag-handle for resizing views
  • + +
+
+ +This now gives us a definition of the split view control but in additional to that, to calculate the new view sizes +after a sash is dragged we need to know which sash is being dragged. +We will denote the sash Si as the sash to drag going forwards we can reference the following diagram. + +![alt txt](./visual_1.jpg) + +If we are to drag the sash Si then we need to also know how far along the x-axis, or the horizontal-axis we have travelled. +We can denote this as the delta, using the symbol Ξ”. +Delta is only limited by how wide the screen is so for this purpose we can say it ranges from negative to positive infinity, that is -∞ < Ξ” < ∞ . + +In reality as you will see we will apply a set of constraints on the value of Ξ” reducing it's overall set of valid values. + +## Iteration #1 - The naive approach (aka. the accordian) + +As I add delta I increase view sizes and as I remove delta I decrease view sizes. +A rather naive approach but it could look something like this: + +- as the sash moves left shrink each view to the left and as the sash moves right expand each view to left, from right-most to left-most in both caes. +- If there is enough delta to shrink a view to it's mimimum size then move onto the next view, and if we have enough delta to expand a view to it's maximum size then again move onto the next view. +- Shrink no more once everything to the left is at minimums and expand no more once everything to the left is at maximums +- We don't manipulate any views to the right of the active sash Si + +You should be able to show each of the four points above hold true for the below interactive example. +You'll see that changes to the right will always remain at zero because we are not manipulating views to the right of the active sash. + + + +There are some obvious flaws with this approach but before we go into that lets put this implemenation in psuedocode using our definitions +from above where we drag sash Si by an amount Ξ” + +
+
+ Ξ”remaining = Ξ” +
+
+ for + + (j = i; j >= 0; i--) + + do +
+
+ + Vnext + j = Min(V + max + + j, Max(V + min + j, Vj + Ξ”remaining)) + +
+
+ + VΞ” + j = Vnext + j - Vj + +
+
+ + Ξ”remaining = Ξ”remaining - VΞ” + j + +
+
+ + Vj = Vnext + j + +
+
+ +or in plain text + +
+
+
1
+
2
+
3
+
4
+
+
+
+ For each view j to the left of the sash we have dragged, from + right-most to left-most +
+
+ Add the delta to the view j (clamped at either the maximum or + minimum value) +
+
+ Subtract the different between the new and old size (the used delta) + from the remaining delta +
+
repeat
+
+
+ +Going back to that obvious flaw, the width of the control does not remain constant. It flexes with Ξ”. + +## Iteration #2 - Ξ” is added. Then Ξ” must be removed + +We want a component of constant width and we dont want to think too hard. +So If I have added Ξ” to the left then I should add -Ξ” (or remove Ξ”) on the right, and vice-versa; right? Nearly. + + + +There are some more subtle flaws with this approach; but lets describe it in psuedocode first. +We now need another variable to track the delta we've added on the left, Ξ”used. +After we've applied changes to the left side we'll substract this Ξ”used from the right side which should keep the width of our control at a +constant size. + +
+
+ Ξ”remaining = Ξ” +
+
+ Ξ”used = 0 +
+
+ for(j = i; j >= 0; i--) + do +
+
+ + Vnextj = Min(Vmaxj, Max(Vminj, Vj + Ξ”remaining)) + +
+
+ + VΞ”j = Vnextj - Vj + +
+
+ + Ξ”remaining = Ξ”remaining - VΞ”j + +
+
+ + Ξ”used = Ξ”used + VΞ”j + +
+
+ + Vj = Vnextj + +
+ +
+
+for({"j = i+1; j < n; i++"}) + do +
+
+ + Vnextj = Min(Vmaxj, Max(Vminj,Vj - Ξ”used)) + +
+
+ + VΞ”j = Vnextj - Vj + +
+
+ +Ξ”used = Ξ”used + VΞ”j + +
+
+ +Vj = Vnextj + +
+
+ +Go back and try to minimise or maximise every view in the container. The width is no longer preserved, you can see at some point the change to the left +is not longer eqaul to the change on the right, which causes the container to once again flex. + +## Iteration #3 - Constraining the values of Ξ” + +In the cases where iteration #2 is not working correctly this can be explained as either adding or removing too much delta. +Fortunately it turns out there are a few constraints we can define on delta to help with this. +For a sash Si lets think about the minimum and maximum amount of delta we can use. +Try to follow the explainations first and then we will use another interactive example and diagram to reinforce the explaination. + +> Si can go no further left that the sum of the minimum sizes of the views to the left, and can go no further right than the sum of the +> minimum sizes of the views to the right; because otherwise you would end up with at least one view that is smaller than it's specified minimum. + +> Another less obvious condition on Si is that it can go no further left that the sum of the maximum sizes of the views to the right, and can go no further +> right than the sum of maximum sizes to the left; because otherwise you would end up with at least one view that is larger than it's specified maximum. + +This leaves us with 4 constraints we need to apply on Ξ”; but since Ξ” is relative to Si first of all we need these +constraints relative to Si. That is to say what amount of Ξ” is equivalent to the constraints we just described. + +When the views to the left of Si are all at minimum size we will call the distance between here and Ξ” to be Ξ”minleft. +This distance would be the sum of the differences between +Vminj and Vj for each view, or in more format notation we could write this as + +
+ + Ξ”min + left = Ξ£ Vmin + j - Vj + + j = i,...0 +
+ +Similarly we can work out the distance between Si and the point at each every view to the left is at its +maximum size as the sum of differences between Vmaxj an Vj + +
+ + Ξ”max + left = Ξ£ Vmax + j - Vj + + j = i,...0 +
+ +The same logic can be applied to work out those values for Ξ”minright and Ξ”maxright + +
+
+ + Ξ”min + right = Ξ£ Vj - Vmin + j + + j = i+1...n +
+
+ + Ξ”max + right = Ξ£ Vj - Vmin + j + + j = i+1...n +
+
+ +We now have two minimum constraints which are Vminleft and Vmaxright and two maximum +constraints Vmaxleft and Vminright. +To get one minimum and maximum value for the Ξ” we should take the maximum of the two minimums and the minimum of the two maximums which will +ensure all four constraints will hold true. + +
+
+ Ξ”min = MAX ( Vmin + left , Vmax + right ) +
+
+ Ξ”max = MIN ( Vmax + left , Vmin + right ) +
+
+ +Finally we must clamp our Ξ” to be within this minimum and maxium boundary. +This clamped delta can be used in place of delta in the pseudocode from iteration #2. + +
+ Ξ”clamped = MIN ( Vmax , MAX ( Vmin , Ξ” ) ) +
+ +You can see how this works in this interactive example which also shows the current values of our four constraints for each sash drag event. + + + +Additionally you can see in the below diagram how all of our above calculations come together to give a minimum and maximum constraints on Ξ”. + +![alt txt](./constraints.jpg) + +## Appendix + +### The clamp function + +To clamp a value is to say given a value, a minimum and a maximum return + +- the minimum, if value < minimum +- the maximum if value > maximum +- otherwise returning the value + +In otherwords we have 'clamped' the value to be within our defined minimum and maximum values. Mathematically we can write this as + +
+ f(value, valuemin, valuemax) = MIN(value + max, MAX(valuemin, value)) +
+ +with some examples + +
+
+ f(10, 20, 30) = 20 +
+
+ f(40, 20, 30) = 30 +
+
+ f(25, 20, 30) = 25 +
+
diff --git a/build/docs/src/misc/math/visual_1.jpg b/build/docs/src/misc/math/visual_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f7375dc500495f7a8db77c8afe35b8f657143ee GIT binary patch literal 35574 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 +
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Get Started + +
+
+ + ); +} + +export default function Home(): JSX.Element { + const { siteConfig } = useDocusaurusContext(); + return ( + + +
+
+ +
+ {/* */} +
+
+ ); +} diff --git a/build/docs/src/pages/markdown-page.md b/build/docs/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/build/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/build/docs/src/theme/Root.tsx b/build/docs/src/theme/Root.tsx new file mode 100644 index 000000000..516775b04 --- /dev/null +++ b/build/docs/src/theme/Root.tsx @@ -0,0 +1,7 @@ +import React from 'react'; +import { RecoilRoot } from 'recoil'; + +// Default implementation, that you can customize +export default function Root({ children }) { + return {children}; +} diff --git a/build/docs/static/img/docusaurus.png b/build/docs/static/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/build/docs/static/img/favicon.ico b/build/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c01d54bcd39a5f853428f3cd5aa0f383d963c484 GIT binary patch literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 \ No newline at end of file diff --git a/build/docs/static/img/undraw_docusaurus_mountain.svg b/build/docs/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 000000000..af961c49a --- /dev/null +++ b/build/docs/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/docs/static/img/undraw_docusaurus_react.svg b/build/docs/static/img/undraw_docusaurus_react.svg new file mode 100644 index 000000000..94b5cf08f --- /dev/null +++ b/build/docs/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/docs/static/img/undraw_docusaurus_tree.svg b/build/docs/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 000000000..d9161d339 --- /dev/null +++ b/build/docs/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/docs/tsconfig.json b/build/docs/tsconfig.json new file mode 100644 index 000000000..6f4756980 --- /dev/null +++ b/build/docs/tsconfig.json @@ -0,0 +1,7 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@tsconfig/docusaurus/tsconfig.json", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/build/docs/yarn.lock b/build/docs/yarn.lock new file mode 100644 index 000000000..91966988d --- /dev/null +++ b/build/docs/yarn.lock @@ -0,0 +1,7764 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.6.3": + version "1.6.3" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz" + integrity sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA== + dependencies: + "@algolia/autocomplete-shared" "1.6.3" + +"@algolia/autocomplete-shared@1.6.3": + version "1.6.3" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz" + integrity sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg== + +"@algolia/cache-browser-local-storage@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz" + integrity sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg== + dependencies: + "@algolia/cache-common" "4.13.1" + +"@algolia/cache-common@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz" + integrity sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA== + +"@algolia/cache-in-memory@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz" + integrity sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ== + dependencies: + "@algolia/cache-common" "4.13.1" + +"@algolia/client-account@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz" + integrity sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-analytics@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz" + integrity sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-common@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz" + integrity sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg== + dependencies: + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-personalization@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz" + integrity sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-search@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz" + integrity sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz" + integrity sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw== + +"@algolia/logger-console@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz" + integrity sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA== + dependencies: + "@algolia/logger-common" "4.13.1" + +"@algolia/requester-browser-xhr@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz" + integrity sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA== + dependencies: + "@algolia/requester-common" "4.13.1" + +"@algolia/requester-common@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz" + integrity sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w== + +"@algolia/requester-node-http@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz" + integrity sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw== + dependencies: + "@algolia/requester-common" "4.13.1" + +"@algolia/transporter@4.13.1": + version "4.13.1" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz" + integrity sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw== + dependencies: + "@algolia/cache-common" "4.13.1" + "@algolia/logger-common" "4.13.1" + "@algolia/requester-common" "4.13.1" + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.15.5", "@babel/core@^7.17.10": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz" + integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.12.5", "@babel/generator@^7.17.10", "@babel/generator@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz" + integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz" + integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz" + integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== + dependencies: + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.18.0": + version "7.18.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz" + integrity sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz" + integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz" + integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + +"@babel/plugin-proposal-async-generator-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz" + integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz" + integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-class-static-block@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz" + integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz" + integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz" + integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz" + integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz" + integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz" + integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.17.12" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz" + integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz" + integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-private-property-in-object@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz" + integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz" + integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz" + integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz" + integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-arrow-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz" + integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-async-to-generator@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz" + integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz" + integrity sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-classes@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz" + integrity sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz" + integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-destructuring@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz" + integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz" + integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.18.1": + version "7.18.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz" + integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz" + integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz" + integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz" + integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-simple-access" "^7.18.2" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz" + integrity sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz" + integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz" + integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-new-target@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz" + integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz" + integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-constant-elements@^7.14.5": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz" + integrity sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz" + integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/types" "^7.17.12" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz" + integrity sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-regenerator@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz" + integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz" + integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-runtime@^7.17.10": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz" + integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz" + integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz" + integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typeof-symbol@^7.17.12": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz" + integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typescript@^7.17.12": + version "7.18.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.1.tgz" + integrity sha512-F+RJmL479HJmC0KeqqwEGZMg1P7kWArLGbAKfEi9yPthJyMNjF+DjxFF/halfQvq1Q9GFM4TUbYDNV8xe4Ctqg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-typescript" "^7.17.12" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.15.6", "@babel/preset-env@^7.17.10": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz" + integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-async-generator-functions" "^7.17.12" + "@babel/plugin-proposal-class-properties" "^7.17.12" + "@babel/plugin-proposal-class-static-block" "^7.18.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.17.12" + "@babel/plugin-proposal-json-strings" "^7.17.12" + "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.18.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-private-methods" "^7.17.12" + "@babel/plugin-proposal-private-property-in-object" "^7.17.12" + "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.17.12" + "@babel/plugin-transform-async-to-generator" "^7.17.12" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.17.12" + "@babel/plugin-transform-classes" "^7.17.12" + "@babel/plugin-transform-computed-properties" "^7.17.12" + "@babel/plugin-transform-destructuring" "^7.18.0" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.17.12" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.18.1" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.17.12" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.18.0" + "@babel/plugin-transform-modules-commonjs" "^7.18.2" + "@babel/plugin-transform-modules-systemjs" "^7.18.0" + "@babel/plugin-transform-modules-umd" "^7.18.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" + "@babel/plugin-transform-new-target" "^7.17.12" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.18.0" + "@babel/plugin-transform-reserved-words" "^7.17.12" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.17.12" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.18.2" + "@babel/plugin-transform-typeof-symbol" "^7.17.12" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.2" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.14.5", "@babel/preset-react@^7.16.7": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz" + integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.17.12" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.16.7": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz" + integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.17.12" + +"@babel/runtime-corejs3@^7.17.9": + version "7.18.3" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz" + integrity sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.8.4": + version "7.18.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.4.4": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz" + integrity sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@docsearch/css@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz" + integrity sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA== + +"@docsearch/react@^3.0.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz" + integrity sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg== + dependencies: + "@algolia/autocomplete-core" "1.6.3" + "@docsearch/css" "3.1.0" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.20.tgz" + integrity sha512-a3UgZ4lIcIOoZd4j9INqVkWSXEDxR7EicJXt8eq2whg4N5hKGqLHoDSnWfrVSPQn4NoG5T7jhPypphSoysImfQ== + dependencies: + "@babel/core" "^7.17.10" + "@babel/generator" "^7.17.10" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.17.10" + "@babel/preset-env" "^7.17.10" + "@babel/preset-react" "^7.16.7" + "@babel/preset-typescript" "^7.16.7" + "@babel/runtime" "^7.17.9" + "@babel/runtime-corejs3" "^7.17.9" + "@babel/traverse" "^7.17.10" + "@docusaurus/cssnano-preset" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + "@slorber/static-site-generator-webpack-plugin" "^4.0.4" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.5" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "2.3.0" + boxen "^6.2.1" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^10.2.4" + core-js "^3.22.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^3.4.1" + cssnano "^5.1.7" + del "^6.0.0" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^1.12.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.0" + postcss "^8.4.13" + postcss-loader "^6.2.1" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.2.0" + react-router-config "^5.1.1" + react-router-dom "^5.2.0" + remark-admonitions "^1.2.1" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.1" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.72.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.8.1" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz" + integrity sha512-7pfrYuahHl3YYS+gYhbb1YHsq5s5+hk+1KIU7QqNNn4YjrIqAHlOznCQ9XfQfspe9boZmaNFGMZQ1tawNOVLqQ== + dependencies: + cssnano-preset-advanced "^5.3.3" + postcss "^8.4.13" + postcss-sort-media-queries "^4.2.1" + +"@docusaurus/logger@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz" + integrity sha512-7Rt7c8m3ZM81o5jsm6ENgdbjq/hUICv8Om2i7grynI4GT2aQyFoHcusaNbRji4FZt0DaKT2CQxiAWP8BbD4xzQ== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz" + integrity sha512-BBuf77sji3JxbCEW7Qsv3CXlgpm+iSLTQn6JUK7x8vJ1JYZ3KJbNgpo9TmxIIltpcvNQ/QOy6dvqrpSStaWmKQ== + dependencies: + "@babel/parser" "^7.17.10" + "@babel/traverse" "^7.17.10" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.72.0" + +"@docusaurus/module-type-aliases@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz" + integrity sha512-lUIXLwQEOyYwcb3iCNibPUL6O9ijvYF5xQwehGeVraTEBts/Ch8ZwELFk+XbaGHKh52PiVxuWL2CP4Gdjy5QKw== + dependencies: + "@docusaurus/types" "2.0.0-beta.20" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + +"@docusaurus/plugin-content-blog@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz" + integrity sha512-6aby36Gmny5h2oo/eEZ2iwVsIlBWbRnNNeqT0BYnJO5aj53iCU/ctFPpJVYcw0l2l8+8ITS70FyePIWEsaZ0jA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + cheerio "^1.0.0-rc.10" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + remark-admonitions "^1.2.1" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.72.0" + +"@docusaurus/plugin-content-docs@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz" + integrity sha512-XOgwUqXtr/DStpB3azdN6wgkKtQkOXOx1XetORzhHnjihrSMn6daxg+spmcJh1ki/mpT3n7yBbKJxVNo+VB38Q== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + remark-admonitions "^1.2.1" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.72.0" + +"@docusaurus/plugin-content-pages@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz" + integrity sha512-ubY6DG4F0skFKjfNGCbfO34Qf+MZy6C05OtpIYsoA2YU8ADx0nRH7qPgdEkwR3ma860DbY612rleRT13ogSlhg== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + fs-extra "^10.1.0" + remark-admonitions "^1.2.1" + tslib "^2.4.0" + webpack "^5.72.0" + +"@docusaurus/plugin-debug@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz" + integrity sha512-acGZmpncPA1XDczpV1ji1ajBCRBY/H2lXN8alSjOB1vh0c/2Qz+KKD05p17lsUbhIyvsnZBa/BaOwtek91Lu7Q== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz" + integrity sha512-4C5nY25j0R1lntFmpSEalhL7jYA7tWvk0VZObiIxGilLagT/f9gWPQtIjNBe4yzdQvkhiaXpa8xcMcJUAKRJyw== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz" + integrity sha512-EMZdiMTNg4NwE60xwjbetcqMDqAOazMTwQAQ4OuNAclv7oh8+VPCvqRF8s8AxCoI2Uqc7vh8yzNUuM307Ne9JA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz" + integrity sha512-Rf5a2vOBWjbe7PJJEBDeLZzDA7lsDi+16bqzKN8OKSXlcZLhxjmIpL5NrjANNbpGpL5vbl9z+iqvjbQmZ3QSmA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz" + integrity sha512-artUDjiYFIlGd2fxk0iqqcJ5xSCrgormOAoind1c0pn8TRXY1WSCQWYI6p4X24jjhSCzLv0s6Z9PMDyxZdivhg== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" + "@docusaurus/plugin-debug" "2.0.0-beta.20" + "@docusaurus/plugin-google-analytics" "2.0.0-beta.20" + "@docusaurus/plugin-google-gtag" "2.0.0-beta.20" + "@docusaurus/plugin-sitemap" "2.0.0-beta.20" + "@docusaurus/theme-classic" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-search-algolia" "2.0.0-beta.20" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz" + integrity sha512-rs4U68x8Xk6rPsZC/7eaPxCKqzXX1S45FICKmq/IZuaDaQyQIijCvv2ssxYnUyVZUNayZfJK7ZtNu+A0kzYgSQ== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-translations" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + "@mdx-js/react" "^1.6.22" + clsx "^1.1.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.39" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.13" + prism-react-renderer "^1.3.1" + prismjs "^1.28.0" + react-router-dom "^5.2.0" + rtlcss "^3.5.0" + +"@docusaurus/theme-common@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz" + integrity sha512-lmdGB3/GQM5z0GH0iHGRXUco4Wfqc6sR5eRKuW4j0sx3+UFVvtbVTTIGt0Cie4Dh6omnFxjPbNDlPDgWr/agVQ== + dependencies: + "@docusaurus/module-type-aliases" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" + clsx "^1.1.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.1" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz" + integrity sha512-9XAyiXXHgyhDmKXg9RUtnC4WBkYAZUqKT9Ntuk0OaOb4mBwiYUGL74tyP0LLL6T+oa9uEdXiUMlIL1onU8xhvA== + dependencies: + "@docsearch/react" "^3.0.0" + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-translations" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + algoliasearch "^4.13.0" + algoliasearch-helper "^3.8.2" + clsx "^1.1.1" + eta "^1.12.3" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz" + integrity sha512-O7J/4dHcg7Yr+r3ylgtqmtMEz6d5ScpUxBg8nsNTWOCRoGEXNZVmXSd5l6v72KCyxPZpllPrgjmqkL+I19qWiw== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.20.tgz" + integrity sha512-d4ZIpcrzGsUUcZJL3iz8/iSaewobPPiYfn2Lmmv7GTT5ZPtPkOAtR5mE6+LAf/KpjjgqrC7mpwDKADnOL/ic4Q== + dependencies: + commander "^5.1.0" + history "^4.9.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.72.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz" + integrity sha512-HabHh23vOQn6ygs0PjuCSF/oZaNsYTFsxB2R6EwHNyw01nWgBC3QAcGVmyIWQhlb9p8V3byKgbzVS68hZX5t9A== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz" + integrity sha512-7MxMoaF4VNAt5vUwvITa6nbkw1tb4WE6hp1VlfIoLCY4D7Wk5cMf1ZFhppCP1UzmPwvFb9zw8fPuvDfB3Tb5nQ== + dependencies: + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz" + integrity sha512-eUQquakhrbnvhsmx8jRPLgoyjyzMuOhmQC99m7rotar7XOzROpgEpm7+xVaquG5Ha47WkybE3djHJhKNih7GZQ== + dependencies: + "@docusaurus/logger" "2.0.0-beta.20" + "@svgr/webpack" "^6.2.1" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.72.0" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz" + integrity sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.8" + webpack-sources "^1.4.3" + +"@svgr/babel-plugin-add-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz" + integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== + +"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz" + integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz" + integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz" + integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== + +"@svgr/babel-plugin-svg-dynamic-title@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz" + integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== + +"@svgr/babel-plugin-svg-em-dimensions@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz" + integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz" + integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== + +"@svgr/babel-plugin-transform-svg-component@^6.2.0": + version "6.2.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz" + integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== + +"@svgr/babel-preset@^6.2.0": + version "6.2.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz" + integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" + "@svgr/babel-plugin-transform-svg-component" "^6.2.0" + +"@svgr/core@^6.2.1": + version "6.2.1" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz" + integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA== + dependencies: + "@svgr/plugin-jsx" "^6.2.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.2.1": + version "6.2.1" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz" + integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ== + dependencies: + "@babel/types" "^7.15.6" + entities "^3.0.1" + +"@svgr/plugin-jsx@^6.2.1": + version "6.2.1" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz" + integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g== + dependencies: + "@babel/core" "^7.15.5" + "@svgr/babel-preset" "^6.2.0" + "@svgr/hast-util-to-babel-ast" "^6.2.1" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^6.2.0": + version "6.2.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz" + integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.5.0" + +"@svgr/webpack@^6.2.1": + version "6.2.1" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz" + integrity sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw== + dependencies: + "@babel/core" "^7.15.5" + "@babel/plugin-transform-react-constant-elements" "^7.14.5" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.14.5" + "@babel/preset-typescript" "^7.15.0" + "@svgr/core" "^6.2.1" + "@svgr/plugin-jsx" "^6.2.1" + "@svgr/plugin-svgo" "^6.2.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@tsconfig/docusaurus@^1.0.5": + version "1.0.5" + resolved "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz" + integrity sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*", "@types/node@^17.0.5": + version "17.0.35" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz" + integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-router-config@*": + version "5.0.6" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz" + integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.18" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz" + integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.0.9" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz" + integrity sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" + integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +address@^1.0.1, address@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/address/-/address-1.2.0.tgz" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.8.2: + version "3.8.2" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz" + integrity sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.0.0, algoliasearch@^4.13.0: + version "4.13.1" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz" + integrity sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA== + dependencies: + "@algolia/cache-browser-local-storage" "4.13.1" + "@algolia/cache-common" "4.13.1" + "@algolia/cache-in-memory" "4.13.1" + "@algolia/client-account" "4.13.1" + "@algolia/client-analytics" "4.13.1" + "@algolia/client-common" "4.13.1" + "@algolia/client-personalization" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/logger-common" "4.13.1" + "@algolia/logger-console" "4.13.1" + "@algolia/requester-browser-xhr" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/requester-node-http" "4.13.1" + "@algolia/transporter" "4.13.1" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.3.7, autoprefixer@^10.4.5: + version "10.4.7" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + dependencies: + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +babel-loader@^8.2.5: + version "8.2.5" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.7.1: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001342" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz" + integrity sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA== + +ccount@^1.0.0, ccount@^1.0.3: + version "1.1.0" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz" + integrity sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@^1.0.0-rc.10: + version "1.0.0-rc.11" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz" + integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + tslib "^2.4.0" + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== + dependencies: + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.7" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.7.tgz" + integrity sha512-uI9DAQKKiiE/mclIC5g4AjRpio27g+VMRhe6rQoz+q4Wm4L6A/fJhiLtBw+sfOpDG9wZ3O0pxIw7GbfOlBgjOA== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-js-pure@^3.20.2: + version "3.22.7" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.7.tgz" + integrity sha512-wTriFxiZI+C8msGeh7fJcbC/a0V8fdInN1oS2eK79DMBGs8iIJiXhtFJCiT3rBa8w6zroHWW3p8ArlujZ/Mz+w== + +core-js@^3.22.3: + version "3.22.7" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz" + integrity sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-declaration-sorter@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz" + integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== + +css-loader@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.3: + version "5.3.5" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.5.tgz" + integrity sha512-KgrfLQaTBB4bov/Xsi0+y5iGM5gg5QChP1PTMJ9t7U6p9geKHYcPS9AC6gmfwurm0GKxhTRafDx55E8FKHX8eg== + dependencies: + autoprefixer "^10.3.7" + cssnano-preset-default "^5.2.9" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.9: + version "5.2.9" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz" + integrity sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.1" + postcss-discard-comments "^5.1.1" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.5" + postcss-merge-rules "^5.1.1" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.0" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.1" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6, cssnano@^5.1.7: + version "5.1.9" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.9.tgz" + integrity sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg== + dependencies: + cssnano-preset-default "^5.2.9" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dockview@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/dockview/-/dockview-1.4.2.tgz#20efbedccdebc64f0ee95d19460f158d52dc7792" + integrity sha512-GPELYEOd6u83VLJ8XXMV4VE9otuHJydSoeoy4uKyrZ+ZAxxv1UVJiEjub0GVlsMRgeeatT4pnBQsgRpgm8jPkQ== + +docusaurus-plugin-sass@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.2.tgz" + integrity sha512-ZZBpj3PrhGpYE2kAnkZB9NRwy/CDi4rGun1oec6PYR8YvGzqxYGtXvLgHi6FFbu8/N483klk8udqyYMh6Ted+A== + dependencies: + sass-loader "^10.1.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.4.118: + version "1.4.138" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.138.tgz" + integrity sha512-IOyp2Seq3w4QLln+yZWcMF3VXhhduz4bwg9gfI+CnP5TkzwNXQ8FCZuwwPsnes73AfWdf5J2n2OXdUwDUspDPQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +entities@^4.2.0, entities@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz" + integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^1.12.3: + version "1.12.3" + resolved "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz" + integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.1" + resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flux@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.0" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +hamt_plus@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz" + integrity sha1-4hwlKWjH4zsg9qGwlM2FeHomVgE= + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz" + integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.1.9, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-size@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz" + integrity sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ== + dependencies: + queue "6.0.2" + +immer@^9.0.7: + version "9.0.14" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz" + integrity sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw== + +immutable@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.39: + version "0.2.0-alpha.39" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz" + integrity sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +install@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/install/-/install-0.13.0.tgz" + integrity sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.0.2, jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz" + integrity sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg== + dependencies: + fs-monkey "1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.4: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.9.0: + version "1.12.1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz" + integrity sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz" + integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== + dependencies: + entities "^4.3.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz" + integrity sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q== + dependencies: + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz" + integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.5: + version "5.1.5" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz" + integrity sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz" + integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz" + integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz" + integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz" + integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== + dependencies: + sort-css-media-queries "2.0.4" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.7: + version "8.4.14" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.3.1: + version "1.3.3" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz" + integrity sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ== + +prismjs@^1.28.0: + version "1.28.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet-async@*, react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.2.0: + version "5.3.3" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz" + integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.3" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.3, react-router@^5.2.0: + version "5.3.3" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz" + integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-textarea-autosize@^8.3.2: + version "8.3.4" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz" + integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recoil@^0.7.3-alpha.2: + version "0.7.3-alpha.2" + resolved "https://registry.npmjs.org/recoil/-/recoil-0.7.3-alpha.2.tgz" + integrity sha512-8LL4T8Bh7WMA5/ka+420PCenaUFie0457kyxX7cy/gsyRlbIGYpyNkAyU0znCvtHTN2clVYkTjGF6zKJ/DzzJg== + dependencies: + hamt_plus "1.0.2" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +rehype-parse@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz" + integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-admonitions@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz" + integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== + dependencies: + rehype-parse "^6.0.2" + unified "^8.4.2" + unist-util-visit "^2.0.1" + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.4: + version "7.5.5" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@^10.1.1: + version "10.2.1" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.1.tgz" + integrity sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass@^1.52.1: + version "1.52.1" + resolved "https://registry.npmjs.org/sass/-/sass-1.52.1.tgz" + integrity sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.3" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz" + integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^3.0.1: + version "3.1.1" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz" + integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.5.0, svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + dependencies: + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.13.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== + dependencies: + acorn "^8.5.0" + commander "^2.20.0" + source-map "~0.8.0-beta.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.2.0" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^2.5.0: + version "2.13.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz" + integrity sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4.6.4: + version "4.7.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz" + integrity sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^8.4.2: + version "8.4.2" + resolved "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.8.1: + version "4.9.0" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz" + integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.72.0: + version "5.72.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz" + integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz" + integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.7" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +ws@^8.4.2: + version "8.6.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/build/jest.config.base.js b/build/jest.config.base.js new file mode 100644 index 000000000..f6890a920 --- /dev/null +++ b/build/jest.config.base.js @@ -0,0 +1,20 @@ +const {join, normalize} = require("path"); + +const tsconfig = normalize(join(__dirname, "tsconfig.test.json")) + +module.exports = { + displayName: { name: "root" }, + preset: "ts-jest", + projects: ["/packages/*/jest.config.js"], + transform: { + "^.+\\.tsx?$":"ts-jest" + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json"], + globals: { + "ts-jest": { + tsconfig, + experimental: true, + compilerHost: true + } + } +} \ No newline at end of file diff --git a/build/jest.config.js b/build/jest.config.js new file mode 100644 index 000000000..cead1a77e --- /dev/null +++ b/build/jest.config.js @@ -0,0 +1,17 @@ +const baseConfig = require("./jest.config.base"); + +module.exports = { + ...baseConfig, + displayName: { name: "root", color: "blue" }, + projects: ["/packages/*/jest.config.js"], + collectCoverage: true, + collectCoverageFrom:[ + "/packages/*/src/**/*.{js,jsx,ts,tsx}", + ], + coveragePathIgnorePatterns: [ + "/node_modules/", + "packages/*/src/__tests__/", + ], + coverageDirectory: "coverage", + testResultsProcessor: 'jest-sonar-reporter', +}; diff --git a/build/lerna.json b/build/lerna.json new file mode 100644 index 000000000..c4a81cc92 --- /dev/null +++ b/build/lerna.json @@ -0,0 +1,13 @@ +{ + "packages": [ + "packages/*" + ], + "version": "1.4.2", + "npmClient": "yarn", + "useWorkspaces": true, + "command": { + "publish": { + "message": "chore(release): publish %s" + } + } +} diff --git a/build/module-build/tsconfig.esm.json b/build/module-build/tsconfig.esm.json new file mode 100644 index 000000000..c04d21274 --- /dev/null +++ b/build/module-build/tsconfig.esm.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "ES2020", + "declaration": true, + "target": "es6", + "moduleResolution": "node", + "esModuleInterop": true, + "downlevelIteration": true, + "incremental": true, + "noImplicitReturns": true, + "noImplicitAny": true, + "allowUnreachableCode": false, + "forceConsistentCasingInFileNames": true, + "strict": true, + "lib": [ + "ES2015", + "ES2016.Array.Include", + "ES2017.String", + "ES2018.Promise", + "ES2019", + "DOM", + ] + } +} diff --git a/build/module-build/tsconfig.json b/build/module-build/tsconfig.json new file mode 100644 index 000000000..f8fa378c7 --- /dev/null +++ b/build/module-build/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "target": "es5", + "esModuleInterop": true, + "downlevelIteration": true, + "incremental": true, + "sourceMap": true, + "noImplicitReturns": true, + "noImplicitAny": true, + "allowUnreachableCode": false, + "forceConsistentCasingInFileNames": true, + "strict": true, + "lib": [ + "ES2015", + "ES2016.Array.Include", + "ES2017.String", + "ES2018.Promise", + "ES2019", + "DOM", + ] + } +} diff --git a/build/package.json b/build/package.json new file mode 100644 index 000000000..6c2dff916 --- /dev/null +++ b/build/package.json @@ -0,0 +1,63 @@ +{ + "name": "dockview-monorepo-root", + "private": true, + "description": "Monorepo for https://github.com/mathuo/dockview", + "workspaces": [ + "packages/*" + ], + "scripts": { + "test": "jest", + "lint": "eslint packages/**/src/** --ext .ts,.tsx,.js,.jsx", + "package": "node scripts/package.js", + "package-all": "npm run build-demo && npm run docs && node scripts/package.js", + "build": "lerna run build --scope dockview", + "build-demo": "lerna run build --scope dockview-demo", + "docs": "lerna run docs --scope dockview", + "clean": "lerna run clean", + "bootstrap": "lerna bootstrap", + "test:cov": "jest --coverage", + "version-beta-build": "lerna version prerelease --preid beta", + "publish-app": "lerna publish" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mathuo/dockview.git" + }, + "author": "https://github.com/mathuo", + "license": "MIT", + "bugs": { + "url": "https://github.com/mathuo/dockview/issues" + }, + "homepage": "https://github.com/mathuo/dockview#readme", + "devDependencies": { + "@testing-library/dom": "^8.13.0", + "@types/jest": "^27.5.0", + "@typescript-eslint/eslint-plugin": "^5.22.0", + "@typescript-eslint/parser": "^5.22.0", + "codecov": "^3.8.3", + "cross-env": "^7.0.3", + "css-loader": "^6.7.1", + "eslint": "^8.15.0", + "fs-extra": "^10.1.0", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "gulp-dart-sass": "^1.0.2", + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.0", + "jest-sonar-reporter": "^2.0.0", + "jsdom": "^19.0.0", + "lerna": "^4.0.0", + "merge2": "^1.4.1", + "rimraf": "^3.0.2", + "sass": "^1.51.0", + "sass-loader": "^12.6.0", + "style-loader": "^3.3.1", + "ts-jest": "^28.0.2", + "ts-loader": "^9.3.0", + "tslib": "^2.4.0", + "typescript": "^4.6.4", + "webpack": "^5.72.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.9.0" + } +} diff --git a/build/packages/dockview-demo/.eslintrc b/build/packages/dockview-demo/.eslintrc new file mode 100644 index 000000000..2e0ee58ad --- /dev/null +++ b/build/packages/dockview-demo/.eslintrc @@ -0,0 +1,8 @@ +{ + "extends": [ + "../../.eslintrc" + ], + "rules": { + "@typescript-eslint/no-var-requires": "off" + } + } \ No newline at end of file diff --git a/build/packages/dockview-demo/.storybook/main.js b/build/packages/dockview-demo/.storybook/main.js new file mode 100644 index 000000000..276052b59 --- /dev/null +++ b/build/packages/dockview-demo/.storybook/main.js @@ -0,0 +1,23 @@ +module.exports = { + stories: [ + "../src/**/*.stories.mdx", + "../src/**/*.stories.@(js|jsx|ts|tsx)" + ], + addons: [ + { + name: '@storybook/addon-docs', + options: { + sourceLoaderOptions: { + injectStoryParameters: false, + }, + }, + }, + "@storybook/addon-storysource", + "@storybook/addon-links", + "@storybook/addon-essentials", + "@storybook/addon-controls" + ], + core: { + builder: "webpack5" + } +} \ No newline at end of file diff --git a/build/packages/dockview-demo/.storybook/preview.js b/build/packages/dockview-demo/.storybook/preview.js new file mode 100644 index 000000000..a2e384710 --- /dev/null +++ b/build/packages/dockview-demo/.storybook/preview.js @@ -0,0 +1,5 @@ +import '!style-loader!css-loader!sass-loader!../node_modules/dockview/dist/styles/dockview.css'; + +export const parameters = { + actions: { argTypesRegex: "^on[A-Z].*" }, +} \ No newline at end of file diff --git a/build/packages/dockview-demo/package.json b/build/packages/dockview-demo/package.json new file mode 100644 index 000000000..ae4df430d --- /dev/null +++ b/build/packages/dockview-demo/package.json @@ -0,0 +1,51 @@ +{ + "name": "dockview-demo", + "private": true, + "version": "1.4.2", + "description": "Demo project for https://github.com/mathuo/dockview", + "scripts": { + "build": "npm run build-webpack", + "build-webpack": "cross-env ../../node_modules/.bin/webpack --config webpack.config.js", + "start": "cross-env ../../node_modules/.bin/webpack serve --config webpack.config.js", + "clean": "rimraf dist/ .build/", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook" + }, + "author": "https://github.com/mathuo", + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^2.1.1", + "dockview": "^1.4.2", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "recoil": "^0.7.2" + }, + "devDependencies": { + "@babel/core": "^7.17.10", + "@storybook/addon-actions": "^6.5.0-beta.0", + "@storybook/addon-controls": "^6.5.0-beta.0", + "@storybook/addon-docs": "^6.5.0-beta.0", + "@storybook/addon-essentials": "^6.5.0-beta.0", + "@storybook/addon-links": "^6.5.0-beta.0", + "@storybook/addon-storysource": "^6.5.0-beta.0", + "@storybook/builder-webpack5": "^6.5.0-beta.0", + "@storybook/manager-webpack5": "^6.5.0-beta.0", + "@storybook/react": "^6.5.0-beta.0", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.3", + "babel-loader": "^8.2.5", + "cross-env": "^7.0.3", + "rimraf": "^3.0.2", + "source-map-loader": "^3.0.1" + }, + "resolutions": { + "webpack": "^5.0.0", + "css-loader": "^5.0.0", + "dotenv-webpack": "^6.0.0", + "html-webpack-plugin": "^5.0.0", + "style-loader": "^2.0.0", + "terser-webpack-plugin": "^5.0.0", + "webpack-dev-middleware": "^4.1.0", + "webpack-virtual-modules": "^0.4.2" + } +} diff --git a/build/packages/dockview-demo/public/index.html b/build/packages/dockview-demo/public/index.html new file mode 100644 index 000000000..212d545a7 --- /dev/null +++ b/build/packages/dockview-demo/public/index.html @@ -0,0 +1,14 @@ + + + + + + + + + +
+
+ + + diff --git a/build/packages/dockview-demo/src/dom.ts b/build/packages/dockview-demo/src/dom.ts new file mode 100644 index 000000000..f55b853a6 --- /dev/null +++ b/build/packages/dockview-demo/src/dom.ts @@ -0,0 +1,13 @@ +export const toggleClass = ( + element: HTMLElement, + className: string, + isToggled: boolean +) => { + const hasClass = element.classList.contains(className); + if (isToggled && !hasClass) { + element.classList.add(className); + } + if (!isToggled && hasClass) { + element.classList.remove(className); + } +}; diff --git a/build/packages/dockview-demo/src/events.ts b/build/packages/dockview-demo/src/events.ts new file mode 100644 index 000000000..3308e578d --- /dev/null +++ b/build/packages/dockview-demo/src/events.ts @@ -0,0 +1,122 @@ +import { IDisposable } from './lifecycle'; + +export interface Event { + (listener: (e: T) => any): IDisposable; +} + +export interface EmitterOptions { + replay?: boolean; +} + +export namespace Event { + export const any = (...children: Event[]): Event => { + return (listener: (e: T) => void) => { + const disposables = children.map((child) => child(listener)); + + return { + dispose: () => { + disposables.forEach((d) => { + d.dispose(); + }); + }, + }; + }; + }; +} + +// dumb event emitter with better typings than nodes event emitter +// https://github.com/microsoft/vscode/blob/master/src/vs/base/common/event.ts +export class Emitter implements IDisposable { + private _event?: Event; + + private _last?: T; + private _listeners: Array<(e: T) => any> = []; + private _disposed = false; + + constructor(private readonly options?: EmitterOptions) {} + + get event() { + if (!this._event) { + this._event = (listener: (e: T) => void): IDisposable => { + if (this.options?.replay && this._last !== undefined) { + listener(this._last); + } + + this._listeners.push(listener); + + return { + dispose: () => { + const index = this._listeners.indexOf(listener); + if (index > -1) { + this._listeners.splice(index, 1); + } + }, + }; + }; + } + return this._event; + } + + public fire(e: T) { + this._last = e; + for (const listener of this._listeners) { + listener(e); + } + } + + public dispose() { + this._listeners = []; + this._disposed = true; + } +} + +export function addDisposableWindowListener( + element: Window, + type: K, + listener: (this: Window, ev: WindowEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): IDisposable { + element.addEventListener(type, listener, options); + + return { + dispose: () => { + element.removeEventListener(type, listener); + }, + }; +} + +export function addDisposableListener( + element: HTMLElement, + type: K, + listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): IDisposable { + element.addEventListener(type, listener, options); + + return { + dispose: () => { + element.removeEventListener(type, listener); + }, + }; +} + +export class TickDelayedEvent implements IDisposable { + private timer: any; + + private readonly _onFired = new Emitter(); + readonly onEvent = this._onFired.event; + + fire(): void { + if (this.timer) { + clearTimeout(this.timer); + } + this.timer = setTimeout(() => { + this._onFired.fire(); + clearTimeout(this.timer); + }); + } + + dispose(): void { + this._onFired.dispose(); + } +} diff --git a/build/packages/dockview-demo/src/index.scss b/build/packages/dockview-demo/src/index.scss new file mode 100644 index 000000000..df02ae80a --- /dev/null +++ b/build/packages/dockview-demo/src/index.scss @@ -0,0 +1,66 @@ +@import '~dockview/dist/styles/dockview.css'; + +body { + margin: 0; + font-family: 'Roboto', sans-serif; + overflow: hidden; + color: rgb(204, 204, 204); + font-size: 13px; +} + +::-webkit-scrollbar { + height: 8px; + width: 8px; +} + +/* Track */ +::-webkit-scrollbar-track { + background: transparent; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: var(--dv-tabs-container-scrollbar-color); +} + +// *, +// *::after, +// *::before { +// -webkit-user-drag: none; +// -webkit-app-region: no-drag; +// -webkit-user-select: none; +// } + +.close-action { + &:active { + -webkit-mask-size: 100% 100% !important; + mask-size: 100% 100% !important; + } + + background-color: white; + height: 16px; + width: 16px; + display: block; + -webkit-mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% no-repeat; + mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% no-repeat; + margin-right: '0.5em'; + cursor: pointer; +} + +button { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + border: none; + background-color: rgb(14, 99, 156); + color: white; + font-family: inherit; + outline: none; + padding: 2px 14px; + margin: 2px 0px; + + &:hover { + background-color: rgb(17, 119, 187); + cursor: pointer; + } +} diff --git a/build/packages/dockview-demo/src/index.tsx b/build/packages/dockview-demo/src/index.tsx new file mode 100644 index 000000000..344dde775 --- /dev/null +++ b/build/packages/dockview-demo/src/index.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom/client'; +import { Application } from './layout-grid/application'; +import { RecoilRoot } from 'recoil'; +import './index.scss'; + +document.getElementById('app').classList.add('dockview-theme-dark'); + +const root = ReactDOM.createRoot(document.getElementById('app')); + +root.render( + + + +); diff --git a/build/packages/dockview-demo/src/layout-grid/activitybar.scss b/build/packages/dockview-demo/src/layout-grid/activitybar.scss new file mode 100644 index 000000000..e6c8f20f3 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/activitybar.scss @@ -0,0 +1,34 @@ +.activity-bar { + height: 100%; + background-color: rgb(51, 51, 51); + + .activity-bar-item { + width: 100%; + padding-bottom: 100%; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + position: relative; + + &:hover { + background-color: rgba(90, 90, 90, 0.5); + } + + .activity-bar-item-image { + -webkit-mask-size: 65% 65%; + mask-size: 65% 65%; + -webkit-mask-position: 50% 50%; + mask-position: 50% 50%; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + height: 100%; + width: 100%; + display: block; + background-color: gray; + position: absolute; + top: 0; + left: 0; + } + } +} diff --git a/build/packages/dockview-demo/src/layout-grid/activitybar.tsx b/build/packages/dockview-demo/src/layout-grid/activitybar.tsx new file mode 100644 index 000000000..ba68ef956 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/activitybar.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import { GridviewApi, IGridviewPanelProps } from 'dockview'; +import './activitybar.scss'; +import { useLayoutRegistry } from './registry'; +import { CompositeDisposable } from '../lifecycle'; + +const ActivitybarImage = (props: { url: string }) => ( +
+); + +export const Activitybar = (props: IGridviewPanelProps) => { + const registry = useLayoutRegistry(); + const [isActive, setActive] = React.useState(); + + const onOpenSidebar = (event: React.MouseEvent) => { + const api = registry.get('gridview'); + + const sidebarPanel = api.getPanel('sidebar'); + if (sidebarPanel.api.isVisible) { + sidebarPanel.api.setVisible(false); + } else { + event.preventDefault(); // prevent focus + sidebarPanel.api.setVisible(true); + sidebarPanel.focus(); + } + }; + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidActiveChange((event) => { + setActive(event.isActive); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + return ( +
+
+ +
+
+ +
+
+ +
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/application.tsx b/build/packages/dockview-demo/src/layout-grid/application.tsx new file mode 100644 index 000000000..e4b923787 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/application.tsx @@ -0,0 +1,108 @@ +import * as React from 'react'; +import { + Orientation, + GridviewReact, + LayoutPriority, + GridviewReadyEvent, + IGridviewPanelProps, + SerializedGridview, + GridviewApi, +} from 'dockview'; +import { Activitybar } from '../services/widgets'; +import { Footer } from './footer'; +import { Panel } from './panel'; +import { TestGrid } from './layoutGrid'; +import { useLayoutRegistry } from './registry'; +import { Sidebar } from '../services/widgets'; + +const rootcomponents: { + [index: string]: React.FunctionComponent; +} = { + sidebar: Sidebar, + activitybar: Activitybar, + editor: TestGrid, + footer: Footer, + panel: Panel, +}; + +export const Application = () => { + const api = React.useRef(); + const registry = useLayoutRegistry(); + + const onReady = (event: GridviewReadyEvent) => { + api.current = event.api; + registry.register('gridview', event.api); + + let success = false; + const state = localStorage.getItem('dockview-layout'); + + if (state) { + try { + event.api.fromJSON(JSON.parse(state)); + success = true; + } catch (err) { + console.error('failed to load layout', err); + } + } + + if (!success) { + event.api.addPanel({ + id: 'i', + component: 'activitybar', + minimumWidth: 48, + maximumWidth: 48, + location: [0], + }); + + event.api.addPanel({ + id: 'footer', + component: 'footer', + location: [1], + maximumHeight: 22, + minimumHeight: 22, + }); + + event.api.addPanel({ + id: 'editor', + component: 'editor', + snap: true, + location: [0, 1], + priority: LayoutPriority.High, + }); + + event.api.addPanel({ + id: 'sidebar', + component: 'sidebar', + snap: true, + position: { referencePanel: 'editor', direction: 'left' }, + minimumWidth: 170, + size: 100, + }); + + event.api.addPanel({ + id: 'panel', + component: 'panel', + position: { referencePanel: 'editor', direction: 'below' }, + size: 200, + snap: true, + }); + } + + event.api.onDidLayoutChange(() => { + localStorage.setItem( + 'dockview-layout', + JSON.stringify(event.api.toJSON()) + ); + }); + }; + + return ( + + ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/controlCenter.scss b/build/packages/dockview-demo/src/layout-grid/controlCenter.scss new file mode 100644 index 000000000..115db5777 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/controlCenter.scss @@ -0,0 +1,30 @@ +.control-center { + display: flex; + flex-direction: column; + height: 100%; + padding: 4px 8px; + box-sizing: border-box; + + .control-center-row { + height: 25px; + box-sizing: border-box; + + button { + width: 175px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + border: none; + background-color: rgb(14, 99, 156); + color: white; + font-family: inherit; + outline: none; + padding: 2px 14px; + margin: 2px 0px; + + &:hover { + background-color: rgb(17, 119, 187); + } + } + } +} diff --git a/build/packages/dockview-demo/src/layout-grid/controlCenter.tsx b/build/packages/dockview-demo/src/layout-grid/controlCenter.tsx new file mode 100644 index 000000000..a1b2e1aaa --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/controlCenter.tsx @@ -0,0 +1,150 @@ +import * as React from 'react'; +import { DockviewApi, GridviewApi, SplitviewApi } from 'dockview'; +import { useLayoutRegistry } from './registry'; +import './controlCenter.scss'; + +export const ControlCenter = () => { + const registry = useLayoutRegistry(); + + const onAdd = () => { + const api = registry.get('dockview'); + const _id = Date.now(); + const id = `${_id}`; + + api.addPanel({ + component: 'test_component', + id, + title: `Item ${id}`, + }); + }; + + const onAddTheSamePanel = () => { + const api = registry.get('dockview'); + const id = `duplicate_panel`; + + const panel = api.getPanel(id); + if (panel) { + panel.api.setActive(); + return; + } + api.addPanel({ + component: 'test_component', + id, + title: `Item ${id}`, + }); + }; + + const onAddEmpty = () => { + const api = registry.get('dockview'); + api.addEmptyGroup(); + }; + + const nextPanel = (ev: React.MouseEvent) => { + ev.preventDefault(); + const api = registry.get('dockview'); + api.moveToNext({ includePanel: true }); + }; + const nextGroup = (ev: React.MouseEvent) => { + ev.preventDefault(); + const api = registry.get('dockview'); + api.moveToNext(); + }; + const previousPanel = (ev: React.MouseEvent) => { + ev.preventDefault(); + const api = registry.get('dockview'); + api.moveToPrevious({ includePanel: true }); + }; + const previousGroup = (ev: React.MouseEvent) => { + ev.preventDefault(); + const api = registry.get('dockview'); + api.moveToNext(); + }; + + const onConfig = () => { + const api = registry.get('dockview'); + const data = api.toJSON(); + const stringData = JSON.stringify(data, null, 4); + console.log(stringData); + localStorage.setItem('layout', stringData); + }; + + const onLoad = async () => { + const api = registry.get('dockview'); + api.closeAllGroups(); + + const data = localStorage.getItem('layout'); + if (data) { + const jsonData = JSON.parse(data); + api.fromJSON(jsonData); + } + }; + + const onClear = () => { + const api = registry.get('dockview'); + api.closeAllGroups(); + }; + + const saveApplicationLayout = () => { + const api = registry.get('dockview'); + console.log(JSON.stringify(api.toJSON(), null, 4)); + }; + + const onAddSettings = () => { + const api = registry.get('dockview'); + + const settingsPanel = api.getPanel('settings'); + if (settingsPanel) { + settingsPanel.api.setActive(); + return; + } + + api.addPanel({ + id: 'settings', + component: 'settings', + title: 'Settings', + }); + }; + + return ( +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/customTab.tsx b/build/packages/dockview-demo/src/layout-grid/customTab.tsx new file mode 100644 index 000000000..5ba8623f3 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/customTab.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import { IGroupPanelBaseProps } from 'dockview'; + +export const CustomTab = (props: IGroupPanelBaseProps) => { + return
hello
; +}; diff --git a/build/packages/dockview-demo/src/layout-grid/footer.tsx b/build/packages/dockview-demo/src/layout-grid/footer.tsx new file mode 100644 index 000000000..1266373a5 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/footer.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { IGridviewPanelProps } from 'dockview'; +import { atom, useRecoilValue } from 'recoil'; + +export const selectedPanelAtom = atom({ + key: 'selectedPanelAtom', + default: '', +}); + +export const Footer = (props: IGridviewPanelProps) => { + const selectedPanel = useRecoilValue(selectedPanelAtom); + + return ( +
+ + {selectedPanel} +
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/layoutGrid.layout.json b/build/packages/dockview-demo/src/layout-grid/layoutGrid.layout.json new file mode 100644 index 000000000..83b2f7242 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/layoutGrid.layout.json @@ -0,0 +1,101 @@ +{ + "grid": { + "root": { + "type": "branch", + "data": [ + { + "type": "leaf", + "data": { + "id": "group_1", + "views": [ + "split_panel" + ], + "activeView": "split_panel" + }, + "size": 371 + }, + { + "type": "branch", + "data": [ + { + "type": "leaf", + "data": { + "id": "group_2", + "views": [ + "item2" + ], + "activeView": "item2" + }, + "size": 792 + }, + { + "type": "leaf", + "data": { + "id": "group_3", + "views": [ + "panel_2" + ], + "activeView": "panel_2" + }, + "size": 792 + } + ], + "size": 371 + }, + { + "type": "leaf", + "data": { + "id": "group_4", + "views": [ + "panel_0" + ], + "activeView": "panel_0" + }, + "size": 372 + } + ], + "size": 1584 + }, + "height": 1114, + "width": 1584, + "orientation": "HORIZONTAL" + }, + "panels": { + "panel_0": { + "id": "panel_0", + "contentId": "test_component", + "tabId": "__DEFAULT_TAB__", + "props": { + "text": "how low?" + }, + "title": "Item 1", + "state": {} + }, + "item2": { + "id": "item2", + "contentId": "test_component", + "tabId": "__DEFAULT_TAB__", + "props": {}, + "title": "Item 2", + "state": {} + }, + "split_panel": { + "id": "split_panel", + "contentId": "split_panel", + "tabId": "__DEFAULT_TAB__", + "props": {}, + "title": "Item 3 with a long title", + "state": {} + }, + "panel_2": { + "id": "panel_2", + "contentId": "test_component", + "tabId": "__DEFAULT_TAB__", + "props": {}, + "title": "Item 3", + "suppressClosable": true, + "state": {} + } + }, + "activeGroup": "group_2" +} \ No newline at end of file diff --git a/build/packages/dockview-demo/src/layout-grid/layoutGrid.scss b/build/packages/dockview-demo/src/layout-grid/layoutGrid.scss new file mode 100644 index 000000000..29e0d1898 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/layoutGrid.scss @@ -0,0 +1,22 @@ +.context-menu { + position: absolute; + height: 100px; + width: 170px; + font-size: 13px; + z-index: 999; + color: rgb(204, 204, 204); + background: rgb(37, 37, 38); + box-shadow: rgb(0, 0, 0) 0px 2px 4px; + padding: 10px 0px; + + .context-action { + height: 20px; + line-height: 20px; + padding: 2px 10px; + cursor: pointer; + + &:hover { + background-color: rgb(51, 51, 51); + } + } +} diff --git a/build/packages/dockview-demo/src/layout-grid/layoutGrid.tsx b/build/packages/dockview-demo/src/layout-grid/layoutGrid.tsx new file mode 100644 index 000000000..d393c3030 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/layoutGrid.tsx @@ -0,0 +1,334 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import { + IDockviewPanelProps, + IGridviewPanelProps, + TabContextMenuEvent, + DockviewReadyEvent, + DockviewReact, + DockviewApi, + IWatermarkPanelProps, + IDockviewPanel, + PanelCollection, +} from 'dockview'; +import { CustomTab } from './customTab'; +import { Settings } from './settingsPanel'; +import { useLayoutRegistry } from './registry'; +import { SplitPanel } from './splitPanel'; +import './layoutGrid.scss'; +import { WelcomePanel } from '../panels/welcome/welcome'; +import { SplitviewPanel } from '../panels/splitview/splitview'; +import { GridviewDemoPanel } from '../panels/gridview/gridview'; +import { useRecoilCallback } from 'recoil'; +import { selectedPanelAtom } from './footer'; +import { ExampleFunctions } from './panels/exampleFunctions'; +import { CompositeDisposable } from '../lifecycle'; + +const WatermarkComponent = () => { + return ( +
+ Watermark component +
+ ); +}; + +const Test = (props: IDockviewPanelProps) => { + const [counter, setCounter] = React.useState(0); + + React.useEffect(() => { + const interval = setInterval(() => { + setCounter((_) => _ + 1); + }, 2000); + + return () => { + clearInterval(interval); + }; + }, []); + + return ( +
+
{`custom body ${counter}`}
+ +
+ ); +}; + +const components: PanelCollection = { + test: Test, + welcome: WelcomePanel, + splitview: SplitviewPanel, + gridview: GridviewDemoPanel, + inner_component: (props: IDockviewPanelProps) => { + const _api = React.useRef(); + + const onReady = (event: DockviewReadyEvent) => { + _api.current = event.api; + + event.api.addPanel({ + component: 'test_component', + id: 'inner-1', + title: 'inner-1', + }); + event.api.addPanel({ + component: 'test_component', + id: 'inner-2', + title: 'inner-2', + }); + event.api.addPanel({ + component: 'test_component', + id: nextGuid(), + title: 'inner-3', + position: { + direction: 'within', + referencePanel: 'inner-1', + }, + }); + event.api.addPanel({ + component: 'test_component', + id: nextGuid(), + title: 'inner-4', + position: { + direction: 'within', + referencePanel: 'inner-2', + }, + }); + }; + + return ( +
+ +
+ ); + }, + test_component: ExampleFunctions, + settings: Settings, + split_panel: SplitPanel, +}; + +const tabComponents = { + default: CustomTab, +}; + +export const nextGuid = (() => { + let counter = 0; + return () => 'panel_' + (counter++).toString(); +})(); + +export const TestGrid = (props: IGridviewPanelProps) => { + const [api, setApi] = React.useState(); + const registry = useLayoutRegistry(); + + const onReady = (event: DockviewReadyEvent) => { + const api = event.api; + setApi(api); + registry.register('dockview', api); + }; + + const setSelectedPanel = useRecoilCallback( + ({ set }) => + (value: string) => + set(selectedPanelAtom, value), + [] + ); + + React.useEffect(() => { + if (!api) { + return () => { + // + }; + } + props.api.setConstraints({ + minimumWidth: () => api.minimumWidth, + minimumHeight: () => api.minimumHeight, + }); + + const disposable = new CompositeDisposable( + api.onDidLayoutChange(() => { + const state = api.toJSON(); + localStorage.setItem('dockview', JSON.stringify(state)); + }), + api.onDidActivePanelChange((e) => { + setSelectedPanel(e?.id || ''); + }) + ); + + const state = localStorage.getItem('dockview'); + let success = false; + if (state) { + try { + api.fromJSON(JSON.parse(state)); + success = true; + } catch (err) { + console.error('failed to load layout', err); + } + } + + const welcomePanel = api.getPanel('welcome'); + + if (!welcomePanel) { + api.addPanel({ + component: 'welcome', + id: 'welcome', + title: 'Welcome', + suppressClosable: true, + }); + } + + return () => { + disposable.dispose(); + }; + }, [api]); + + const [coord, setCoord] = + React.useState<{ + x: number; + y: number; + panel: IDockviewPanel; + }>(undefined); + + const onTabContextMenu = React.useMemo( + () => (event: TabContextMenuEvent) => { + event.event.preventDefault(); + console.log(event.panel); + const cb = (event: MouseEvent) => { + let element: HTMLElement = event.target as HTMLElement; + + while (element) { + if (element.classList.contains('context-menu')) { + return; + } + element = element.parentElement; + } + + window.removeEventListener('mousedown', cb); + setCoord(undefined); + }; + window.addEventListener('mousedown', cb); + setCoord({ + x: event.event.clientX, + y: event.event.clientY, + panel: event.panel, + }); + }, + [] + ); + + const onClose = () => { + setCoord(undefined); + coord.panel.api.close(); + }; + + const onChangeName = () => { + setCoord(undefined); + coord.panel.api.setTitle('This looks new?'); + }; + + return ( + <> + {coord && + ReactDOM.createPortal( +
+
+ Close +
+
+ Rename +
+
, + document.getElementById('anchor') + )} + { + return true; + }} + onDidDrop={(ev) => { + console.log('onDidDrop', ev); + }} + /> + + ); +}; + +const Watermark = (props: IWatermarkPanelProps) => { + const [groups, setGroups] = React.useState(props.containerApi.size); + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.containerApi.onDidLayoutChange(() => { + console.log(`groups2 ${props.containerApi.size}`); + setGroups(props.containerApi.size); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onClick = () => { + props.close(); + }; + + return ( +
+ +
+ Watermark component +
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/panel.tsx b/build/packages/dockview-demo/src/layout-grid/panel.tsx new file mode 100644 index 000000000..b43ad819d --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/panel.tsx @@ -0,0 +1,67 @@ +import * as React from 'react'; +import { IGridviewPanelProps } from 'dockview'; +import { CompositeDisposable } from '../lifecycle'; + +export const Panel = (props: IGridviewPanelProps) => { + const [active, setActive] = React.useState(); + const [focused, setFocused] = React.useState(); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidActiveChange((event) => { + setActive(event.isActive); + }), + props.api.onDidFocusChange((event) => { + setFocused(event.isFocused); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onToggle = () => { + const editorPanel = props.containerApi.getPanel('editor'); + editorPanel.api.setVisible(!editorPanel.api.isVisible); + }; + + const onClose = () => { + const editorPanel = props.containerApi.getPanel('editor'); + + editorPanel.api.setVisible(true); + props.api.setVisible(false); + }; + + const onMove = () => { + const thisPanel = props.containerApi.getPanel('panel'); + const editor = props.containerApi.getPanel('editor'); + + props.containerApi.movePanel(thisPanel, { + direction: 'left', + reference: editor.id, + }); + }; + + return ( +
+
+ This panel is outside of the dockable layer + + {/* */} + + +
+
+
{`isPanelActive: ${active} isPanelFocused: ${focused}`}
+
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.scss b/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.scss new file mode 100644 index 000000000..663346603 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.scss @@ -0,0 +1,14 @@ +.example-functions-panel { + padding: 5px; + display: flex; + flex-direction: column; + + .example-functions-panel-header-bar { + display: flex; + justify-content: flex-end; + } + + .example-functions-panel-section { + padding: 8px 0px; + } +} diff --git a/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.tsx b/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.tsx new file mode 100644 index 000000000..b0832f0cf --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/panels/exampleFunctions.tsx @@ -0,0 +1,102 @@ +import { IDockviewPanelProps } from 'dockview'; +import * as React from 'react'; +import { CompositeDisposable } from '../../lifecycle'; +import './exampleFunctions.scss'; + +export const ExampleFunctions = ( + props: IDockviewPanelProps & { [key: string]: any } +) => { + const [panelState, setPanelState] = React.useState<{ + isGroupActive: boolean; + isPanelVisible: boolean; + }>({ + isGroupActive: props.api.isActive, + isPanelVisible: props.api.isVisible, + }); + const [panelName, setPanelName] = React.useState(); + const input = React.useRef(); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidActiveChange((event) => { + setPanelState((_) => ({ + ..._, + isGroupActive: event.isActive, + })); + }), + props.api.onDidVisibilityChange((x) => { + setPanelState((_) => ({ + ..._, + isPanelVisible: x.isVisible, + })); + }), + props.api.onDidFocusChange(({ isFocused }) => { + if (isFocused) { + input.current.focus(); + } + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onRename = () => { + props.api.setTitle(panelName); + }; + + const onClose = () => { + props.api.close(); + }; + + return ( +
+
+ + {'isGroupActive: '} + + {`${panelState.isGroupActive}`} + + + + {'isPanelVisible: '} + + {`${panelState.isPanelVisible}`} + + +
+
+ setPanelName(event.target.value)} + /> + +
+ + + +
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/registry.ts b/build/packages/dockview-demo/src/layout-grid/registry.ts new file mode 100644 index 000000000..bd023f6a9 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/registry.ts @@ -0,0 +1,25 @@ +import * as React from 'react'; + +export interface IRegistry { + register(name: string, value: T): void; + get(name: string): T; +} + +class Registry implements IRegistry { + private cache = new Map(); + + register(name: string, value: T) { + this.cache.set(name, value); + } + + get(name: string) { + return this.cache.get(name) as T; + } +} + +const RegistryInstance = new Registry(); + +export const useLayoutRegistry = (): IRegistry => { + const ref = React.useRef(RegistryInstance); + return ref.current; +}; diff --git a/build/packages/dockview-demo/src/layout-grid/settingsPanel.tsx b/build/packages/dockview-demo/src/layout-grid/settingsPanel.tsx new file mode 100644 index 000000000..6704e49a1 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/settingsPanel.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; +import { IDockviewPanelProps } from 'dockview'; + +export const Settings = (props: IDockviewPanelProps) => { + const [tabHeight, setTabHeight] = React.useState( + props.containerApi.getTabHeight() + ); + + const onTabHeightChange = (event: React.ChangeEvent) => { + const value = Number(event.target.value); + if (!Number.isNaN(value)) { + setTabHeight(value); + } + }; + + const onClick = () => { + props.containerApi.setTabHeight(tabHeight); + }; + + const onRemove = () => { + props.containerApi.setTabHeight(undefined); + }; + + return ( +
+ +
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/sidebar.layout.json b/build/packages/dockview-demo/src/layout-grid/sidebar.layout.json new file mode 100644 index 000000000..5dd7eb9ba --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/sidebar.layout.json @@ -0,0 +1,57 @@ +{ + "views": [ + { + "size": 22, + "data": { + "id": "1", + "component": "controlCenter", + + "props": {}, + "title": "Control Center", + "state": {} + }, + "minimumSize": 120 + }, + { + "size": 508, + "data": { + "id": "2", + "component": "default", + + "props": {}, + "title": "Panel 1", + "state": {} + }, + "minimumSize": 120, + "expanded": true + }, + { + "size": 248, + "data": { + "id": "3", + "component": "default", + + "props": {}, + "title": "Panel 2", + "state": {} + }, + "minimumSize": 120, + "expanded": true + }, + { + "size": 22, + "data": { + "id": "4", + "component": "default", + + "props": {}, + "title": "Panel 3", + "state": {} + }, + "minimumSize": 120, + "expanded": false + } + ], + "size": 800, + "orientation": "VERTICAL" +} \ No newline at end of file diff --git a/build/packages/dockview-demo/src/layout-grid/sidebar.scss b/build/packages/dockview-demo/src/layout-grid/sidebar.scss new file mode 100644 index 000000000..db6ff0c71 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/sidebar.scss @@ -0,0 +1,18 @@ +.pane-header { + .my-header { + .actions { + display: none; + } + &.within { + .actions { + display: flex; + } + } + } + + &:focus { + .actions { + display: flex; + } + } +} diff --git a/build/packages/dockview-demo/src/layout-grid/sidebar.tsx b/build/packages/dockview-demo/src/layout-grid/sidebar.tsx new file mode 100644 index 000000000..bdb69f55d --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/sidebar.tsx @@ -0,0 +1,97 @@ +import * as React from 'react'; +import { + IGridviewPanelProps, + PaneviewReact, + PaneviewReadyEvent, + IPaneviewPanelProps, + PaneviewApi, + PaneviewDropEvent, +} from 'dockview'; +import { ControlCenter } from './controlCenter'; +import './sidebar.scss'; +import { CompositeDisposable } from '../lifecycle'; + +const components = { + default: (props: IPaneviewPanelProps) => { + return
This is an example panel
; + }, + controlCenter: ControlCenter, +}; + +export const Sidebar = (props: IGridviewPanelProps) => { + const api = React.useRef(); + + const onReady = (event: PaneviewReadyEvent) => { + api.current = event.api; + + console.log(props.api.width, props.api.height); + + event.api.fromJSON(require('./sidebar.layout.json')); + + return; + + event.api.addPanel({ + id: '1', + component: 'controlCenter', + title: 'Control Center', + }); + event.api.addPanel({ + id: '2', + component: 'default', + title: 'Panel 1', + }); + event.api.addPanel({ + id: '3', + component: 'default', + title: 'Panel 2', + }); + event.api.addPanel({ + id: '4', + component: 'default', + title: 'Panel 3', + }); + + setTimeout(() => { + console.log(JSON.stringify(event.api.toJSON(), null, 4)); + }, 10000); + }; + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidDimensionsChange((ev) => { + api.current.layout(ev.width, ev.height); + }), + props.api.onDidVisibilityChange((event) => { + console.log(event); + }), + props.api.onDidFocusChange(({ isFocused }) => { + if (isFocused) { + api.current.focus(); + } + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onDidDrop = React.useCallback((event: PaneviewDropEvent) => { + console.log('drop', event); + }, []); + + return ( +
+ +
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/splitPanel.scss b/build/packages/dockview-demo/src/layout-grid/splitPanel.scss new file mode 100644 index 000000000..e69de29bb diff --git a/build/packages/dockview-demo/src/layout-grid/splitPanel.tsx b/build/packages/dockview-demo/src/layout-grid/splitPanel.tsx new file mode 100644 index 000000000..c5b812383 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/splitPanel.tsx @@ -0,0 +1,145 @@ +import * as React from 'react'; +import { + ISplitviewPanelProps, + Orientation, + SplitviewReadyEvent, + SplitviewReact, + SplitviewApi, + IDockviewPanelProps, +} from 'dockview'; +import { useLayoutRegistry } from './registry'; +import './splitPanel.scss'; +import { CompositeDisposable } from '../lifecycle'; + +const components = { + default1: (props: ISplitviewPanelProps) => { + const ref = React.useRef(); + const [focused, setFocused] = React.useState(false); + const [active, setActive] = React.useState(false); + + const onClick = (ev: React.MouseEvent) => { + props.api.setSize({ size: 300 }); + }; + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidFocusChange((event) => { + setFocused(event.isFocused); + }), + props.api.onDidActiveChange((event) => { + setActive(event.isActive); + }), + props.api.onDidFocusChange(({ isFocused }) => { + if (isFocused) { + ref.current.focus(); + } + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + return ( +
+
+
This is a splitview panel inside a dockable panel
+ + +
+
+
{`isPanelActive: ${active} isPanelFocused: ${focused}`}
+ + {(props as any).text} +
+
+ ); + }, +}; + +export const SplitPanel = (props: IDockviewPanelProps) => { + const api = React.useRef(); + const registry = useLayoutRegistry(); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidDimensionsChange((event) => { + api.current?.layout(event.width, event.height - 25); + }), + props.api.onDidFocusChange(({ isFocused }) => { + if (isFocused) { + api.current.focus(); + } + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + + registry.register('splitview', event.api); + + event.api.fromJSON(require('./splitpanel.layout.json')); + return; + event.api.addPanel({ + id: '1', + component: 'default1', + snap: true, + params: { + text: 'hiya', + }, + }); + event.api.addPanel({ id: '2', component: 'default1' }); + }; + + const onUpdateProps = () => { + const panel = api.current.getPanel('1'); + panel.update({ params: { text: Date.now().toString() } }); + }; + + const onAdd = () => { + api.current.addPanel({ + id: `${Date.now()}`, + component: 'default1', + snap: true, + params: { + text: 'hiya', + }, + }); + }; + + const onRemove = () => { + const panels = api.current.panels; + if (panels.length === 0) { + return; + } + api.current.removePanel(panels[panels.length - 1]); + }; + + return ( +
+
+ + + +
+ +
+ ); +}; diff --git a/build/packages/dockview-demo/src/layout-grid/splitpanel.layout.json b/build/packages/dockview-demo/src/layout-grid/splitpanel.layout.json new file mode 100644 index 000000000..fa01f2ef9 --- /dev/null +++ b/build/packages/dockview-demo/src/layout-grid/splitpanel.layout.json @@ -0,0 +1,29 @@ +{ + "views": [ + { + "size": 200, + "data": { + "id": "1", + "component": "default1", + "props": { + "text": "hiya" + } + }, + "minimumSize": 200, + "maximumSize": 9007199254740991, + "snap": true + }, + { + "size": 409, + "data": { + "id": "2", + "component": "default1" + }, + "minimumSize": 200, + "maximumSize": 9007199254740991 + } + ], + "activeView": "2", + "size": 609, + "orientation": "VERTICAL" +} \ No newline at end of file diff --git a/build/packages/dockview-demo/src/lifecycle.ts b/build/packages/dockview-demo/src/lifecycle.ts new file mode 100644 index 000000000..0486cedff --- /dev/null +++ b/build/packages/dockview-demo/src/lifecycle.ts @@ -0,0 +1,54 @@ +export interface IDisposable { + dispose: () => void; +} + +export interface IValueDisposable { + value: T; + disposable: IDisposable; +} + +export namespace Disposable { + export const NONE: IDisposable = { + dispose: () => { + // noop + }, + }; +} + +export class CompositeDisposable { + private readonly disposables: IDisposable[]; + + public static from(...args: IDisposable[]) { + return new CompositeDisposable(...args); + } + + constructor(...args: IDisposable[]) { + this.disposables = args; + } + + public addDisposables(...args: IDisposable[]) { + args.forEach((arg) => this.disposables.push(arg)); + } + + public dispose() { + this.disposables.forEach((arg) => arg.dispose()); + } +} + +export class MutableDisposable implements IDisposable { + private _disposable = Disposable.NONE; + + set value(disposable: IDisposable) { + if (this._disposable) { + this._disposable.dispose(); + } + this._disposable = disposable; + } + + public dispose() { + if (this._disposable) { + this._disposable.dispose(); + this._disposable = Disposable.NONE; + } + } +} diff --git a/build/packages/dockview-demo/src/panels/gridview/gridview.tsx b/build/packages/dockview-demo/src/panels/gridview/gridview.tsx new file mode 100644 index 000000000..7c1b85219 --- /dev/null +++ b/build/packages/dockview-demo/src/panels/gridview/gridview.tsx @@ -0,0 +1,328 @@ +import { + ActiveEvent, + FocusEvent, + GridConstraintChangeEvent, + GridviewApi, + GridviewReact, + GridviewReadyEvent, + IDockviewPanelProps, + IGridviewPanelProps, + LayoutPriority, + Orientation, + orthogonal, + PanelCollection, + PanelDimensionChangeEvent, + VisibilityEvent, +} from 'dockview'; +import * as React from 'react'; +import { CompositeDisposable } from '../../lifecycle'; + +const components: PanelCollection = { + default: (props) => { + const [active, setActive] = React.useState(false); + const [visible, setVisible] = React.useState(false); + const [focused, setFocused] = React.useState(false); + const [dimension, setDimension] = React.useState<{ + width: number; + height: number; + }>({ width: 0, height: 0 }); + const [ + constraints, + setConstraints, + ] = React.useState({ + minimumHeight: undefined, + maximumHeight: undefined, + minimumWidth: undefined, + maximumWidth: undefined, + }); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidActiveChange((event: ActiveEvent) => { + setActive(event.isActive); + }), + props.api.onDidConstraintsChange( + (event: GridConstraintChangeEvent) => { + setConstraints(event); + } + ), + props.api.onDidDimensionsChange( + (event: PanelDimensionChangeEvent) => { + setDimension(event); + } + ), + props.api.onDidFocusChange((event: FocusEvent) => { + setFocused(event.isFocused); + }), + props.api.onDidVisibilityChange((event: VisibilityEvent) => { + setVisible(event.isVisible); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const color = React.useMemo( + () => + `rgb(${Math.floor(256 * Math.random())},${Math.floor( + 256 * Math.random() + )},${Math.floor(256 * Math.random())})`, + [] + ); + + return ( +
+
+ Width + {dimension.width} + Height + {dimension.height} + Min. height + {constraints.minimumHeight} + Max. height + {constraints.maximumHeight} + Min. width + {constraints.minimumWidth} + Max. width + {constraints.maximumWidth} + Active + {active.toString()} + Visible + {visible.toString()} + Focused + {focused.toString()} +
+
+ ); + }, +}; + +export const GridviewDemoPanel = (props: IDockviewPanelProps) => { + return ( +
+
+

Gridview

+
+
    +
  • + The gridview is a collection of nested splitviews which + forms a grid-based layout +
  • +
+ +
+ ); +}; + +export const GridviewDemo = (props: IDockviewPanelProps) => { + const api = React.useRef(); + + const [orientation, setOrientation] = React.useState( + Orientation.VERTICAL + ); + + const onClick = () => { + api.current.orientation = orthogonal(api.current.orientation); + // load(); + }; + + const load = () => { + api.current.fromJSON({ + activePanel: '1', + grid: { + height: 3, + width: 2, + orientation: orientation, + root: { + type: 'branch', + size: 3, + data: [ + { + type: 'branch', + size: 1, + data: [ + { + type: 'leaf', + size: 1, + data: { + id: '1', + component: 'default', + minimumHeight: 50, + maximumHeight: Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: Number.POSITIVE_INFINITY, + snap: false, + priority: LayoutPriority.Normal, + }, + }, + { + type: 'branch', + size: 1, + data: [ + { + type: 'leaf', + size: 0.5, + data: { + id: '2', + component: 'default', + minimumHeight: 50, + maximumHeight: + Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: + Number.POSITIVE_INFINITY, + snap: false, + priority: LayoutPriority.Normal, + }, + }, + { + type: 'branch', + size: 0.5, + data: [ + { + type: 'leaf', + size: 0.5, + data: { + id: '2', + component: 'default', + minimumHeight: 50, + maximumHeight: + Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: + Number.POSITIVE_INFINITY, + snap: false, + priority: + LayoutPriority.Normal, + }, + }, + { + type: 'leaf', + size: 0.5, + data: { + id: '3', + component: 'default', + minimumHeight: 50, + maximumHeight: + Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: + Number.POSITIVE_INFINITY, + snap: false, + priority: + LayoutPriority.Normal, + }, + }, + ], + }, + ], + }, + ], + }, + { + type: 'leaf', + size: 1, + data: { + id: '4', + component: 'default', + minimumHeight: 50, + maximumHeight: Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: Number.POSITIVE_INFINITY, + snap: false, + priority: LayoutPriority.Normal, + }, + }, + { + type: 'branch', + size: 1, + data: [ + { + type: 'leaf', + size: 1, + data: { + id: '3', + component: 'default', + minimumHeight: 50, + maximumHeight: Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: Number.POSITIVE_INFINITY, + snap: false, + priority: LayoutPriority.Normal, + }, + }, + { + type: 'leaf', + size: 1, + data: { + id: '4', + component: 'default', + minimumHeight: 50, + maximumHeight: Number.POSITIVE_INFINITY, + minimumWidth: 50, + maximumWidth: Number.POSITIVE_INFINITY, + snap: false, + priority: LayoutPriority.Normal, + }, + }, + ], + }, + ], + }, + }, + }); + }; + + const onReady = (event: GridviewReadyEvent) => { + api.current = event.api; + api.current?.layout(props.api.width - 80, 600); + + load(); + }; + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidDimensionsChange((event) => { + api.current?.layout(event.width - 80, 600); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + return ( +
+ +
+ +
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/panels/splitview/splitview.scss b/build/packages/dockview-demo/src/panels/splitview/splitview.scss new file mode 100644 index 000000000..e395ca0b1 --- /dev/null +++ b/build/packages/dockview-demo/src/panels/splitview/splitview.scss @@ -0,0 +1,76 @@ +.splitview-demo-container { + width: 100%; + padding: 0px 20px; + box-sizing: border-box; + + .splitview-demo-content { + display: flex; + --dv-separator-border: white; + } + + &.vertical { + .api-parameter { + padding-left: 10px; + } + + .splitview-demo-view { + height: 500px; + width: 150px; + + .api-parameter { + padding-left: 0px; + } + } + } + &.horizontal { + .splitview-demo-content { + flex-direction: column; + } + + .api-parameter { + padding-top: 10px; + } + + .splitview-demo-view { + height: 180px; + width: 500px; + + .api-parameter { + padding-top: 0px; + } + } + } +} + +.api-parameter { + display: grid; + grid-template-columns: 70px 50px; + grid-auto-rows: 18px; + + span { + &:nth-child(2n) { + text-align: right; + } + } + + .visibility-toggle { + height: 16px; + outline: 1px solid dodgerblue; + outline-offset: -1px; + padding: 0px 4px; + display: flex; + cursor: pointer; + + &:not(:first-child) { + margin-left: 4px; + } + } +} + +.splitview-demo-panel { + background-color: #2d2d2d; + height: 100%; + padding: 10px; + box-sizing: border-box; + overflow: hidden; +} diff --git a/build/packages/dockview-demo/src/panels/splitview/splitview.tsx b/build/packages/dockview-demo/src/panels/splitview/splitview.tsx new file mode 100644 index 000000000..17012f142 --- /dev/null +++ b/build/packages/dockview-demo/src/panels/splitview/splitview.tsx @@ -0,0 +1,308 @@ +import { + ISplitviewPanelProps, + Orientation, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, + PanelDimensionChangeEvent, + ActiveEvent, + FocusEvent, + VisibilityEvent, + PanelConstraintChangeEvent, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; +import { CompositeDisposable } from '../../lifecycle'; +import './splitview.scss'; + +const components = { + default: (props: ISplitviewPanelProps) => { + const [active, setActive] = React.useState(false); + const [visible, setVisible] = React.useState(false); + const [focused, setFocused] = React.useState(false); + const [dimension, setDimension] = React.useState<{ + width: number; + height: number; + }>({ width: 0, height: 0 }); + const [constraints, setConstraints] = React.useState<{ + maximumSize?: number; + minimumSize?: number; + }>({ maximumSize: undefined, minimumSize: undefined }); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidActiveChange((event: ActiveEvent) => { + setActive(event.isActive); + }), + props.api.onDidConstraintsChange( + (event: PanelConstraintChangeEvent) => { + setConstraints(event); + } + ), + props.api.onDidDimensionsChange( + (event: PanelDimensionChangeEvent) => { + setDimension(event); + } + ), + props.api.onDidFocusChange((event: FocusEvent) => { + setFocused(event.isFocused); + }), + props.api.onDidVisibilityChange((event: VisibilityEvent) => { + setVisible(event.isVisible); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const color = React.useMemo( + () => 'rgba(14, 99, 156,0.4)', + // `rgb(${Math.floor(256 * Math.random())},${Math.floor( + // 256 * Math.random() + // )},${Math.floor(256 * Math.random())})`, + [] + ); + + return ( +
+
+ Id + {props.api.id} + Width + {dimension.width} + Height + {dimension.height} + Min. size + {constraints.minimumSize} + Max. size + {constraints.maximumSize} + Active + {active.toString()} + Visible + {visible.toString()} + Focused + {focused.toString()} +
+
+ ); + }, +}; + +export const SplitviewPanel = (props: IDockviewPanelProps) => { + return ( +
+
+ Splitview +
+
    +
  • + The splitview component exposes an API object, a selection + of avaliable values are shown in the summary sections below +
  • +
  • + Each panel exposes it's own API, and has access to the + common API. A selector of panel API values are shown in each + panel of the splitview. +
  • +
+ + +
+ ); +}; + +export const Common = ( + props: IDockviewPanelProps & { orientation: Orientation } +) => { + const api = React.useRef(); + + const [dimensions, setDimensions] = React.useState<{ + height: number; + width: number; + maximumSize: number; + minimumSize: number; + visibility: boolean[]; + length: number; + }>({ + height: undefined, + width: undefined, + maximumSize: undefined, + minimumSize: undefined, + visibility: [], + length: undefined, + }); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + props.api.onDidDimensionsChange( + (event: PanelDimensionChangeEvent) => { + switch (props.orientation) { + case Orientation.HORIZONTAL: + api.current.layout(500, 100); + break; + case Orientation.VERTICAL: + api.current.layout(100, 500); + break; + } + + const height = api.current.height; + const width = api.current.width; + const maximumSize = api.current.maximumSize; + const minimumSize = api.current.minimumSize; + const length = api.current.length; + + setDimensions({ + height, + width, + maximumSize, + minimumSize, + length, + visibility: api.current.panels.map( + (_) => _.api.isVisible + ), + }); + } + ), + api.current.onDidLayoutChange(() => { + // + }) + ); + return () => { + disposable.dispose(); + }; + }, []); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + + event.api.fromJSON({ + views: [ + { + data: { + id: 'one', + component: 'default', + minimumSize: 10, + }, + size: 1, + }, + { + data: { + id: 'two', + component: 'default', + minimumSize: 10, + maximumSize: 200, + }, + size: 2, + }, + { + data: { + id: 'three', + component: 'default', + minimumSize: 50, + }, + size: 3, + snap: true, + }, + ], + size: 6, + activeView: 'one', + orientation: props.orientation, + }); + }; + + const toggleVisibility = (i: number) => () => { + const panel = api.current.panels[i]; + panel.api.setVisible(panel.api.isVisible); + setDimensions((dimensions) => ({ + ...dimensions, + visibility: api.current.panels.map((_) => _.api.isVisible), + })); + }; + + const move = () => { + api.current.movePanel(api.current.panels.length - 1, 0); + setDimensions((dimensions) => ({ + ...dimensions, + visibility: api.current.panels.map((_) => _.api.isVisible), + })); + }; + + const text = React.useMemo(() => { + switch (props.orientation) { + case Orientation.VERTICAL: + return 'Vertical Splitview'; + case Orientation.HORIZONTAL: + return 'Horizontal Splitview'; + } + }, [props.orientation]); + + return ( +
+

{text}

+
+
+
+ +
+
+
+ Height + {dimensions.height} + Width + {dimensions.width} + Lenght + {dimensions.length} + Min. size + {dimensions.minimumSize} + Max. size + {dimensions.maximumSize} + Visible + + {dimensions.visibility.map((_, i) => { + return ( +
+ {_ ? 'Yes' : 'No'} +
+ ); + })} +
+ Move view + + Go + +
+
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/panels/welcome/welcome.scss b/build/packages/dockview-demo/src/panels/welcome/welcome.scss new file mode 100644 index 000000000..f2f76d641 --- /dev/null +++ b/build/packages/dockview-demo/src/panels/welcome/welcome.scss @@ -0,0 +1,33 @@ +.welcome-panel { + color: #cccccc; + margin: 40px; + + .welcome-header { + margin-bottom: 40px; + h1 { + font-size: 30px; + } + h2 { + font-size: 20px; + } + } + + .directory { + .directory-title { + font-size: 16px; + height: 25px; + line-height: 25px; + } + .directory-item { + font-size: 13px; + height: 20px; + line-height: 20px; + color: dodgerblue; + cursor: pointer; + + &:hover { + text-decoration: underline; + } + } + } +} diff --git a/build/packages/dockview-demo/src/panels/welcome/welcome.tsx b/build/packages/dockview-demo/src/panels/welcome/welcome.tsx new file mode 100644 index 000000000..cfd688f3b --- /dev/null +++ b/build/packages/dockview-demo/src/panels/welcome/welcome.tsx @@ -0,0 +1,53 @@ +import { IDockviewPanelProps } from 'dockview'; +import * as React from 'react'; +import './welcome.scss'; + +export const WelcomePanel = (props: IDockviewPanelProps) => { + const onAddSplitview = (event: React.MouseEvent) => { + const splitviewPanel = props.containerApi.getPanel('splitview'); + if (splitviewPanel) { + splitviewPanel.api.setActive(); + return; + } + + props.containerApi.addPanel({ + id: 'splitview', + component: 'splitview', + title: 'Splitview Docs', + }); + }; + + const onAddGridview = (event: React.MouseEvent) => { + const splitviewPanel = props.containerApi.getPanel('gridview'); + if (splitviewPanel) { + splitviewPanel.api.setActive(); + return; + } + + props.containerApi.addPanel({ + id: 'gridview', + component: 'gridview', + title: 'Gridview Docs', + }); + }; + + return ( +
+
+

Dockview

+

Zero dependency layout manager

+
+
+
Components
+
Dockview
+
+ Splitview +
+
+ Gridview +
+
Paneview
+
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/resources/dockview-logo.svg b/build/packages/dockview-demo/src/resources/dockview-logo.svg new file mode 100644 index 000000000..fb328fcab --- /dev/null +++ b/build/packages/dockview-demo/src/resources/dockview-logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/build/packages/dockview-demo/src/resources/gridview-logo.svg b/build/packages/dockview-demo/src/resources/gridview-logo.svg new file mode 100644 index 000000000..a305ecb88 --- /dev/null +++ b/build/packages/dockview-demo/src/resources/gridview-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build/packages/dockview-demo/src/resources/logo.svg b/build/packages/dockview-demo/src/resources/logo.svg new file mode 100644 index 000000000..579c20c82 --- /dev/null +++ b/build/packages/dockview-demo/src/resources/logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/packages/dockview-demo/src/resources/paneview-logo.svg b/build/packages/dockview-demo/src/resources/paneview-logo.svg new file mode 100644 index 000000000..0e9ac485e --- /dev/null +++ b/build/packages/dockview-demo/src/resources/paneview-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build/packages/dockview-demo/src/resources/splitview-logo.svg b/build/packages/dockview-demo/src/resources/splitview-logo.svg new file mode 100644 index 000000000..cfa51c489 --- /dev/null +++ b/build/packages/dockview-demo/src/resources/splitview-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/build/packages/dockview-demo/src/services/sidebarItem.tsx b/build/packages/dockview-demo/src/services/sidebarItem.tsx new file mode 100644 index 000000000..97496b740 --- /dev/null +++ b/build/packages/dockview-demo/src/services/sidebarItem.tsx @@ -0,0 +1,144 @@ +import { ViewContainer } from './viewContainer'; +import * as React from 'react'; + +export const Container = (props: { + container: ViewContainer; + isActive: boolean; + onDragOver: (e: React.DragEvent) => void; + onDrop: (e: React.DragEvent, direction: 'top' | 'bottom') => void; + onClick: (e: React.MouseEvent) => void; +}) => { + const ref = React.useRef(null); + const [selection, setSelection] = React.useState< + 'top' | 'bottom' | undefined + >(undefined); + const isDragging = React.useRef(false); + + const [dragEntered, setDragEntered] = React.useState(false); + + const timer = React.useRef(null); + + const onDragOver = (e: React.DragEvent) => { + if (!timer.current) { + timer.current = setTimeout(() => { + props.onDragOver(e); + }, 1000); + } + + if (isDragging.current) { + return; + } + + setDragEntered(true); + + e.preventDefault(); + + const target = e.target as HTMLDivElement; + + const width = target.clientWidth; + const height = target.clientHeight; + + if (width === 0 || height === 0) { + return; // avoid div!0 + } + + const x = e.nativeEvent.offsetX; + const y = e.nativeEvent.offsetY; + const xp = (100 * x) / width; + const yp = (100 * y) / height; + + const isTop = yp < 50; + const isBottom = yp >= 50; + + setSelection(isTop ? 'top' : 'bottom'); + }; + + const onDragLeave = (e: React.DragEvent) => { + if (timer.current) { + clearTimeout(timer.current); + timer.current = null; + } + + if (isDragging.current) { + return; + } + + setDragEntered(false); + + setSelection(undefined); + }; + + const onDrop = (e: React.DragEvent) => { + if (timer.current) { + clearTimeout(timer.current); + timer.current = null; + } + if (isDragging.current) { + return; + } + + setDragEntered(false); + + props.onDrop(e, selection); + + setSelection(undefined); + }; + + const onDragEnter = (e: React.DragEvent) => { + e.preventDefault(); + }; + + const onDragStart = (e: React.DragEvent) => { + isDragging.current = true; + + e.dataTransfer.setData( + 'application/json', + JSON.stringify({ container: props.container.id }) + ); + }; + + const onDragEnd = (e: React.DragEvent) => { + isDragging.current = false; + + setDragEntered(false); + }; + + return ( +
+ {dragEntered && ( + + ); +}; diff --git a/build/packages/dockview-demo/src/services/view.ts b/build/packages/dockview-demo/src/services/view.ts new file mode 100644 index 000000000..867cf85a0 --- /dev/null +++ b/build/packages/dockview-demo/src/services/view.ts @@ -0,0 +1,64 @@ +export interface SerializedView { + id: string; + isExpanded: boolean; +} + +export type ViewOptions = { + id: string; + title: string; + isExpanded: boolean; + isLocationEditable: boolean; + icon: string; +}; + +export interface View { + readonly id: string; + readonly isExpanded: boolean; + readonly title: string; + readonly isLocationEditable: boolean; + readonly icon: string; + toJSON(): SerializedView; +} + +export class DefaultView implements View { + private readonly _id: string; + private readonly _title: string; + private readonly _isExpanded: boolean; + private readonly _isLocationEditable: boolean; + private readonly _icon: string; + + get id(): string { + return this._id; + } + + get title(): string { + return this._title; + } + + get isExpanded(): boolean { + return this._isExpanded; + } + + get isLocationEditable(): boolean { + return this._isLocationEditable; + } + + get icon(): string { + return this._icon; + } + + constructor(options: ViewOptions) { + this._id = options.id; + this._title = options.title; + this._isExpanded = options.isExpanded; + this._isLocationEditable = options.isLocationEditable; + this._icon = options.icon; + } + + toJSON(): SerializedView { + return { + id: this.id, + isExpanded: this.isExpanded, + }; + } +} diff --git a/build/packages/dockview-demo/src/services/viewContainer.ts b/build/packages/dockview-demo/src/services/viewContainer.ts new file mode 100644 index 000000000..b622039bb --- /dev/null +++ b/build/packages/dockview-demo/src/services/viewContainer.ts @@ -0,0 +1,126 @@ +import { SerializedPaneview } from 'dockview'; +import { Emitter, Event } from '../events'; +import { DefaultView, View, SerializedView } from './view'; +import { IViewRegistry } from './viewRegistry'; + +export interface SerializedViewContainer { + readonly id: string; + readonly views: SerializedView[]; +} + +export interface ViewContainer { + readonly id: string; + readonly views: View[]; + readonly schema: T | any; + readonly icon: string; + readonly onDidAddView: Event<{ view: View; index?: number }>; + readonly onDidRemoveView: Event; + addView(view: View, location?: number): void; + layout(schema: T): void; + removeView(view: View): void; + clear(): void; + toJSON(): SerializedViewContainer; +} + +export class PaneviewContainer implements ViewContainer { + private readonly _id: string; + private readonly _views: View[] = []; + + private readonly _onDidAddView = new Emitter<{ + view: View; + index?: number; + }>(); + readonly onDidAddView = this._onDidAddView.event; + private readonly _onDidRemoveView = new Emitter(); + readonly onDidRemoveView = this._onDidRemoveView.event; + + private _schema: SerializedPaneview | undefined; + + get id() { + return this._id; + } + + get views() { + return [...this._views]; + } + + get schema(): SerializedPaneview | undefined { + if (!this._schema) { + this._schema = JSON.parse( + localStorage.getItem(`viewcontainer_${this.id}`) + ); + } + return this._schema; + } + + get icon(): string { + const defaultIcon = 'search'; + if (this.views.length > 0) { + return this.views.find((v) => !!v.icon)?.icon || defaultIcon; + } + return defaultIcon; + } + + constructor( + id: string, + viewRegistry: IViewRegistry, + views?: SerializedView[] + ) { + this._id = id; + + if (views) { + for (const view of views) { + const registeredView = viewRegistry.getRegisteredView(view.id); + this.addView( + new DefaultView({ + id: view.id, + title: registeredView.title, + isExpanded: view.isExpanded, + isLocationEditable: registeredView.isLocationEditable, + icon: registeredView.icon, + }) + ); + } + } + // this.addDisposables(this._onDidAddView, this._onDidRemoveView); + } + + layout(schema: SerializedPaneview): void { + this._schema = schema; + localStorage.setItem( + `viewcontainer_${this.id}`, + JSON.stringify(schema) + ); + } + + addView(view: View, index?: number): void { + this._views.splice(index, 0, view); + this._onDidAddView.fire({ view, index }); + } + + removeView(view: View): void { + const index = this._views.indexOf(view); + if (index < 0) { + throw new Error('invalid'); + } + this._views.splice(index, 1); + + if (this._schema) { + this._schema = { ...this._schema }; + this._schema.views = this._schema.views.filter( + (v) => v.data.id !== view.id + ); + this.layout(this._schema); + } + + this._onDidRemoveView.fire(view); + } + + clear() { + localStorage.removeItem(`viewcontainer_${this.id}`); + } + + toJSON(): SerializedViewContainer { + return { id: this.id, views: this.views.map((v) => v.toJSON()) }; + } +} diff --git a/build/packages/dockview-demo/src/services/viewRegistry.tsx b/build/packages/dockview-demo/src/services/viewRegistry.tsx new file mode 100644 index 000000000..6666e417b --- /dev/null +++ b/build/packages/dockview-demo/src/services/viewRegistry.tsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { ControlCenter } from '../layout-grid/controlCenter'; + +export interface RegisteredView { + id: string; + icon: string; + title: string; + isLocationEditable: boolean; + component: React.FunctionComponent; +} + +export interface IViewRegistry { + getRegisteredView(id: string): RegisteredView | undefined; +} + +export class ViewRegistry { + private readonly _registry = new Map(); + + register(registeredView: RegisteredView): void { + this._registry.set(registeredView.id, registeredView); + } + + getRegisteredView(id: string): RegisteredView | undefined { + return this._registry.get(id); + } +} + +export const VIEW_REGISTRY = new ViewRegistry(); + +VIEW_REGISTRY.register({ + id: 'search_widget', + title: 'search', + icon: 'search', + isLocationEditable: false, + component: () => { + return ( +
+ This is a search bar component +
+ ); + }, +}); +VIEW_REGISTRY.register({ + id: 'home_widget', + title: 'Home', + icon: 'home', + isLocationEditable: true, + component: ControlCenter, +}); + +VIEW_REGISTRY.register({ + id: 'account_widget', + title: 'Account', + icon: 'account_circle', + isLocationEditable: true, + component: () => { + return ( +
+ account_circle +
+ ); + }, +}); +VIEW_REGISTRY.register({ + id: 'settings_widget', + title: 'Settings', + icon: 'settings', + isLocationEditable: true, + component: () => { + return ( +
+ settings +
+ ); + }, +}); diff --git a/build/packages/dockview-demo/src/services/viewService.ts b/build/packages/dockview-demo/src/services/viewService.ts new file mode 100644 index 000000000..cf5bdacee --- /dev/null +++ b/build/packages/dockview-demo/src/services/viewService.ts @@ -0,0 +1,213 @@ +import { Emitter, Event } from '../events'; +import { IDisposable } from '../lifecycle'; +import { View } from './view'; +import { + PaneviewContainer, + ViewContainer, + SerializedViewContainer, +} from './viewContainer'; +import { IViewRegistry } from './viewRegistry'; + +export interface SerializedViewService { + containers: SerializedViewContainer[]; + activeContainer?: string; +} + +export interface IViewService extends IDisposable { + readonly containers: ViewContainer[]; + readonly onDidActiveContainerChange: Event; + readonly onDidRemoveContainer: Event; + readonly onDidAddContainer: Event; + readonly onDidContainersChange: Event; + readonly activeContainer: ViewContainer | undefined; + addContainer(container: ViewContainer): void; + setActiveViewContainer(id: string): void; + getView(id: string): View | undefined; + moveViewToLocation( + view: View, + targetViewContainer: ViewContainer, + targetLocation: number + ): void; + insertContainerAfter(source: ViewContainer, target: ViewContainer): void; + insertContainerBefore(source: ViewContainer, target: ViewContainer): void; + addViews(view: View, viewContainer: ViewContainer, location?: number): void; + removeViews(removeViews: View[], viewContainer: ViewContainer): void; + getViewContainer(id: string): ViewContainer | undefined; + getViewContainer2(view: View): ViewContainer | undefined; + toJSON(): SerializedViewService; + load(layout: SerializedViewService): void; +} + +export class ViewService implements IViewService { + private _viewContainers: ViewContainer[] = []; + private readonly _onDidActiveContainerChange = new Emitter(); + readonly onDidActiveContainerChange = this._onDidActiveContainerChange + .event; + private readonly _onDidRemoveContainer = new Emitter(); + readonly onDidRemoveContainer = this._onDidRemoveContainer.event; + private readonly _onDidAddContainer = new Emitter(); + readonly onDidAddContainer = this._onDidAddContainer.event; + private readonly _onDidContainersChange = new Emitter(); + readonly onDidContainersChange = this._onDidContainersChange.event; + private _activeViewContainerId: string; + + get containers(): ViewContainer[] { + return this._viewContainers; + } + + get activeContainer(): ViewContainer | undefined { + return this._viewContainers.find( + (c) => c.id === this._activeViewContainerId + ); + } + + constructor(private readonly viewRegistry: IViewRegistry) { + // + } + + load(layout: SerializedViewService): void { + const { containers, activeContainer } = layout; + + for (const container of containers) { + const { id, views } = container; + const viewContainer = new PaneviewContainer( + id, + this.viewRegistry, + views + ); + + this.addContainer(viewContainer); + } + + this.setActiveViewContainer(activeContainer); + } + + insertContainerAfter(source: ViewContainer, target: ViewContainer): void { + const sourceIndex = this._viewContainers.findIndex( + (c) => c.id === source.id + ); + + const view = this._viewContainers.splice(sourceIndex, 1)[0]; + + const targetIndex = this._viewContainers.findIndex( + (c) => c.id === target.id + ); + + this._viewContainers.splice(targetIndex + 1, 0, view); + this._viewContainers = [...this._viewContainers]; + + this._onDidContainersChange.fire(); + } + + insertContainerBefore(source: ViewContainer, target: ViewContainer): void { + const sourceIndex = this._viewContainers.findIndex( + (c) => c.id === source.id + ); + + const view = this._viewContainers.splice(sourceIndex, 1)[0]; + + const targetIndex = this._viewContainers.findIndex( + (c) => c.id === target.id + ); + + this._viewContainers.splice(Math.max(targetIndex, 0), 0, view); + this._viewContainers = [...this._viewContainers]; + + this._onDidContainersChange.fire(); + } + + addContainer(container: ViewContainer): void { + this._viewContainers = [...this._viewContainers, container]; + this._activeViewContainerId = container.id; + this._onDidAddContainer.fire(); + } + + removeContainer(container: ViewContainer): void { + this._viewContainers = this._viewContainers.filter( + (c) => c.id !== container.id + ); + + if (this._activeViewContainerId === container.id) { + this._activeViewContainerId = + this._viewContainers.length > 0 + ? this._viewContainers[0].id + : undefined; + } + + this._onDidRemoveContainer.fire(); + } + + setActiveViewContainer(id: string): void { + if (!this._viewContainers.find((c) => c.id === id)) { + throw new Error(`invalid container ${id}`); + } + this._activeViewContainerId = id; + this._onDidActiveContainerChange.fire(); + } + + getView(id: string): View | undefined { + for (const container of Array.from(this._viewContainers.values())) { + const view = container.views.find((v) => v.id === id); + if (view) { + return view; + } + } + return undefined; + } + + moveViewToLocation( + view: View, + targetViewContainer: ViewContainer, + targetLocation: number + ): void { + const sourceViewContainer = this.getViewContainer2(view); + this.removeViews([view], sourceViewContainer); + this.addViews(view, targetViewContainer, targetLocation); + } + + addViews( + view: View, + viewContainer: ViewContainer, + location?: number + ): void { + viewContainer.addView(view, location); + } + + removeViews(removeViews: View[], viewContainer: ViewContainer): void { + for (const view of removeViews) { + viewContainer.removeView(view); + + if (viewContainer.views.length === 0) { + viewContainer.clear(); + this.removeContainer(viewContainer); + } + } + } + + getViewContainer(id: string): ViewContainer | undefined { + return this._viewContainers.find((c) => c.id === id); + } + + getViewContainer2(view: View): ViewContainer | undefined { + for (const container of Array.from(this._viewContainers.values())) { + const v = container.views.find((v) => v.id === view.id); + if (v) { + return container; + } + } + return undefined; + } + + toJSON(): SerializedViewService { + return { + containers: this.containers.map((c) => c.toJSON()), + activeContainer: this.activeContainer.id, + }; + } + + dispose(): void { + this._onDidActiveContainerChange.dispose(); + this._onDidAddContainer.dispose(); + this._onDidRemoveContainer.dispose(); + } +} diff --git a/build/packages/dockview-demo/src/services/widgets.scss b/build/packages/dockview-demo/src/services/widgets.scss new file mode 100644 index 000000000..69c4abbf7 --- /dev/null +++ b/build/packages/dockview-demo/src/services/widgets.scss @@ -0,0 +1,32 @@ +.sidebar-part { + background-color: #252526; +} + +.activity-bar-part { + background-color: #333333; + + .activity-bar-item { + display: flex; + cursor: pointer; + justify-content: center; + align-items: center; + height: 48px; + box-sizing: border-box; + position: relative; + color: grey; + font-size: 24px; + + &:hover, + &.active { + color: white; + } + } + + .activity-bar-space { + height: 100%; + + &.activity-bar-space-dragover { + border-top: 2px solid white; + } + } +} diff --git a/build/packages/dockview-demo/src/services/widgets.tsx b/build/packages/dockview-demo/src/services/widgets.tsx new file mode 100644 index 000000000..555d0cb64 --- /dev/null +++ b/build/packages/dockview-demo/src/services/widgets.tsx @@ -0,0 +1,474 @@ +import { + getPaneData, + GridviewApi, + IGridviewPanelProps, + IPaneviewPanelProps, + PanelCollection, + PaneviewApi, + PaneviewDropEvent, + PaneviewReact, + PaneviewReadyEvent, + Position, +} from 'dockview'; +import * as React from 'react'; +import { useLayoutRegistry } from '../layout-grid/registry'; +import { PaneviewContainer, ViewContainer } from './viewContainer'; +import { IViewService, ViewService } from './viewService'; +import { DefaultView } from './view'; +import { RegisteredView, VIEW_REGISTRY } from './viewRegistry'; +import { toggleClass } from '../dom'; +import { Container } from './sidebarItem'; +import './widgets.scss'; +import { CompositeDisposable } from '../lifecycle'; + +class ViewServiceModel { + private readonly viewService: IViewService; + + get model() { + return this.viewService; + } + + constructor() { + this.viewService = new ViewService(VIEW_REGISTRY); + this.init(); + } + + init(): void { + const layout = localStorage.getItem('viewservice'); + if (layout) { + this.viewService.load(JSON.parse(layout)); + } else { + const container1 = new PaneviewContainer( + 'default_container_1', + VIEW_REGISTRY + ); + if (!container1.schema) { + this.addView( + container1, + VIEW_REGISTRY.getRegisteredView('search_widget') + ); + this.addView( + container1, + VIEW_REGISTRY.getRegisteredView('home_widget') + ); + } + const container2 = new PaneviewContainer( + 'default_container_2', + VIEW_REGISTRY + ); + if (!container2.schema) { + this.addView( + container2, + VIEW_REGISTRY.getRegisteredView('account_widget') + ); + this.addView( + container2, + VIEW_REGISTRY.getRegisteredView('settings_widget') + ); + } + this.viewService.addContainer(container1); + this.viewService.addContainer(container2); + } + + const save = () => { + localStorage.setItem( + 'viewservice', + JSON.stringify(this.viewService.toJSON()) + ); + }; + + this.viewService.onDidActiveContainerChange(save); + this.viewService.onDidRemoveContainer(save); + this.viewService.onDidAddContainer(save); + } + + private addView( + container: ViewContainer, + registedView: RegisteredView + ): void { + container.addView( + new DefaultView({ + id: registedView.id, + title: registedView.title, + isExpanded: true, + isLocationEditable: registedView.isLocationEditable, + icon: registedView.icon, + }) + ); + } +} + +const viewService = new ViewServiceModel(); + +const colors = { + home_widget: 'red', + account_widget: 'green', + settings_widget: 'yellow', + search_widget: 'orange', +}; + +const components: PanelCollection> = { + default: (props: IPaneviewPanelProps<{ viewId: string }>) => { + const Component = React.useMemo(() => { + const registeredView = VIEW_REGISTRY.getRegisteredView( + props.params.viewId + ); + return registeredView?.component; + }, [props.params.viewId]); + + return Component ? : null; + }, +}; + +export const Activitybar = (props: IGridviewPanelProps) => { + const [activeContainerid, setActiveContainerId] = React.useState( + viewService.model.activeContainer.id + ); + const [containers, setContainers] = React.useState( + viewService.model.containers + ); + + const registry = useLayoutRegistry(); + + React.useEffect(() => { + const disposable = new CompositeDisposable( + viewService.model.onDidActiveContainerChange(() => { + setActiveContainerId(viewService.model.activeContainer.id); + }), + viewService.model.onDidAddContainer(() => { + setContainers(viewService.model.containers); + }), + viewService.model.onDidRemoveContainer(() => { + setContainers(viewService.model.containers); + }), + viewService.model.onDidContainersChange(() => { + setContainers(viewService.model.containers); + }) + ); + + return () => { + disposable.dispose(); + }; + }, []); + + const onClick = + (container: ViewContainer, alwaysOpen = false) => + (event: React.MouseEvent) => { + const api = registry.get('gridview'); + + const selectedActive = container.id === activeContainerid; + + const sidebarPanel = api.getPanel('sidebar'); + if (sidebarPanel.api.isVisible) { + if (!alwaysOpen && selectedActive) { + sidebarPanel.api.setVisible(false); + } + } else { + event.preventDefault(); // prevent focus + sidebarPanel.api.setVisible(true); + sidebarPanel.focus(); + } + + viewService.model.setActiveViewContainer(container.id); + }; + + const onContainerDrop = + (targetContainer: ViewContainer) => + (event: React.DragEvent, direction: 'top' | 'bottom') => { + const data = event.dataTransfer.getData('application/json'); + if (data) { + const { container } = JSON.parse(data); + const sourceContainer = + viewService.model.getViewContainer(container); + + switch (direction) { + case 'bottom': + viewService.model.insertContainerAfter( + sourceContainer, + targetContainer + ); + break; + case 'top': + viewService.model.insertContainerBefore( + sourceContainer, + targetContainer + ); + break; + } + + viewService.model.setActiveViewContainer(sourceContainer.id); + } + }; + + const onNewContainer = (event: React.DragEvent) => { + const data = getPaneData(); + if (data) { + const { paneId } = data; + const view = viewService.model.getView(paneId); + + if (!view) { + console.log(`view ${paneId} doesn't exist`); + return; + } + + const viewContainer = viewService.model.getViewContainer2(view); + + if (!viewContainer) { + console.log(`viewContainer for view ${view.id} doesn't exist`); + return; + } + + viewService.model.removeViews([view], viewContainer); + + const newContainer = new PaneviewContainer( + `t_${Date.now().toString().substr(5)}`, + VIEW_REGISTRY + ); + newContainer.addView(view); + viewService.model.addContainer(newContainer); + } + }; + + const onDragOver = (container: ViewContainer) => (e: React.DragEvent) => { + const api = registry.get('gridview'); + + const sidebarPanel = api.getPanel('sidebar'); + if (!sidebarPanel.api.isVisible) { + sidebarPanel.api.setVisible(true); + sidebarPanel.focus(); + } + + viewService.model.setActiveViewContainer(container.id); + }; + + return ( +
+ {containers.map((container, i) => { + const isActive = activeContainerid === container.id; + return ( + + ); + })} + +
+ ); +}; + +const ExtraSpace = (props: { + onNewContainer: (event: React.DragEvent) => void; +}) => { + const ref = React.useRef(null); + + const onDrop = (event: React.DragEvent) => { + toggleClass(ref.current, 'activity-bar-space-dragover', false); + props.onNewContainer(event); + }; + + return ( +
{ + e.preventDefault(); + }} + onDragEnter={(e) => { + toggleClass(ref.current, 'activity-bar-space-dragover', true); + e.preventDefault(); + }} + onDragLeave={(e) => { + toggleClass(ref.current, 'activity-bar-space-dragover', false); + }} + onDrop={onDrop} + >
+ ); +}; + +export const Sidebar = () => { + const [sidebarId, setSidebarId] = React.useState( + viewService.model.activeContainer.id + ); + + React.useEffect(() => { + const disposable = viewService.model.onDidActiveContainerChange(() => { + setSidebarId(viewService.model.activeContainer.id); + }); + + return () => { + disposable.dispose(); + }; + }, []); + + return ; +}; + +const headerComponents: PanelCollection = { + default: (props) => { + const onClick = () => props.api.setExpanded(!props.api.isExpanded); + return ( + + ); + }, +}; + +export const SidebarPart = (props: { id: string }) => { + const [api, setApi] = React.useState(); + + React.useEffect(() => { + if (!api) { + return () => { + // + }; + } + + const viewContainer = viewService.model.getViewContainer(props.id); + + const disposables = new CompositeDisposable( + api.onDidLayoutChange(() => { + viewContainer.layout(api.toJSON()); + }), + viewContainer.onDidAddView(({ view, index }) => { + api.addPanel({ + id: view.id, + isExpanded: view.isExpanded, + title: view.title, + component: 'default', + headerComponent: 'default', + params: { + viewId: view.id, + }, + index, + }); + }), + viewContainer.onDidRemoveView((view) => { + const panel = api.getPanel(view.id); + api.removePanel(panel); + }) + ); + + const schema = viewContainer.schema; + if (schema) { + api.fromJSON(schema); + } else { + api.panels.forEach((p) => { + api.removePanel(p); + }); + viewContainer.views.forEach((view) => { + api.addPanel({ + id: view.id, + isExpanded: view.isExpanded, + title: view.title, + component: 'default', + headerComponent: 'default', + params: { + viewId: view.id, + }, + }); + }); + } + + return () => { + disposables.dispose(); + }; + }, [api, props.id]); + + const onReady = (event: PaneviewReadyEvent) => { + setApi(event.api); + }; + + const onDidDrop = (event: PaneviewDropEvent) => { + const data = event.getData(); + + const containerData = + event.nativeEvent.dataTransfer.getData('application/json'); + + if (containerData) { + const { container } = JSON.parse(containerData); + + if (container === props.id) { + return; + } + + const sourceContainer = + viewService.model.getViewContainer(container); + const targetContainer = viewService.model.getViewContainer( + props.id + ); + + if (!sourceContainer) { + console.log(`sourceContainer ${props.id} doesn't exist`); + return; + } + if (!targetContainer) { + console.log(`targetContainer ${props.id} doesn't exist`); + return; + } + + sourceContainer.views.forEach((v) => { + viewService.model.moveViewToLocation(v, targetContainer, 0); + }); + + return; + } + + if (!data) { + return; + } + + const targetPanel = event.panel; + const allPanels = event.api.panels; + let toIndex = allPanels.indexOf(targetPanel); + + if ( + event.position === Position.Right || + event.position === Position.Bottom + ) { + toIndex = Math.min(allPanels.length, toIndex + 1); + } + + const viewId = data.paneId; + const viewContainer = viewService.model.getViewContainer(props.id); + + if (!viewContainer) { + console.log(`viewContainer ${props.id} doesn't exist`); + return; + } + + const view = viewService.model.getView(viewId); + + viewService.model.moveViewToLocation(view, viewContainer, toIndex); + }; + + if (!props.id) { + return null; + } + + return ( + + ); +}; diff --git a/build/packages/dockview-demo/src/stories/Introduction.stories.mdx b/build/packages/dockview-demo/src/stories/Introduction.stories.mdx new file mode 100644 index 000000000..c97b50845 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/Introduction.stories.mdx @@ -0,0 +1,64 @@ +import { Meta } from '@storybook/addon-docs/blocks'; +import Code from './assets/code-brackets.svg'; +import Colors from './assets/colors.svg'; +import Comments from './assets/comments.svg'; +import Direction from './assets/direction.svg'; +import Flow from './assets/flow.svg'; +import Plugin from './assets/plugin.svg'; +import Repo from './assets/repo.svg'; +import StackAlt from './assets/stackalt.svg'; +import Splitview from '../resources/splitview-logo.svg'; +import Gridview from '../resources/gridview-logo.svg'; +import Dockview from '../resources/dockview-logo.svg'; +import Paneview from '../resources/paneview-logo.svg'; +import './introduction.css'; + + + +# Dockview + +
Components
+ + diff --git a/build/packages/dockview-demo/src/stories/assets/code-brackets.svg b/build/packages/dockview-demo/src/stories/assets/code-brackets.svg new file mode 100644 index 000000000..73de94776 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/code-brackets.svg @@ -0,0 +1 @@ +illustration/code-brackets \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/colors.svg b/build/packages/dockview-demo/src/stories/assets/colors.svg new file mode 100644 index 000000000..17d58d516 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/colors.svg @@ -0,0 +1 @@ +illustration/colors \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/comments.svg b/build/packages/dockview-demo/src/stories/assets/comments.svg new file mode 100644 index 000000000..6493a139f --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/comments.svg @@ -0,0 +1 @@ +illustration/comments \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/direction.svg b/build/packages/dockview-demo/src/stories/assets/direction.svg new file mode 100644 index 000000000..65676ac27 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/direction.svg @@ -0,0 +1 @@ +illustration/direction \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/flow.svg b/build/packages/dockview-demo/src/stories/assets/flow.svg new file mode 100644 index 000000000..8ac27db40 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/flow.svg @@ -0,0 +1 @@ +illustration/flow \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/plugin.svg b/build/packages/dockview-demo/src/stories/assets/plugin.svg new file mode 100644 index 000000000..29e5c690c --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/plugin.svg @@ -0,0 +1 @@ +illustration/plugin \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/repo.svg b/build/packages/dockview-demo/src/stories/assets/repo.svg new file mode 100644 index 000000000..f386ee902 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/repo.svg @@ -0,0 +1 @@ +illustration/repo \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/assets/stackalt.svg b/build/packages/dockview-demo/src/stories/assets/stackalt.svg new file mode 100644 index 000000000..9b7ad2743 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/assets/stackalt.svg @@ -0,0 +1 @@ +illustration/stackalt \ No newline at end of file diff --git a/build/packages/dockview-demo/src/stories/dockview/dockview.documentation.stories.mdx b/build/packages/dockview-demo/src/stories/dockview/dockview.documentation.stories.mdx new file mode 100644 index 000000000..94cded4f6 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/dockview/dockview.documentation.stories.mdx @@ -0,0 +1,7 @@ +import { Meta } from '@storybook/addon-docs/blocks'; + + + +# Dockview documentation + +
Components
diff --git a/build/packages/dockview-demo/src/stories/dockview/dockview.iframe.stories.tsx b/build/packages/dockview-demo/src/stories/dockview/dockview.iframe.stories.tsx new file mode 100644 index 000000000..88a53a716 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/dockview/dockview.iframe.stories.tsx @@ -0,0 +1,108 @@ +import { + DockviewApi, + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + PanelCollection, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection = { + default: (props) => { + return ( +
+ This content is not within an IFrame +
+ ); + }, + iframe: (props) => { + return ( +
+
+ The contents below is within an iFrame +
+ +
+ ); + }, +}; + +export const Params = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + React.useEffect(() => { + if (!api.current) { + return () => { + // noop + }; + } + + const gridApi = api.current; + + const interval = setInterval(() => { + const panel1 = gridApi.getPanel('panel1'); + const panel2 = gridApi.getPanel('panel2'); + + panel1.update({ params: { params: { ticker: Date.now() } } }); + + panel2.api.setTitle(`Panel2 ${Date.now()}`); + }, 1000); + return () => { + clearInterval(interval); + }; + }, [api]); + + const onReady = (event: DockviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'ticker', + params: { + ticker: 0, + }, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + event.api.addPanel({ + id: 'panel4', + component: 'default', + position: { referencePanel: 'panel3', direction: 'below' }, + }); + + // event.api.getPanel('panel1').api; + }; + + return ( + + ); +}; + +export default { + title: 'Library/Dockview/Params', + component: Params, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/dockview/dockview.simple.stories.tsx b/build/packages/dockview-demo/src/stories/dockview/dockview.simple.stories.tsx new file mode 100644 index 000000000..d6a9e93b4 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/dockview/dockview.simple.stories.tsx @@ -0,0 +1,93 @@ +import { + DockviewApi, + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + PanelCollection, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection = { + default: (props) => { + return ( +
hello world
+ ); + }, + iframe: (props) => { + return ( +
+ +
+ ); + }, +}; + +export const Simple = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: DockviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'default', + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + event.api.addPanel({ + id: 'panel4', + component: 'default', + position: { referencePanel: 'panel3', direction: 'below' }, + }); + + // event.api.getPanel('panel1').api; + }; + + return ( + + ); +}; + +export default { + title: 'Library/Dockview/Simple', + component: Simple, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/dockview/dockview.tab.stories.tsx b/build/packages/dockview-demo/src/stories/dockview/dockview.tab.stories.tsx new file mode 100644 index 000000000..9f5edfc5e --- /dev/null +++ b/build/packages/dockview-demo/src/stories/dockview/dockview.tab.stories.tsx @@ -0,0 +1,85 @@ +import { + DockviewApi, + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + PanelCollection, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection = { + default: (props) => { + const close = () => props.api.close(); + return ( +
hello world
+ ); + }, +}; + +export const Tab = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: DockviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'default', + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + event.api.addPanel({ + id: 'panel4', + component: 'default', + position: { referencePanel: 'panel3', direction: 'below' }, + }); + + // event.api.getPanel('panel1').api; + }; + + return ( + + ); +}; + +export default { + title: 'Library/Dockview/Tab', + component: Tab, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/dockview/dockview.watermark.stories.tsx b/build/packages/dockview-demo/src/stories/dockview/dockview.watermark.stories.tsx new file mode 100644 index 000000000..49701d32e --- /dev/null +++ b/build/packages/dockview-demo/src/stories/dockview/dockview.watermark.stories.tsx @@ -0,0 +1,145 @@ +import { + DockviewApi, + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, + IWatermarkPanelProps, + PanelCollection, +} from 'dockview'; +import { CompositeDisposable } from '../../lifecycle'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection = { + default: (props) => { + return ( +
hello world
+ ); + }, + iframe: (props) => { + return ( +
+ +
+ ); + }, +}; + +const WatermarkPanel = (props: IWatermarkPanelProps) => { + const [size, setSize] = React.useState(props.containerApi.size); + const [panels, setPanels] = React.useState( + props.containerApi.totalPanels + ); + + React.useEffect(() => { + const disposables = new CompositeDisposable( + props.containerApi.onDidAddGroup((event) => { + setSize(props.containerApi.size); + }), + props.containerApi.onDidRemoveGroup((event) => { + setSize(props.containerApi.size); + }), + props.containerApi.onDidAddPanel((event) => { + setPanels(props.containerApi.totalPanels); + }), + props.containerApi.onDidRemovePanel((event) => { + setPanels(props.containerApi.totalPanels); + }) + ); + + return () => { + disposables.dispose(); + }; + }, []); + + const onClick = () => { + props.containerApi.addPanel({ + id: Date.now().toString(), + component: 'default', + position: { direction: 'right' }, + }); + }; + const onReplace = () => { + props.containerApi.addPanel({ + id: Date.now().toString(), + component: 'default', + }); + }; + + const onAddEmptyGroup = () => { + props.containerApi.addEmptyGroup(); + }; + + return ( +
+
    +
  • + This is a custom watermark for when a group has no panels to + display. +
  • +
  • + The watermark is only automatically shown when there are no + panels to display. You can otherwise add a watermark + programatically. +
  • +
+
{`Total groups: ${size}`}
+
{`Total panels: ${panels}`}
+ + + + {size > 1 && } +
+ ); +}; + +export const Watermark = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: DockviewReadyEvent) => { + api.current = event.api; + + event.api.addEmptyGroup(); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Dockview/Watermark', + component: Watermark, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/gridview/gridview.documentation.stories.mdx b/build/packages/dockview-demo/src/stories/gridview/gridview.documentation.stories.mdx new file mode 100644 index 000000000..790c78267 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/gridview/gridview.documentation.stories.mdx @@ -0,0 +1,7 @@ +import { Meta } from '@storybook/addon-docs/blocks'; + + + +# Gridview documentation + +
Components
diff --git a/build/packages/dockview-demo/src/stories/gridview/gridview.params.stories.tsx b/build/packages/dockview-demo/src/stories/gridview/gridview.params.stories.tsx new file mode 100644 index 000000000..7e5a2259b --- /dev/null +++ b/build/packages/dockview-demo/src/stories/gridview/gridview.params.stories.tsx @@ -0,0 +1,107 @@ +import { + GridviewApi, + GridviewReact, + GridviewReadyEvent, + IGridviewPanelProps, + Orientation, + PanelCollection, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props) => { + return ( +
hello world
+ ); + }, + ticker: (props: IGridviewPanelProps<{ ticker: number }>) => { + return ( +
+ {`The current ticker value is ${props.params.ticker}`} +
+ ); + }, +}; + +export const Params = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + React.useEffect(() => { + if (!api.current) { + return () => { + // noop + }; + } + + const gridApi = api.current; + + const interval = setInterval(() => { + const panel1 = gridApi.getPanel('panel1'); + + panel1.update({ params: { ticker: Date.now() } }); + }, 1000); + return () => { + clearInterval(interval); + }; + }, [api]); + + const onReady = (event: GridviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'ticker', + params: { + ticker: 0, + }, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Gridview/Params', + component: Params, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/gridview/gridview.simple.stories.tsx b/build/packages/dockview-demo/src/stories/gridview/gridview.simple.stories.tsx new file mode 100644 index 000000000..dbfdbf812 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/gridview/gridview.simple.stories.tsx @@ -0,0 +1,137 @@ +import { + GridviewApi, + GridviewReact, + GridviewReadyEvent, + IGridviewPanelProps, + Orientation, + orthogonal, + PanelCollection, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: IGridviewPanelProps<{ color: string }>) => { + const transpose = () => { + props.containerApi.orientation = orthogonal( + props.containerApi.orientation + ); + }; + + const resizeWidth = () => { + props.api.setSize({ width: 300 }); + }; + + const resizeHeight = () => { + props.api.setSize({ height: 300 }); + }; + + return ( +
+
{'hello world'}
+ + + +
+ ); + }, +}; + +export const Simple = (props: { + orientation: Orientation; + hideBorders: boolean; + proportionalLayout: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: GridviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel_1', + component: 'default', + params: { color: 'red' }, + minimumHeight: 50, + minimumWidth: 50, + location: [0], + }); + event.api.addPanel({ + id: 'panel_2', + component: 'default', + params: { color: 'green' }, + minimumHeight: 50, + minimumWidth: 50, + location: [0, 0], + }); + event.api.addPanel({ + id: 'panel_3', + component: 'default', + params: { color: 'purple' }, + minimumHeight: 50, + minimumWidth: 50, + location: [0, 0, 0], + }); + event.api.addPanel({ + id: 'panel_4', + component: 'default', + params: { color: 'yellow' }, + minimumHeight: 50, + minimumWidth: 50, + location: [0, 0, 0, 0], + }); + event.api.addPanel({ + id: 'panel_5', + component: 'default', + params: { color: 'dodgerblue' }, + minimumHeight: 50, + minimumWidth: 50, + location: [0, 0, 0, 0, 0], + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Gridview/Simple', + component: Simple, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { + orientation: Orientation.VERTICAL, + proportionalLayout: true, + disableAutoResizing: false, + }, + argTypes: { + orientation: { + control: { + type: 'inline-radio', + options: [Orientation.HORIZONTAL, Orientation.VERTICAL], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/introduction.css b/build/packages/dockview-demo/src/stories/introduction.css new file mode 100644 index 000000000..128e02003 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/introduction.css @@ -0,0 +1,100 @@ +.subheading { + --mediumdark: '#999999'; + font-weight: 900; + font-size: 13px; + color: #999; + letter-spacing: 6px; + line-height: 24px; + text-transform: uppercase; + margin-bottom: 12px; + margin-top: 40px; +} + +.link-list { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr; + row-gap: 10px; +} + +@media (min-width: 620px) { + .link-list { + row-gap: 20px; + column-gap: 20px; + grid-template-columns: 1fr 1fr; + } +} + +@media all and (-ms-high-contrast: none) { + .link-list { + display: -ms-grid; + -ms-grid-columns: 1fr 1fr; + -ms-grid-rows: 1fr 1fr; + } +} + +.link-item { + display: block; + padding: 20px 30px 20px 15px; + border: 1px solid #00000010; + border-radius: 5px; + transition: background 150ms ease-out, border 150ms ease-out, + transform 150ms ease-out; + color: #333333; + display: flex; + align-items: flex-start; +} + +.link-item:hover { + border-color: #1ea7fd50; + transform: translate3d(0, -3px, 0); + box-shadow: rgba(0, 0, 0, 0.08) 0 3px 10px 0; +} + +.link-item:active { + border-color: #1ea7fd; + transform: translate3d(0, 0, 0); +} + +.link-item strong { + font-weight: 700; + display: block; + margin-bottom: 2px; +} + +.link-item img { + height: 40px; + width: 40px; + margin-right: 15px; + flex: none; +} + +.link-item span { + font-size: 14px; + line-height: 20px; +} + +.tip { + display: inline-block; + border-radius: 1em; + font-size: 11px; + line-height: 12px; + font-weight: 700; + background: #e7fdd8; + color: #66bf3c; + padding: 4px 12px; + margin-right: 10px; + vertical-align: top; +} + +.tip-wrapper { + font-size: 13px; + line-height: 20px; + margin-top: 40px; + margin-bottom: 40px; +} + +.tip-wrapper code { + font-size: 12px; + display: inline-block; +} diff --git a/build/packages/dockview-demo/src/stories/paneview/paneview.deserialization.stories.tsx b/build/packages/dockview-demo/src/stories/paneview/paneview.deserialization.stories.tsx new file mode 100644 index 000000000..c5ac57df8 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/paneview/paneview.deserialization.stories.tsx @@ -0,0 +1,161 @@ +import { + PanelCollection, + PaneviewReact, + PaneviewApi, + PaneviewReadyEvent, + IPaneviewPanelProps, + PanelConstraintChangeEvent, + PanelDimensionChangeEvent, + ExpansionEvent, + FocusEvent, + ActiveEvent, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; +import { CompositeDisposable } from '../../lifecycle'; + +const components: PanelCollection> = { + default: (props: IPaneviewPanelProps<{ color: string }>) => { + const [ + constraints, + setConstraints, + ] = React.useState(); + const [ + dimensions, + setDimensions, + ] = React.useState(); + const [ + expansionState, + setExpansionState, + ] = React.useState(); + const [active, setActive] = React.useState(); + const [focus, setFocus] = React.useState(); + + React.useEffect(() => { + const disposables = new CompositeDisposable( + props.api.onDidConstraintsChange(setConstraints), + props.api.onDidDimensionsChange(setDimensions), + props.api.onDidExpansionChange(setExpansionState), + props.api.onDidActiveChange(setActive), + props.api.onDidFocusChange(setFocus) + ); + + return () => { + disposables.dispose(); + }; + }, []); + + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +
+
+
Contraints:
+
{`maximumSize: ${constraints?.maximumSize} minimumSize: ${constraints?.minimumSize}`}
+
Dimesions:
+
{`width: ${dimensions?.width} height: ${dimensions?.height}`}
+
Expansion:
+
{`expanded: ${expansionState?.isExpanded}`}
+
Active:
+
{`active: ${active?.isActive}`}
+
Focus:
+
{`focused: ${focus?.isFocused}`}
+
+ +
+ ); + }, +}; + +export const Deserialization = (props: { + theme: string; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: PaneviewReadyEvent) => { + api.current = event.api; + + event.api.fromJSON({ + size: 100, + views: [ + { + size: 80, + expanded: true, + minimumSize: 100, + data: { + id: 'panel1', + component: 'default', + title: 'Panel 1', + }, + }, + { + size: 20, + expanded: true, + minimumSize: 100, + data: { + id: 'panel2', + component: 'default', + title: 'Panel 2', + }, + }, + { + size: 20, + expanded: false, + minimumSize: 100, + data: { + id: 'panel3', + component: 'default', + title: 'Panel 3', + }, + }, + ], + }); + + event.api.getPanel('panel2')?.api.setSize({ size: 60 }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Paneview/Deserialization', + component: Deserialization, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light', disableAutoResizing: false }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/paneview/paneview.documentation.stories.mdx b/build/packages/dockview-demo/src/stories/paneview/paneview.documentation.stories.mdx new file mode 100644 index 000000000..f99caba3a --- /dev/null +++ b/build/packages/dockview-demo/src/stories/paneview/paneview.documentation.stories.mdx @@ -0,0 +1,7 @@ +import { Meta } from '@storybook/addon-docs/blocks'; + + + +# Paneview documentation + +
Components
diff --git a/build/packages/dockview-demo/src/stories/paneview/paneview.persistance.stories.tsx b/build/packages/dockview-demo/src/stories/paneview/paneview.persistance.stories.tsx new file mode 100644 index 000000000..73fd07bfb --- /dev/null +++ b/build/packages/dockview-demo/src/stories/paneview/paneview.persistance.stories.tsx @@ -0,0 +1,174 @@ +import { + PanelCollection, + PaneviewReact, + PaneviewApi, + PaneviewReadyEvent, + IPaneviewPanelProps, + SerializedPaneview, + PanelConstraintChangeEvent, + PanelDimensionChangeEvent, + ExpansionEvent, + FocusEvent, + ActiveEvent, +} from 'dockview'; +import { CompositeDisposable } from '../../lifecycle'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: IPaneviewPanelProps<{ color: string }>) => { + const [ + constraints, + setConstraints, + ] = React.useState(); + const [ + dimensions, + setDimensions, + ] = React.useState(); + const [ + expansionState, + setExpansionState, + ] = React.useState(); + const [active, setActive] = React.useState(); + const [focus, setFocus] = React.useState(); + + React.useEffect(() => { + const disposables = new CompositeDisposable( + props.api.onDidConstraintsChange(setConstraints), + props.api.onDidDimensionsChange(setDimensions), + props.api.onDidExpansionChange(setExpansionState), + props.api.onDidActiveChange(setActive), + props.api.onDidFocusChange(setFocus) + ); + + return () => { + disposables.dispose(); + }; + }, []); + + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +
+
+
Contraints:
+
{`maximumSize: ${constraints?.maximumSize} minimumSize: ${constraints?.minimumSize}`}
+
Dimesions:
+
{`width: ${dimensions?.width} height: ${dimensions?.height}`}
+
Expansion:
+
{`expanded: ${expansionState?.isExpanded}`}
+
Active:
+
{`active: ${active?.isActive}`}
+
Focus:
+
{`focused: ${focus?.isFocused}`}
+
+ +
+ ); + }, +}; + +export const Persistance = (props: { + theme: string; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: PaneviewReadyEvent) => { + api.current = event.api; + + event.api.onDidLayoutChange(() => { + const state = event.api.toJSON(); + localStorage.setItem('paneview.test.layout', JSON.stringify(state)); + console.log(JSON.stringify(state, null, 4)); + }); + + const state = localStorage.getItem('paneview.test.layout'); + if (state) { + event.api.fromJSON(JSON.parse(state) as SerializedPaneview); + return; + } + + event.api.fromJSON({ + size: 100, + views: [ + { + size: 80, + expanded: true, + minimumSize: 100, + data: { + id: 'panel1', + component: 'default', + title: 'Panel 1', + }, + }, + { + size: 20, + expanded: true, + minimumSize: 100, + data: { + id: 'panel2', + component: 'default', + title: 'Panel 2', + }, + }, + { + size: 20, + expanded: false, + minimumSize: 100, + data: { + id: 'panel3', + component: 'default', + title: 'Panel 3', + }, + }, + ], + }); + + event.api.getPanel('panel2')?.api.setSize({ size: 60 }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Paneview/Persistance', + component: Persistance, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light', disableAutoResizing: false }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/paneview/paneview.simple.stories.tsx b/build/packages/dockview-demo/src/stories/paneview/paneview.simple.stories.tsx new file mode 100644 index 000000000..d52f341bf --- /dev/null +++ b/build/packages/dockview-demo/src/stories/paneview/paneview.simple.stories.tsx @@ -0,0 +1,145 @@ +import { + PanelCollection, + PaneviewReact, + PaneviewApi, + PaneviewReadyEvent, + IPaneviewPanelProps, + PanelConstraintChangeEvent, + PanelDimensionChangeEvent, + ExpansionEvent, + FocusEvent, + ActiveEvent, +} from 'dockview'; +import { CompositeDisposable } from '../../lifecycle'; +import * as React from 'react'; +import { Story, Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: IPaneviewPanelProps<{ color: string }>) => { + const [ + constraints, + setConstraints, + ] = React.useState(); + const [ + dimensions, + setDimensions, + ] = React.useState(); + const [ + expansionState, + setExpansionState, + ] = React.useState(); + const [active, setActive] = React.useState(); + const [focus, setFocus] = React.useState(); + + React.useEffect(() => { + const disposables = new CompositeDisposable( + props.api.onDidConstraintsChange(setConstraints), + props.api.onDidDimensionsChange(setDimensions), + props.api.onDidExpansionChange(setExpansionState), + props.api.onDidActiveChange(setActive), + props.api.onDidFocusChange(setFocus) + ); + + return () => { + disposables.dispose(); + }; + }, []); + + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +
+
+
Contraints:
+
{`maximumSize: ${constraints?.maximumSize} minimumSize: ${constraints?.minimumSize}`}
+
Dimesions:
+
{`width: ${dimensions?.width} height: ${dimensions?.height}`}
+
Expansion:
+
{`expanded: ${expansionState?.isExpanded}`}
+
Active:
+
{`active: ${active?.isActive}`}
+
Focus:
+
{`focused: ${focus?.isFocused}`}
+
+ +
+ ); + }, +}; + +export const Simple = (props: { + theme: string; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: PaneviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'default', + params: { color: 'red' }, + title: 'Panel1', + minimumBodySize: 100, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + params: { color: 'green' }, + title: 'Panel 2', + minimumBodySize: 100, + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + params: { color: 'purple' }, + title: 'Panel 3', + minimumBodySize: 100, + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Paneview/Simple', + component: Simple, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light', disableAutoResizing: false }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/constraints.jpg b/build/packages/dockview-demo/src/stories/splitview/constraints.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a43a30933c6879ed4668e84e97e4730de71c5d39 GIT binary patch literal 137417 zcmeFZd011~wl5k)jffCw1O*`~C8&t8p(!yYDk>^sR7wyKQi@0?rYuFGge(NPo6TBJk4afDfmFmOwuGHW8+Da zji*eRJQ;jC8GN5K*~X+ra5i6-#lw~2lCab1K+2bOt-O} zJ;!dLv&*8zOWZv?y}n-U?Xz*yX5TGaw*`E&CopJla7e_#$U{-lF|o&vC!9#+o;;Oy zCOsoFEBow)i+{V6U-0AQ!s{iaWjD%i-n#vus=B7O?&pW~Ev=HacIhvVf9>pg@v^(; zRj*v7*1UQ9Zs7gk5cGHF3G-&4#m-Dpcmvs{)hVDenOK!$_?-|I!O%`E3W!P{iQe2dvG8~HEtqDMmT)z4K)QO9? zhrKKB@aNtq`hPP1q*uu#>`ArnyEskFnK9hG zbI5yhRT;bK>8!RZpMOIAt!8+CSn+H267NOim~~S~)<&#dFOD0WSmKv8al>nAew`y9 z5*++?zc{l0LDwfO<5$~<4PtS_LvE#Zsn$(>LH+KXdW$M`c7Je~)8=oD@N?WmT^yFJ zKLItnGnLn=$Zp6qcqourL(vB4{b*XP-ip2N)nn>ex{H$bioDm3HsYmv67Q+ed)kME zwuz@;C)F?V#urg_F zQDA#v6Z#56nucS~6-eyza#U_q3Bg1>(@MEcErlOyMA)OIKZYtx!lMK2c6BEtZ~Jvf zv9XIbaCUD5X^1fU;#43)2;pj537i2>W0>>1_$H`ALOI89ctQ6=T7A3RWwZPCV%>e4 zkxEgXht_H%>RF+xpiKXrJKV~*XvmQ`F2W9v{|?P;SaCy|$beP3U+-m`erqPkfRNpa zS4kRbo2ej8ID=qBiqJY z3$m7d@DQG1%tdW-Rc3MRNs!IFFVY$zeY&5(T3kjN5we)>G89Pj1eN4IK@uZbT!v zWvG1^WqU__e09ZI&qaaVrqi5iwwzgFnc|9177!*!^>gtP6QtD8XlN2}oC@lFsYKXY zp>xEdz=CEX;&L@Jk6M>Gl6VW>fqWj*2HfPC_u#Xxy}yq+Lz(hJ_pdeI!Psi+txLV< zdKFWl>16`xuO7PkZV*O1Jd)yekvg@7AJm)`$Nwlbz6~b4 zANMol!I6Tq><6|v;^n|38)4<;A7X@4A>|LnHin#rIL};tBLBDX&oANjwQF=4>}>Da zOE=o6g7c#|%`4-2>WOa6!Rm*N8LmMokL{L|^nHYhpFS3h#DosAF&Fm8MZE_v0zB(H z)a<=f?1DRBta7eTdwxAx+o=CKuHN15X>IxKux*7WL}ba=*WkK8j;LJeN3Z8E{rT7D z&SokX(ROn zsX9tK2<%s2DC1A!MHq@3{K3`)8S>~BDq${chO?16N&gZoP9IM^k<$dnAu~*~u>sM+ z%=Cohq&7#FPWPt=!WIyJbj!y-u6xn_;#rq3XP|WVJn|bw3S%bJyp%r+vu_3vftU+5 zce1N#seCHVM4n|U6_YV$s}R{k!Cdk#U*)n}#P(g4pK{6TJF4|iYW9@kqOzF${O-UL z=*_*#blVFi^X4!oRYTZ9(MSxMM3@{?iBgzIAhXv>Ef{&Lx4}wuf1sX?cX+1^4RFL- zUo|;Zs@;Ti%UB&ert%eUD#L!Tupn~)JDsF{9kOL=mOTF~-S76D!qV~Wh5Reu8nxil z(Xo*NWI)BjExTI13vlZI!X!OP4flEx(~b2<2;fGx&a6I>?lAnI3ZY2DqI7)?SR!=e zaU5#i&9RCNkmDTeV10jX+}g_5f7?L3dTm@f^(y5nLm|VP8zR+-3}=|pGI=I3-9c}{ z?P_B`xLc+V-pAvh;tF8+Glna8qDpp_KOd_^)=0&sNUcckMLerNQK6)qVNW8cam5Q> zRIfQ&UR!h(>+W>hY_>+yJ+KuK>WBuT&tTd??aV6SNUxraDWu*4Etv4+->^$+A-34< zN>7g1ndgc5=-I?G{z8;JGN2E@E^1%_{isp~&Shd}wahvgD^k;%A%_tByGI=*9iR4k zG$!rB^s36Z_WY2jUh(2BZYj(=@_#M_{m(%0FTX-4@=zrkclT`-nRAT^OCjbnK~hl- zSD6P#^MrE6DB=!Lz25|>#Z5=iCR_b7K{}%$X1U<=*?rLABEmw5ZDFdM zh+j~$E=XryYBc)kFXOloLdLDD2>%|H%pjZ~;g*RLr0^oW{d2P7uYce#NBQTxX@vOV z)?=FuS@iXKGn~`ORF>4IiwpF#UxQ`VOpwwaCnwzIZRq$m4M0R&+$aJ0_}dHdEINN} z?MMESR%LXMev0&`KitH(uGocboJnbX|Cg1N@f%8CriznCEa%xGL1zeuXf|@5o3_Ou z0-?27VO?X!)U$j$88Rj7w4$zOqze_P^B?Id6L)qkEdyp|s|s4d^SK53m8O?Hayfb@ zy?tvvU!*oQtlHK{8Yljb7jKN2Ai`e8*BWxgOZXDDJ$(u|WRuWCLM5lyHXIm^GeI(q zYx6EY$7wL$57rQg??Y^=luTw@eVjC@)KI5Baz**no3>Ee_wJEk`^6RETc(j;|Fr`c zeUxg$P%n+3S(XyM78B^b_|JlbEw5_f;25^L?4Ixwlb#-pc5n=oJ(JQjhpiX zE6_O5f{}p?STzf|aqBMD3s)cS6Kc;OebF|2f1)Dp=uGnSzkcLD$G!eJpv(;1 zN(IlvWbOR<&+&!I36e?lsk&@DNDW&Jb=y%g@D-}YsV$m4Jv<+^L*kyFt2;l1Q8smI zm({q12EMpkdB=U&G%n}KldO2vg-s+*dP9IpFc*tzCEO8K)+g$0?wYpxWtY{g=~z{Z zTr5;mW?)6F^{;>O&dU{Xp|H*)%RV(mZF*U)&q*?@`ljpd-NT%bfsCQV7cc-C`Np{-lM!A`DVzkDb%Fre~ItN1DW_NPCL8yi<`f) z)%4`R%Hoiz*VKYO)2+an!X`-5GdFbNG?i?QLXiw>d|NA5NeSPKhEOwUW(}>1M{7hY z-@x*j@GDi_1)?inTUoV;{66_#3MGx6V2aRsq$d?;tJlodz7->2s-F!XT|F5(HyQWEqgMm^}qn-Vv`gT!9Zf z8SRad*g?(N`~^HCr28S7wAoPFu;~Ub5X)A{(rV$E3@Z0yFv_SvDw^y0m6}nT_ooCI zVk%d-0liy7Ngb#YqZGl?gf)+b-6k84DyHyzgvf468nrHQ>asC`iZcUh_JR+MrckHeKy&bg&zW(e zY{yk7t(_vTXze%dxZ2I3b5s+gnY@+QW$-W~-puE`=+R|4Dl=-kT~sa}c_Vgx6k3pZ zJk+boJB7SS18hZ=xG{BfLn@>!?YF>=s=kIJnCF07nls`B== zPTM-&6=(Zr_8iX*@bB<|$hZ}D{-%`N)^So<$=ThFlU=cr)^7O>yYO4|b+bTlkDnmf z6E751qxdX8&5lc3%(^1gj=l9@eDcQ z$^2jY?RsDkCtnpwsWZRrpoiVS6fFv4I4YQ!iJKcP^XI)sG0u9#H%rsw+oG899=2*= zm+a+EYBBSZggc452r71jGMnq2M6| z)vv=UX%?}Nc+Q{4lH2YvTxmF_garLIAiY#6opY6()DTwgJWN!AJqqe-V4~K%P2C^^ z=GYd}(#nx%0`v1F+&kR!3%i=UVH2o1l)s7#>*g8GK+(NoOMESo*(MZ#Qj?uJK|)x7 zys&EWPM2o!HmTTCV?$(GFEzWjOHDjN6an|UKP3$=yTCD(saZz94;R?I&ik?coQ<7U zkQMSQ<}QgbX1G2<0+8O3M>YHmGUQKyq@ZSgqD~uPm>BNW(BxvN+NS1?e0U{R(RvH9 zS00C~>8>tmM-JCiI5@wo@juv@nKiYpWH?o`eMw=WF0!+zoP?J>0=78^X3lWpeGUG5 zhIr02B4!cI-PEbDQV0Qx;1-fML0X4ZQKc@}B~;&}co3DF0O~^Ju*?MegJ#NGjoRX_ zl@9Y5Zs;~{+72{Il5}O;Gis)IDsneF@(%YWV=uKxTc;1hS(uf6KEIP)!yGBmPvva~ z4-6yv6|rsUJ6WCr~mO zU!%0vWTuMNhcB*t9TFVPU-DwKVKwdSJQ7hD{nudQqlTDXf(mujhT;j*x3WBi?F4DR zFujgy2gP!x0bq0QOGrgJd%y|I7B6P0*;+6Gm_lEn;n13jDGgn?@7)Pf1kby>Axu=K zOZc7Hn_cEvmH2M&;MlIO$?w|Mfcfbs$52i9J^Em7 zlnNe+x*8{(&Q#H{DDtZsPCB*5wwakFW&-1%85(Z?4)=ISG$EWbJfAx!b;T=wu6@Y_ zJV({1;2MX(5AE%5j6XrTIzzE|Id2EpOTY&;J2Sj6Y74awG6lzjm;N=_ex)Bg62=bc!hO^%tzz!5_mRvuT;HudcaO`!!()b*502Bl?9QyC zW(5iFxo82WVoS*RR19!)lk*UoR-q5ak6<yPa4c3aB;GFhecE1#36SHV76Qs;m?QZNK)Z(h%`>E&^FF4ld^PwF5Z2s%Q za@>+dn2dslRI@V1>sl(n5@zt65I;~tp-KMOdE~-7aQJLT^w$OtvB6|0^!a9jv$&5- z9%DZ5`;Ptr)#kK2nCli4PQ$&*;)>^W^L&rZog~?2Gz#&f|1}feS$yy$~Hp{p!Usx)mx_jplaBbUV-*IGY!5o9q7cn6g~pA;Nqc zY*BJsz6IAuLZx_weHF`C+W7%rvoMXc4-3%GAv*bX7^s4$f=E{$f^l?iWZhSWGYlqg zj-gxxtCl0PWVkCWJKWRo6El)!#Eoc$BCFBuW5uh8E;Oo@V>ig|qf#pI;H$yV0mGx6 zFWuZ<`)+N3N#j1c5W`Q5Rrr@+Q3Ccm2#S`?0VR;VvPbI*vKHndzJvs{GXazj*af@@ zI5hmz8cDmpT&Oagi{2 zsgEC2AbwhMQ@*=|rIrB|b4bL2W%J7W$?k;>9wYhvl%Vc~2jsz@|-kg*c|#&Jr|n~r$g=_dE= zTKg7;$@2!YV;bhHwZHW*LcJuR6moP2mhctnlQ3n1bbnMkM=5)iNSKn5BnfN|P7dFR z{{pUI;`HquzabJs^nS-pLG!NzQV&5J<1aA!6J z1ThsQO?RkUY#N3ixky;X!LypdHqC@utT-y#%&m1T{qwpNfGE?`7u0`z-Rt%Xd9>!Q zLm8h3HGc!eu;o-8(~!nk!|z}}C}?qo1XL>D5&9B9&zP$Gd(s+?YB2g9fa3vp%`BdZ zvM#G=8RPlqHU6P`N;BUXwavEG+wZE=8^0gEHN-e_DJpsLRqEA$S&wG&~49vJ;qD3hT-vN8Ck|q2?{jSeX&#vpuhC8+uoG zqj!*)i*PcIQ_KcE0|NuQyH5pPjEuM5e_#%293~tR^wXgZvkB5~mr>B1DmEigkzvuR z03wS+9F(17;z%?Jgq$#bi|~^V^wF8OACP2efF$!C)`4xjZa+b~yh=lvAkpneOjQs2 zUb$hW0)Gsg?oZ`&qY09Ey&;|XK4XIPZaW5`i)?BN1xx4|Sv*17=ruuF8P!fDxbA?8 zy9@7Ujn9YwyvSHSLHgKy)%agKGx8aJ7xO^@ZdtCQV@?{5+)H;BOFF8gr3uYp6N`ojKlu5h|&!HnAIyo~gmT?QVW4Y+Ip?8XH zD2M=Qx&VZl^Xajh2itDQF8-ZR&76uAv624D$fU?)@h8h-dult|0|Qbh^8d<1;h?xl ztt5IK8Q>KnnqWsbP6%R)nLEG^j@}sHg{D8!Q&iozoNLT7vtW>CJCI>je)+&-)%znJ z>BKJ`c+}0f`^kB>zsV2A9j$%w>{p|4>c5KZ|3WfZu>i@W_WC=?Gz;V}Kr$WN`Ts^T z86latwM=&lE7x0nAvBmVvQ**Z8j5_Cn$ya}K%If)^6Wa*=-e@41=w+!dLTtijbm&K zx9a#jI@1ex>ZhXN73y11)u*Dyd+)#Z=sACI*^&Juz4!|`W2~fLi=*%&QL9kT1e^2K zDADMp^SVlb{|jSeJRp!iQd2-LLZq}6@J{O82-%4VQVmNQZ%SBju=V^&uXzE8uz3sp zq~Vr^Wggw{@{!?;y=Axb+kttpo8^Km-XU0i7OG{pR;ct#W4$Y{k*Gd@U3vdyIsV^! z^Vs-64&6<4`O_M|`{c|9kNCTB-X|_Hvl8^B7yQB~J{iQje*e(D5Azlu zOxu1hG^h8%YP+xJ?8+h~X3+tWVG<%|b1NjLC>e)EpIz75wSNRXQ{i=a|Im1v_uiPm z0=r9X)j@WbJ~~xiIk#*qXldU3>|cK%eO+m*DQ~7(K2c4huR(KEhhU~;vB!@*WAhx; zv?b(@`0Ik!bA#&H4f7rHL~F2o|0$aD9)IiDG#nFeUx}ntkc`?en(iW~vJPOEk7;I? zU~40gVGUV8SoE=RKeW7M*pD?AZiOkmSWyUCo<4vm^6;$=!i+Z^Z(i0Im2n?7tkN`6 zcOdVoZgESR$ETdLU@a$CVL@%hHfT@gC)fsak%+0NAU)y9vBc|GQA_=^D{3lb*yeih zJTLF?s?y(I57wvuT)24us*rt8XXh_=dfhmiWS;sTq~5>>dax>#X&KXR{s^UIYI$LI zV#ZF@o>ztDM(s$G6yCU0{-BH~FOUBI_q*lE<-Kc`g!PApJc&R2TZMbp7Hgvd4K$i!Vl@!=d54IO<_$qwE;&d=l|#xU-4@5ERC za-{NYegiM5d*n#-JHlJgx2ldIW%MlQ$EjIU{0=eX)=wzSyiFMUbu7bjiK%curf%I{(OP z9m1XGNsLQfI7itS0-4JP`7}gamH_%M6gY?O5??+%?*E2xL8@cQe<2nkBc5a5Z>{7e zJH4#FMGfu>9N6*Ai%&YQ`JDK3DGr^gdNmRu zD8*IwneA+(;y5*zZB`@5QXpCTqIYqxQ)WRe7UfvJMxsD+Wva_c)Y^MM7o|H`Xx$Mz zcwElQ{%)NI!;JreTIH*qLp%HJm&z|%a9ZdvfUJFEmzcXB^FTRGRI9fL|JwIGi{m5I zKjIc@v!gikSzSQ+omG70zVF33Ax?_hjbr zlF%e6a|Z5GNjzoGwwEv`)A!tx1HnTGE0u1nqS!zGF1_67HsN+WZz*n3mjs_1zmblPsdk9U zc?)XJe(-1b3A4xQp`2xI4aOV?e0MLs-?dUbbpkON`(7#u5oYmMVy4rT>`T8#2{0QfA^;4e^Ec04i9bwTq!lT`2TUMfW zeWX2Lnrzv=dfDg2Zj~LSB!?Z1XoM;%oo96eL?~YgoJrVYNACbjyBW@-#^GO>GidS< zjQqrosgFv9t9U^-V*|%$jp5FA`Bf!@gpJ+}hmjxHvGVvE7j=(vhWEZDsl+b)m((h9 zGZWjI+0KzOm0m4OY(piFmaL&+!3tZ#5d$g6l{VMEqK~`eBk;vb+{~>+a}Am<&HOwJ znf@LNAIy>y`)CM+2G19Es!uN>L$?KXQ^0t1l zWG1z(a*1wejs04ds%WTqX${*kW-PI@Eh_$`D&lq@E8(jX=$4P(*GS|1|A>f-{*wCm zpL~;fk%qa_S_EeSHAV7~JP1?|%_g;Wf=^XVzMjGfMDBqP`i?s~yS3u3a{I4)U z3rqzzjt^OUr}8sp1Wu(I-)Ug3t@(Ydw%&iBeeb}}7hCH@kvF#+jghsdlghxs`G&b) zhAot~DKdo9YbZI)>4ZBW|3Z$93aFO&6mx+~&L@RAZvkULQ6TncKWf?S8WH7{j+@PD zuTTlHR>pd2HvKJx-OHA`m38?nA~!)Z!L$m;Gc$2O=u9z2nJw@uv7!~WIxfSOPLM`U zqcq*Fo(2l?ed`94lPR8zaisA5#B3gwZMkwT11%J8EW8Ywrx!RN@Pm=edQzg zwBsT}enV0z*Gdg#9Zv9D{HbCzgIItz6gpoj9g?3}6@99Qm*{MRJsGO2sp42?H!_YQ55s+CvI4~~s*5O@I>x-lyq@(aHD_V>@%YdU7dIj8Wq11J!}3U7 zdV;lGjrcm14rWo44sCfOF2U_7Re(^TiTNLvu1Z zaX&o;U%;4$tpS^3(sO(*qdBmz%~R}*UDB`TYTEer=)$LszZdQ)Z%#XQMTAa>n4X%IF`4?Y0@<&8b7LjQ<$ZZ3Ls9AP7rx5`bWktw@fN_xKwmX2KJZBv*XXWBUgNMTzj76So{ye&W8N$oIpwjoj} zv*Z3a7{F!hZD6S#eAjiQFdD(gtB5BPBnQw^kUO>YJ7cJxfp0(()5L4|GPx)Va82{? zJU*s2rM>deB|J1-Bj(}05azYNm75k0@DebH3C1o9yac+zbaBjf!r|_idt? z556%Tw?KoyAq}5~%34Mf9s!%WE9-wW(Hc!2#Lvmz?yFy{ViqlRdW{=5aW<|Y{WN{zmVsK3NrcgcuX`o z`vpihG?Ss)LPaKheYt6NCI5A4Z1+n4nB+KJ&PkP3->>N91qm}w6q5R%H~3uTUT@V0 zwT8SCsNHDV!aSh?1f&xoHJQ4M^U%?<*lyihHi z)-R1Uy8oXlD{>PR38ekG2?#H$h~JELpm*P$faR{E%6zpa0g3kOco1$WBc>(X9#j|+ z_IojbL{UQnZ?%fu&|E>rox}8_nzg37bN8Nq;s^>^=kT})hq|-8;2U_vJ=F6dRT4*; z87og0o_*VB>s@VY>zThQl*IoLFqUI2qSI_7Oz|pjKq+b!7~>16*6_EKJ{LevTDSoj zYS0E`N0G+ON;M|o^a812m@vy-VfHGfHbjU!6&Bx5K3euPVe&<}iRJ9ly$kX@NVpdw zN@;LG1BhvV0`@Wii`2Y!X3pf=s;T(gWjrel+g!HxWn+03K3^@659nTX(EU|UH~6it z{E$~5dS6#3-+XJvDoKxbg7)RZ^MSjgjdc(x=ocb!Ixg_FSKt`heio#_CWJjcTZ}zK zMv3V(q(mKuyCJL$d44;CAT_5V7Ti0;*o6e}h zqtQ;AH?5=m%E|6Gdrm9>qb_Ae(=z*A&JICl+)=_j02QS1e5T}TyDuksW~w1<@e$$m z*bX39-0hQ8{(9^F*KrNgh z-BpLYYn)XqDwD=1N5s(QQP*G-q$aT~7O!DqYpPVXEfD#=cp5STLRg|yg5E(maIH3{ zZ9pnv0pY@Lrq+0K6%sqIGspK zX|Vm4N+y1T?q`ma0CCskUx6=tSbvLpOnN(f|`Cgzj` zA@z5BA(EKlVfxxTRAG#9RPDDPU}?>#eAA;k4>x$JL!XS!9GuxZGdSHuf@L?3Fx5+%%gbtC8R#)Xu9mh>dn=T}znj4%kgspt>ex7Drf>C3lo zB|WybR!_d_@^gB;G;id$b&SD(hC;ji=I>7<%N60FF+GKiZDm)UJ{4aqX9#Vs-S(eM zTN;vZuCPW|P$oT@w7{*VYA7WCN_lB#NjN(sG<%s7iP#5PXW_2ERE@+hjwaYBQvzX5 zWQpvo0%>59W81SN!?xmz=hEowi z`tcmo$_?D5Z|=d~yzfGGoPSRK9YTCSyNX>i(8NANtrj&a;$#QN6N z#MR|}QxlrKVMC9ZbXS)={Yl2 zm>TY4sDIbZ+j{H$R;BE0kfS@6jI`>gonrEPdFDtBx=I(0ZcbO}M=3*cuRQmhr%WHD z7LL-q=Cpf-FX}v^UB?LNf}>>QXeP3Sin%cJa9^}eGnPSj0j2KC4tpuF@C6i2vx{a} z1Npcs3tKFe3Nu1rNpwQem5`ooSYq~&7{1pyaMmcl1P z2H&19Tei*v$VMnv;J7QtG(7;p9HI)m;gK4pGghScZAR+a5S}^0(v6+LS4^!$nL9g| zxhtm1fWBVCM&R^2$FJCiKC14i5orCP?Y7>5mruq-u8Os_`QaBM`~&fuw+n9Vs`SFG zI4x{s2ged>HWAafil&eFBs2(MyK^CkK@5MJvz7nVu)?M~_c;C?deN6D`SZiKMbdCL zG&AS3J^=>B@XiNP~UTO&#{oq)<2ZI$ zdw5sO(-&R^>!>%XNju4HRAjfvp8H58!mWyQ1}qoE3&|;IS_8n2uS#^c(7IG!m}+?N z(^IIWe;Fcbf*pp%_NZg#tx)fMfSt*_^C~#@ROIJJrMiOJd;2yHe-*oqtXZfXmCAbS z)NI^hSyu}aM3ZQR+_s%rT~nYvkEW?}1?{6}0X0KzV^Uv1&8zSLK!S~euu=4h z?mjAQcYt)bp{T(hO??vFiQ8+Qdg=CIAJtC-n(IfKlU(DHeU-ME#2ntY9iQ1#Kp5=m z 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 literal 0 HcmV?d00001 diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.css b/build/packages/dockview-demo/src/stories/splitview/splitview.css new file mode 100644 index 000000000..a3f74be35 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.css @@ -0,0 +1,74 @@ +.markdown-line { + padding-left: 20px; +} + +.indent-1 { + padding-left: 40px; +} + +.markdown-highlight { + background-color: rgba(30, 144, 255, 0.1); +} + +.sash { + background-color: orange; + position: absolute; + top: 0px; + width: 4px; + height: 100%; + z-index: 2; + cursor: ew-resize; + user-select: none; +} + +.debug-sash-max { + height: 10px; + width: 1px; + position: absolute; + z-index: 999; + top: -10px; +} + +.debug-sash-min { + height: 10px; + width: 1px; + position: absolute; + z-index: 999; + top: 100%; +} + +.debug-sash-text { + height: 20px; + line-height: 20px; + width: 80px; + display: flex; + justify-content: center; + position: absolute; + z-index: 999; + font-size: 14px; +} + +.sash-container { + position: absolute; + height: 100%; +} + +.view-container { + position: relative; + height: 100%; +} + +.view { + position: absolute; + height: 100%; + background-color: dodgerblue; + z-index: 1; + top: 0px; + padding: 10px; + color: white; + box-sizing: border-box; +} + +.sash.drag-sash { + background-color: red; +} diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.deserialization.stories.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.deserialization.stories.tsx new file mode 100644 index 000000000..cbdb3bfb6 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.deserialization.stories.tsx @@ -0,0 +1,122 @@ +import { + ISplitviewPanelProps, + Orientation, + PanelCollection, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection = { + default: (props: ISplitviewPanelProps<{ color: string }>) => { + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +

+
hello world
+ +
+ ); + }, +}; + +export const Deserialization = (props: { + orientation: Orientation; + hideBorders: boolean; + proportionalLayout: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + + event.api.fromJSON({ + size: 100, + views: [ + { + size: 20, + data: { + id: 'panel1', + component: 'default', + params: { + color: 'red', + }, + }, + }, + { + size: 40, + data: { + id: 'panel2', + component: 'default', + params: { + color: 'green', + }, + }, + }, + { + size: 60, + data: { + id: 'panel3', + component: 'default', + params: { + color: 'purple', + }, + }, + }, + ], + orientation: props.orientation, + activeView: 'panel1', + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Splitview/Deserialization', + component: Deserialization, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { + orientation: Orientation.VERTICAL, + proportionalLayout: true, + disableAutoResizing: false, + }, + argTypes: { + orientation: { + control: { + type: 'inline-radio', + options: [Orientation.HORIZONTAL, Orientation.VERTICAL], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.documentation.stories.mdx b/build/packages/dockview-demo/src/stories/splitview/splitview.documentation.stories.mdx new file mode 100644 index 000000000..45e2cf62e --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.documentation.stories.mdx @@ -0,0 +1,349 @@ +import { Meta } from '@storybook/addon-docs/blocks'; + + + +import { Splitview } from './splitview'; +import VisualOne from './visual_1.jpg'; +import Contraints from './constraints.jpg'; + +# Splitview + +The splitview component is one of the libraries key components. +The paneview is an extension of thesplitview, the gridview is a collection of nested splitviews and the dockview adds tabular panels to the gridview. + +You can view several interactive examples of the Splitview component in action here, as well as read a description as to how this key component actually works. + +# The math behind the split view layouting + +The below is a language independant walkthrough of the math used within to layout these panels. This is the end result and below will explain the steps taken to reach this point. +The origins of this logic stem from the VSCode source code found [here](https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview). + + + +## What is a Splitview? + +> A Splitview control is a collection of _views_ stacked either _horizontally_ or _vertically_ where each view can be indepedantly resized by dragging on the edge of a particular view. + +To explain how this works will require some better definitions so lets start with the two fundamental components of this control, the View and the Sash. + +Assume the Splitview control has n views where n is positive number (i.e if n=4 then our split view controls has 4 views). A single view can then be defined as + +
+
View
+
    +
  • + The size of the nth view will be known as Vn +
  • +
  • + The minimum size of the nth view will be known as V + min + n +
  • +
  • + The maximum size of the nth view will be known as V + max + n +
  • +
+
+ +Additionally by definition we can known Vminn <= Vn <= Vmaxn + +To be able to resize a view you need to be able to drag on the edge of a view to increase or decrease it's size. +This can be achieved by introducing a narrow component that sits between each view acting as a _drag handle_. +Lets call this component a Sash (see [link](https://en.wikipedia.org/wiki/Sash_window)) and we can define this as + +
+
Sash
+
    +
  • If we have n views then we will have n-1 sashes. There is no sash before V0 nor after Vn
  • +
  • The sash between Vn and Vn+1 is known as Sn
  • +
  • The sash is of fixed width, and it's sole purpose is to act a drag-handle for resizing views
  • + +
+
+ +To calculate the new view sizes after a sash is dragged we need to know which sash is being dragged. +Lets denote the sash Si as the sash to drag, which will give us a set of definitions to work with inline with the below diagram. + + + +If we are to drag the sash Si then it's also needed to know how far along the x-axis, or the y-axis (in the case of vertically stacked views) you have travelled. +Lets denote this as the delta, using the symbol Ξ”. Delta is only limited by the width (or height) of the control so in it's most general form we say it ranges from negative to positive infinity, that is -∞ < Ξ” < ∞ . +In reality as you will see we will apply a set of constraints on the value of Ξ” reducing it's overall set of valid values. + +This defines everything we need to describe the definition of a Splitview. The first approach to show will be the most native building the complexity after each iteration. + +## Iteration #1 - The naive approach (aka. the accordian) + +The most basic form of resizing may be to say as I add delta increase view sizes and as I remove delta I decrease view sizes. This could be further described with the following statements: + +- As the sash moves left shrink each view to the left and as the sash moves right expand each view to left, from right-most to left-most in both cases. +- If there is enough delta to shrink a view to it's mimimum size then progress onto the next view, and if we have enough delta to expand a view to it's maximum size then again progress onto the next view. +- Shrink no more once everything to the left is at minimums and expand no more once everything to the left is at maximums +- We don't manipulate any views to the right of the active sash Si + +You should be able to show each of the four points above hold true for the below interactive example. +You'll see that changes to the right will always remain at zero because we are not manipulating views to the right of the active sash. + + + +Putting this implemenation in psuedocode using the definitions from above where we drag sash Si by an amount Ξ” + +
+
+ Ξ”remaining = Ξ” +
+
+ for + + (j = i; j >= 0; i--) + + do +
+
+ + Vnext + j = Min(V + max + + j, Max(V + min + j, Vj + Ξ”remaining)) + +
+
+ + VΞ” + j = Vnext + j - Vj + +
+
+ + Ξ”remaining = Ξ”remaining - VΞ” + j + +
+
+ + Vj = Vnext + j + +
+
+ +and as instructions + +
+
+
1
+
2
+
3
+
4
+
+
+
+ For each view j to the left of the sash we have dragged, from + right-most to left-most +
+
+ Add the delta to the view j (clamped at either the maximum or + minimum value) +
+
+ Subtract the different between the new and old size (the used delta) + from the remaining delta +
+
repeat
+
+
+ +There are some obvious flaws with this approach. Nothing to the right of the active sash is resizes which also related to the fact that the width of the control does not remain constant. + +## Iteration #2 - When Ξ” is added an equal Ξ” must be removed + +For the width of the control to remain constant it would make sense that if I add Ξ” to the left then I should add -Ξ” (or remove Ξ”) on the right, and vice-versa, which is the approach of the below interactive example. +As you may see it is right, but there are still some edge cases that fail. + + + +To write this approach in pseudocode lets define another variable to track the delta we've added on the left, Ξ”used. +After we've applied changes to the left side we'll substract this Ξ”used from the right side with the aim to keep the width of the control constant. + +
+
+ Ξ”remaining = Ξ” +
+
+ Ξ”used = 0 +
+
+ for(j = i; j >= 0; i--) + do +
+
+ + Vnextj = Min(Vmaxj, Max(Vminj, Vj + Ξ”remaining)) + +
+
+ + VΞ”j = Vnextj - Vj + +
+
+ + Ξ”remaining = Ξ”remaining - VΞ”j + +
+
+ + Ξ”used = Ξ”used + VΞ”j + +
+
+ + Vj = Vnextj + +
+ +
+
+for({"j = i+1; j < n; i++"}) + do +
+
+ + Vnextj = Min(Vmaxj, Max(Vminj,Vj - Ξ”used)) + +
+
+ + VΞ”j = Vnextj - Vj + +
+
+ +Ξ”used = Ξ”used + VΞ”j + +
+
+ +Vj = Vnextj + +
+
+ +Go back and try to minimise or maximise every view in the container. The width is no longer preserved, you can see at some point the change to the left +is not longer eqaul to the change on the right, which causes the container to once again flex. + +## Iteration #3 - Constraining the values of Ξ” + +The failure of iteration #2 can be explained as the addition or removal of too much delta which means we need to look at what constraints we can apply to the problem. +For a sash Si think about the minimum and maximum amount of delta that can be both added and removed. + +Minimized view constraints + +- Si can go no further left that the sum of the minimum sizes of the views to the left because you would then have a view smaller than it's minimum size +- Si can go no further further right than the sum of the minimum sizes of the views to the right because you would then have a view smaller than it's minimum size + +Maximised view constraints + +- Si can go no further left that the sum of the maximum sizes of the views to the right because otherwise you would have a viewer larger than it's maximum size +- Si can go no further right that the sum of the maximum sizes of the views to the left because otherwise you would have a viewer larger than it's maximum size + +Since Ξ” is relative to Si we need these to define these constraints relative to Si. + +When the views to the left of Si are all at minimum size define the distance between here and Ξ” to be Ξ”minleft. +This distance would be the sum of the differences between Vminj and Vj for each view: + +
+ + Ξ”min + left = Ξ£ Vmin + j - Vj + + j = i,...0 +
+ +Similarly we can work out the distance between Si and the point at each every view to the left is at its +maximum size as the sum of differences between Vmaxj an Vj + +
+ + Ξ”max + left = Ξ£ Vmax + j - Vj + + j = i,...0 +
+ +The same logic can be applied to work out those values for Ξ”minright and Ξ”maxright + +
+
+ + Ξ”min + right = Ξ£ Vj - Vmin + j + + j = i+1...n +
+
+ + Ξ”max + right = Ξ£ Vj - Vmin + j + + j = i+1...n +
+
+ +This leaves us with two minimum constraints which are Vminleft and Vmaxright and two maximum +constraints Vmaxleft and Vminright. +We can reduce these down to a single minimum and maximum contraint by taking the maximum of the two minimums and the minimum of the two maximums leaving us with the following constraints: + +
+
+ Ξ”min = Max ( Vmin + left , Vmax + right ) +
+
+ Ξ”max = Min ( Vmax + left , Vmin + right ) +
+
+ +Given these constraints we can clamp the value of Ξ” to be within this minimum and maxium boundary. +This clamped delta can be used in place of delta in the pseudocode from Iteration #2. + +
+ Ξ”clamped = MIN ( Vmax , MAX ( Vmin , Ξ” ) ) +
+ +You can see how this works in this interactive example which also visually indicates this boundary conditions. + + + +For a more visual explaination it's worth studying the below diagram: + + diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.params.stories.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.params.stories.tsx new file mode 100644 index 000000000..26edf2b2f --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.params.stories.tsx @@ -0,0 +1,107 @@ +import { + ISplitviewPanelProps, + Orientation, + PanelCollection, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props) => { + return ( +
hello world
+ ); + }, + ticker: (props: ISplitviewPanelProps<{ ticker: number }>) => { + return ( +
+ {`The current ticker value is ${props.params.ticker}`} +
+ ); + }, +}; + +export const Params = (props: { + theme: string; + hideBorders: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + React.useEffect(() => { + if (!api.current) { + return () => { + // noop + }; + } + + const gridApi = api.current; + + const interval = setInterval(() => { + const panel1 = gridApi.getPanel('panel1'); + + panel1.update({ params: { ticker: Date.now() } }); + }, 1000); + return () => { + clearInterval(interval); + }; + }, [api]); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + + event.api.addPanel({ + id: 'panel1', + component: 'ticker', + params: { + ticker: 0, + }, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Splitview/Params', + component: Params, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { theme: 'dockview-theme-light' }, + argTypes: { + theme: { + control: { + type: 'select', + options: ['dockview-theme-dark', 'dockview-theme-light'], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.persistance.stories.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.persistance.stories.tsx new file mode 100644 index 000000000..d3b1cabbf --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.persistance.stories.tsx @@ -0,0 +1,138 @@ +import { + ISplitviewPanelProps, + Orientation, + PanelCollection, + SerializedSplitview, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; +import { Story, Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: ISplitviewPanelProps<{ color: string }>) => { + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +
+
hello world
+ +
+ ); + }, +}; + +export const Persistance = (props: { + orientation: Orientation; + hideBorders: boolean; + proportionalLayout: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + + event.api.onDidLayoutChange(() => { + const state = event.api.toJSON(); + localStorage.setItem( + 'splitview.test.layout', + JSON.stringify(state) + ); + console.log(JSON.stringify(state, null, 4)); + }); + + const state = localStorage.getItem('splitview.test.layout'); + if (state) { + event.api.fromJSON(JSON.parse(state) as SerializedSplitview); + return; + } + + event.api.fromJSON({ + size: 100, + views: [ + { + size: 20, + data: { + id: 'panel1', + component: 'default', + params: { + color: 'red', + }, + }, + }, + { + size: 40, + data: { + id: 'panel2', + component: 'default', + params: { + color: 'green', + }, + }, + }, + { + size: 60, + data: { + id: 'panel3', + component: 'default', + params: { + color: 'purple', + }, + }, + }, + ], + orientation: props.orientation, + activeView: 'panel1', + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Splitview/Persistance', + component: Persistance, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { + orientation: Orientation.VERTICAL, + proportionalLayout: true, + disableAutoResizing: false, + }, + argTypes: { + orientation: { + control: { + type: 'inline-radio', + options: [Orientation.HORIZONTAL, Orientation.VERTICAL], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.simple.stories.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.simple.stories.tsx new file mode 100644 index 000000000..7f1270978 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.simple.stories.tsx @@ -0,0 +1,110 @@ +import { + ISplitviewPanelProps, + Orientation, + orthogonal, + PanelCollection, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: ISplitviewPanelProps<{ color: string }>) => { + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + const transpose = () => { + props.containerApi.updateOptions({ + orientation: orthogonal(props.containerApi.orientation), + }); + }; + + return ( +
+
hello world
+ + +
+ ); + }, +}; + +export const Simple = (props: { + orientation: Orientation; + hideBorders: boolean; + proportionalLayout: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + event.api.addPanel({ + id: 'panel1', + component: 'default', + params: { color: 'red' }, + minimumSize: 50, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + params: { color: 'green' }, + minimumSize: 50, + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + params: { color: 'purple' }, + minimumSize: 50, + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Splitview/Simple', + component: Simple, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { + orientation: Orientation.VERTICAL, + proportionalLayout: true, + disableAutoResizing: false, + }, + argTypes: { + orientation: { + control: { + type: 'inline-radio', + options: [Orientation.HORIZONTAL, Orientation.VERTICAL], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.snap.stories.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.snap.stories.tsx new file mode 100644 index 000000000..13b205bab --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.snap.stories.tsx @@ -0,0 +1,104 @@ +import { + ISplitviewPanelProps, + Orientation, + PanelCollection, + SplitviewApi, + SplitviewReact, + SplitviewReadyEvent, +} from 'dockview'; +import * as React from 'react'; +import { Meta } from '@storybook/react'; + +const components: PanelCollection> = { + default: (props: ISplitviewPanelProps<{ color: string }>) => { + const resize = () => { + props.api.setSize({ size: 300 }); + }; + + return ( +
+
hello world
+ +
+ ); + }, +}; + +export const Snap = (props: { + orientation: Orientation; + hideBorders: boolean; + proportionalLayout: boolean; + disableAutoResizing: boolean; +}) => { + const api = React.useRef(); + + const onReady = (event: SplitviewReadyEvent) => { + api.current = event.api; + event.api.addPanel({ + id: 'panel1', + component: 'default', + params: { color: 'red' }, + minimumSize: 50, + snap: true, + }); + event.api.addPanel({ + id: 'panel2', + component: 'default', + params: { color: 'green' }, + minimumSize: 50, + }); + event.api.addPanel({ + id: 'panel3', + component: 'default', + params: { color: 'purple' }, + minimumSize: 50, + snap: true, + }); + }; + + return ( + + ); +}; + +export default { + title: 'Library/Splitview/Snap', + component: Snap, + decorators: [ + (Component) => { + document.body.style.padding = '0px'; + return ( +
+ +
+ ); + }, + ], + args: { + orientation: Orientation.VERTICAL, + proportionalLayout: true, + disableAutoResizing: false, + }, + argTypes: { + orientation: { + control: { + type: 'inline-radio', + options: [Orientation.HORIZONTAL, Orientation.VERTICAL], + }, + }, + }, +} as Meta; diff --git a/build/packages/dockview-demo/src/stories/splitview/splitview.tsx b/build/packages/dockview-demo/src/stories/splitview/splitview.tsx new file mode 100644 index 000000000..6854aff85 --- /dev/null +++ b/build/packages/dockview-demo/src/stories/splitview/splitview.tsx @@ -0,0 +1,341 @@ +import * as React from 'react'; +import './splitview.css'; + +const min = 100; +const max = 300; + +interface IDebugResize { + leftmin: number; + leftmax: number; + rightmin: number; + rightmax: number; + min: number; + max: number; +} + +const resize = ( + index: number, + delta: number, + sizes: number[], + mode: number +) => { + const nextSizes = [...sizes]; + + const left = nextSizes.filter((_, i) => i <= index); + const right = nextSizes.filter((_, i) => i > index); + + let result: IDebugResize = { + leftmin: undefined, + leftmax: undefined, + rightmin: undefined, + rightmax: undefined, + max: undefined, + min: undefined, + }; + + // step 3 + if (mode > 2) { + const leftMinimumsDelta = left + .map((x) => min - x) + .reduce((x, y) => x + y, 0); + const leftMaximumsDelta = left + .map((x) => max - x) + .reduce((x, y) => x + y, 0); + const rightMinimumsDelta = right + .map((x) => x - min) + .reduce((x, y) => x + y, 0); + const rightMaximumsDelta = right + .map((x) => x - max) + .reduce((x, y) => x + y, 0); + const _min = Math.max(leftMinimumsDelta, rightMaximumsDelta); + const _max = Math.min(leftMaximumsDelta, rightMinimumsDelta); + const clamp = Math.max(_min, Math.min(_max, delta)); + + result = { + leftmin: leftMinimumsDelta, + leftmax: leftMaximumsDelta, + rightmin: rightMinimumsDelta, + rightmax: rightMaximumsDelta, + max: _max, + min: _min, + }; + delta = clamp; + } + + let usedDelta = 0; + let remainingDelta = delta; + + // Step 1 + for (let i = left.length - 1; i > -1; i--) { + const x = Math.max(min, Math.min(max, left[i] + remainingDelta)); + const viewDelta = x - left[i]; + usedDelta += viewDelta; + remainingDelta -= viewDelta; + left[i] = x; + } + + // Step 2 + if (mode > 1) { + for (let i = 0; i < right.length; i++) { + const x = Math.max(min, Math.min(max, right[i] - usedDelta)); + const viewDelta = x - right[i]; + usedDelta += viewDelta; + right[i] = x; + } + } + + return { ...result, sizes: [...left, ...right] }; +}; + +interface ILayoutState { + sashes: number[]; + views: number[]; + deltas: number[]; + left: number; + right: number; + debug: IDebugResize; + drag: number; +} + +export const Splitview = (props: { mode: number; debug: boolean }) => { + // keep the sashes and views in one state to prevent weird out-of-sync-ness + const [layout, setLayout] = React.useState({ + sashes: [200, 400, 600], + views: [200, 200, 200, 200], + deltas: [0, 0, 0, 0], + left: 0, + right: 0, + debug: undefined, + drag: -1, + }); + + const ref = React.useRef(); + + const onMouseDown = (index: number) => (ev: React.MouseEvent) => { + const start = ev.clientX; + const sizes = [...layout.views]; + + const mousemove = (ev: MouseEvent) => { + const current = ev.clientX; + const delta = current - start; + const { + sizes: nextLayout, + rightmin, + rightmax, + leftmin, + leftmax, + max, + min, + } = resize(index, delta, sizes, props.mode); + const sashes = nextLayout.reduce( + (x, y) => [...x, y + (x.length === 0 ? 0 : x[x.length - 1])], + [] + ); + sashes.splice(sashes.length - 1, 1); + const deltas = sizes.map((x, i) => nextLayout[i] - x); + + const offset = start - ref.current?.getBoundingClientRect().left; + + setLayout({ + views: nextLayout, + sashes, + deltas, + left: deltas + .filter((_, i) => i <= index) + .reduce((x, y) => x + y, 0), + right: deltas + .filter((_, i) => i > index) + .reduce((x, y) => x + y, 0), + debug: { + leftmax: leftmax + offset, + leftmin: leftmin + offset, + rightmax: rightmax + offset, + rightmin: rightmin + offset, + min: min + offset, + max: max + offset, + }, + drag: index, + }); + }; + + const end = (ev: MouseEvent) => { + document.removeEventListener('mousemove', mousemove); + document.removeEventListener('mouseup', end); + setLayout((_) => ({ + ..._, + deltas: _.deltas.map((_) => 0), + left: 0, + right: 0, + drag: -1, + })); + }; + + document.addEventListener('mousemove', mousemove); + document.addEventListener('mouseup', end); + }; + + const extras = React.useMemo(() => { + if (!props.debug || !layout.debug || props.mode < 3) { + return null; + } + return ( + <> +
+ left-max +
+
+ left-min +
+
+ right-max +
+
+ right-min +
+
+
+
+
+ + ); + }, [layout.debug]); + + return ( +
+ {props.debug && ( +
+ {`Change to left ${layout?.left}`} + {`Change to right ${layout?.right}`} + {`Total size ${layout?.views.reduce( + (x, y) => x + y, + 0 + )}`} +
+ )} +
+
+ {layout.sashes.map((x, i) => { + const className = + layout.drag === i ? 'sash drag-sash' : 'sash'; + return ( +
+ ); + })} + {extras} +
+
+ {layout.views.map((x, i) => { + const isMax = x >= max; + const isMin = x <= min; + + return ( +
+ {props.debug && ( + <> +
+ {`${layout.views[i]} (${ + layout.deltas[i] > -1 ? '+' : '' + }${layout.deltas[i]})`} +
+
{`isMin = ${isMin}`}
+
{`isMax = ${isMax}`}
+ + )} +
+ ); + })} +
+
+
+ ); +}; diff --git a/build/packages/dockview-demo/src/stories/splitview/visual_1.jpg b/build/packages/dockview-demo/src/stories/splitview/visual_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f7375dc500495f7a8db77c8afe35b8f657143ee GIT binary patch literal 35574 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 +

dockview

+ +

Zero dependency layout manager supporting tabs, grids and splitviews with ReactJS support written in TypeScript

+ +
+ +--- + +[![npm version](https://badge.fury.io/js/dockview.svg)](https://www.npmjs.com/package/dockview) +[![CI Build](https://github.com/mathuo/dockview/workflows/CI/badge.svg)](https://github.com/mathuo/dockview/actions?query=workflow%3ACI) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=mathuo_dockview&metric=coverage)](https://sonarcloud.io/summary/overall?id=mathuo_dockview) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mathuo_dockview&metric=alert_status)](https://sonarcloud.io/summary/overall?id=mathuo_dockview) +[![Bundle Phobia](https://badgen.net/bundlephobia/minzip/dockview)](https://bundlephobia.com/result?p=dockview) + +## + +Please see the website: https://mathuo.github.io/dockview/docs + +Want to inspect the latest deployment? Go to https://unpkg.com/browse/dockview@latest/ + +## Features + +- Simple splitviews, nested splitviews (i.e. gridviews) supporting full layout managment with + dockable and tabular views +- Extensive API support at the component level and view level +- Themable and customizable +- Serialization / deserialization support +- Tabular docking and Drag and Drop support +- Documentation and examples + +This project was inspired by many popular IDE editors. Some parts of the core resizable panelling are inspired by code found in the VSCode codebase, [splitview](https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview) and [gridview](https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid). + +## Quick start + +Dockview has a peer dependency on `react >= 16.8.0` and `react-dom >= 16.8.0`. You can install dockview from [npm](https://www.npmjs.com/package/dockview). Please see the [Getting Started Guide](https://mathuo.github.io/dockview/docs/). + +``` +npm install --save dockview +``` + +Within your project you must import or reference the stylesheet at `dockview/dist/styles/dockview.css` and attach a theme. + +```css +@import '~dockview/dist/styles/dockview.css'; +``` + +You should also attach a dockview theme to an element containing your components. For example: + +```html + +``` diff --git a/build/packages/dockview/gulpfile.js b/build/packages/dockview/gulpfile.js new file mode 100644 index 000000000..4b62c983d --- /dev/null +++ b/build/packages/dockview/gulpfile.js @@ -0,0 +1,6 @@ +const gulp = require('gulp'); +const buildfile = require('../../scripts/build'); + +buildfile.init(); + +gulp.task('run', gulp.series(['sass'])); diff --git a/build/packages/dockview/jest.config.js b/build/packages/dockview/jest.config.js new file mode 100644 index 000000000..e72f97d2c --- /dev/null +++ b/build/packages/dockview/jest.config.js @@ -0,0 +1,27 @@ +const { name } = require('./package'); + +const baseConfig = require('../../jest.config.base'); + +console.log('loaded'); + +module.exports = { + ...baseConfig, + roots: ['/packages/dockview'], + modulePaths: ['/packages/dockview/src'], + displayName: { name, color: 'blue' }, + rootDir: '../../', + collectCoverageFrom: [ + '/packages/dockview/src/**/*.{js,jsx,ts,tsx}', + ], + setupFiles: [ + '/packages/dockview/src/__tests__/__mocks__/resizeObserver.js', + ], + coveragePathIgnorePatterns: ['/node_modules/'], + modulePathIgnorePatterns: [ + '/packages/dockview/src/__tests__/__mocks__', + '/packages/dockview/src/__tests__/__test_utils__', + ], + coverageDirectory: '/packages/dockview/coverage/', + testResultsProcessor: 'jest-sonar-reporter', + testEnvironment: 'jsdom', +}; diff --git a/build/packages/dockview/package.json b/build/packages/dockview/package.json new file mode 100644 index 000000000..191f235c2 --- /dev/null +++ b/build/packages/dockview/package.json @@ -0,0 +1,77 @@ +{ + "name": "dockview", + "version": "1.4.2", + "description": "Zero dependency layout manager supporting tabs, grids and splitviews with ReactJS support", + "main": "./dist/cjs/index.js", + "types": "./dist/cjs/index.d.ts", + "module": "./dist/esm/index.js", + "repository": { + "type": "git", + "url": "https://github.com/mathuo/dockview.git" + }, + "bugs": { + "url": "https://github.com/mathuo/dockview/issues" + }, + "homepage": "https://github.com/mathuo/dockview", + "scripts": { + "build:ci": "npm run build:cjs && npm run build:esm && npm run build:css", + "build:cjs": "cross-env ../../node_modules/.bin/tsc --project ./tsconfig.json --extendedDiagnostics", + "build:css": "gulp sass", + "build:esm": "cross-env ../../node_modules/.bin/tsc --project ./tsconfig.esm.json --extendedDiagnostics", + "build:modulefiles": "rollup -c", + "build": "npm run build:ci && npm run build:modulefiles", + "clean": "rimraf dist/ .build/", + "docs": "typedoc", + "prepack": "npm run rebuild && npm run test", + "rebuild": "npm run clean && npm run build", + "test": "cross-env ../../node_modules/.bin/jest --selectProjects dockview", + "test:cov": "cross-env ../../node_modules/.bin/jest --selectProjects dockview --coverage", + "dev-publish": "node ./scripts/publishExperimental.js" + }, + "files": [ + "dist", + "README.md" + ], + "keywords": [ + "splitview", + "split-view", + "gridview", + "grid-view", + "dockview", + "dock-view", + "grid", + "tabs", + "layout", + "layout manager", + "dock layout", + "dock", + "docking", + "splitter", + "drag-and-drop", + "drag", + "drop", + "react", + "react-component" + ], + "author": "https://github.com/mathuo", + "license": "MIT", + "devDependencies": { + "@rollup/plugin-typescript": "^8.3.2", + "@testing-library/react": "^13.2.0", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.3", + "cross-env": "^7.0.3", + "postcss": "^8.4.13", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "rimraf": "^3.0.2", + "rollup": "^2.72.1", + "rollup-plugin-postcss": "^4.0.2", + "rollup-plugin-terser": "^7.0.2", + "typedoc": "^0.22.15" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } +} diff --git a/build/packages/dockview/rollup.config.js b/build/packages/dockview/rollup.config.js new file mode 100644 index 000000000..f9ee1e91b --- /dev/null +++ b/build/packages/dockview/rollup.config.js @@ -0,0 +1,102 @@ +/* eslint-disable */ + +import { join } from 'path'; +import typescript from '@rollup/plugin-typescript'; +import { terser } from 'rollup-plugin-terser'; +import postcss from 'rollup-plugin-postcss'; + +const { name, version, homepage, license } = require('./package.json'); +const main = join(__dirname, './scripts/rollupEntryTarget.ts'); +const mainNoStyles = join(__dirname, './src/index.ts'); +const outputDir = join(__dirname, 'dist'); + +function outputFile(format, isMinified, withStyles) { + let filename = join(outputDir, name); + + if (format !== 'umd') { + filename += `.${format}`; + } + if (isMinified) { + filename += '.min'; + } + if (!withStyles) { + filename += '.noStyle'; + } + + return `${filename}.js`; +} + +function createBundle(format, options) { + const { withStyles, isMinified } = options; + const input = withStyles ? main : mainNoStyles; + const file = outputFile(format, isMinified, withStyles); + + const external = []; + + const output = { + file, + format, + globals: {}, + banner: [ + `/**`, + ` * ${name}`, + ` * @version ${version}`, + ` * @link ${homepage}`, + ` * @license ${license}`, + ` */`, + ].join('\n'), + }; + + const plugins = [ + typescript({ + tsconfig: 'tsconfig.esm.json', + incremental: false, + tsBuildInfoFile: undefined, + outDir: undefined, + declaration: false, + }), + ]; + + if (isMinified) { + plugins.push(terser()); + } + if (withStyles) { + plugins.push(postcss()); + } + + if (format === 'umd') { + output['name'] = name; + + // TODO: should be conditional on whether user wants the React wrappers + output.globals['react'] = 'React'; + output.globals['react-dom'] = 'ReactDOM'; + } + + // TODO: should be conditional on whether user wants the React wrappers + external.push('react', 'react-dom'); + + return { + input, + output, + plugins, + external, + }; +} + +export default [ + // amd + createBundle('amd', { withStyles: false, isMinified: false }), + createBundle('amd', { withStyles: true, isMinified: false }), + createBundle('amd', { withStyles: false, isMinified: true }), + createBundle('amd', { withStyles: true, isMinified: true }), + // umd + createBundle('umd', { withStyles: false, isMinified: false }), + createBundle('umd', { withStyles: true, isMinified: false }), + createBundle('umd', { withStyles: false, isMinified: true }), + createBundle('umd', { withStyles: true, isMinified: true }), + // cjs + createBundle('cjs', { withStyles: true, isMinified: false }), + // esm + createBundle('esm', { withStyles: true, isMinified: false }), + createBundle('esm', { withStyles: true, isMinified: true }), +]; diff --git a/build/packages/dockview/scripts/publishExperimental.js b/build/packages/dockview/scripts/publishExperimental.js new file mode 100644 index 000000000..efd1b8e2d --- /dev/null +++ b/build/packages/dockview/scripts/publishExperimental.js @@ -0,0 +1,63 @@ +const cp = require('child_process'); +const fs = require('fs-extra'); +const path = require('path'); + +const rootDir = path.join(__dirname, '..'); +const publishDir = path.join(rootDir, '__publish__'); + +cp.execSync('npm run clean', { cwd: rootDir, stdio: 'inherit' }); +cp.execSync('npm run test', { cwd: __dirname, stdio: 'inherit' }); +cp.execSync('npm run build', { cwd: rootDir, stdio: 'inherit' }); + +if (fs.existsSync(publishDir)) { + fs.removeSync(publishDir); +} +fs.mkdirSync(publishDir); + +if (!fs.existsSync(path.join(publishDir, 'dist'))) { + fs.mkdirSync(path.join(publishDir, 'dist')); +} + +const package = JSON.parse( + fs.readFileSync(path.join(rootDir, 'package.json')).toString() +); + +for (const file of package.files) { + fs.copySync(path.join(rootDir, file), path.join(publishDir, file)); +} + +const result = cp + .execSync('git rev-parse --short HEAD', { + cwd: rootDir, + }) + .toString() + .replace(/\n/g, ''); + +function formatDate() { + const date = new Date(); + + function pad(value) { + if (value.toString().length === 1) { + return `0${value}`; + } + return value; + } + + return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad( + date.getDate() + )}`; +} + +package.version = `0.0.0-experimental-${result}-${formatDate()}`; +package.scripts = {}; + +fs.writeFileSync( + path.join(publishDir, 'package.json'), + JSON.stringify(package, null, 4) +); + +const command = 'npm publish --tag experimental'; + +cp.execSync(command, { cwd: publishDir, stdio: 'inherit' }); + +fs.removeSync(publishDir); diff --git a/build/packages/dockview/scripts/rollupEntryTarget.ts b/build/packages/dockview/scripts/rollupEntryTarget.ts new file mode 100644 index 000000000..6ce476579 --- /dev/null +++ b/build/packages/dockview/scripts/rollupEntryTarget.ts @@ -0,0 +1,2 @@ +import '../dist/styles/dockview.css'; +export * from '../src/index'; diff --git a/build/packages/dockview/src/__tests__/__mocks__/resizeObserver.js b/build/packages/dockview/src/__tests__/__mocks__/resizeObserver.js new file mode 100644 index 000000000..bcd486343 --- /dev/null +++ b/build/packages/dockview/src/__tests__/__mocks__/resizeObserver.js @@ -0,0 +1,13 @@ +class ResizeObserver { + observe() { + // do nothing + } + unobserve() { + // do nothing + } + disconnect() { + // do nothing + } +} + +window.ResizeObserver = ResizeObserver; \ No newline at end of file diff --git a/build/packages/dockview/src/__tests__/__test_utils__/utils.ts b/build/packages/dockview/src/__tests__/__test_utils__/utils.ts new file mode 100644 index 000000000..ab8dc0a9e --- /dev/null +++ b/build/packages/dockview/src/__tests__/__test_utils__/utils.ts @@ -0,0 +1,14 @@ +import * as React from 'react'; + +export function setMockRefElement(node: Partial): void { + const mockRef = { + get current() { + return node; + }, + set current(_value) { + //noop + }, + }; + + jest.spyOn(React, 'useRef').mockReturnValueOnce(mockRef); +} diff --git a/build/packages/dockview/src/__tests__/api/api.spec.ts b/build/packages/dockview/src/__tests__/api/api.spec.ts new file mode 100644 index 000000000..10f9bc657 --- /dev/null +++ b/build/packages/dockview/src/__tests__/api/api.spec.ts @@ -0,0 +1,52 @@ +import { PanelApiImpl } from '../../api/panelApi'; + +describe('api', () => { + let api: PanelApiImpl; + + beforeEach(() => { + api = new PanelApiImpl('dummy_id'); + }); + + it('should update isFcoused getter', () => { + expect(api.isFocused).toBeFalsy(); + + api._onDidChangeFocus.fire({ isFocused: true }); + expect(api.isFocused).toBeTruthy(); + + api._onDidChangeFocus.fire({ isFocused: false }); + expect(api.isFocused).toBeFalsy(); + }); + + it('should update isActive getter', () => { + expect(api.isFocused).toBeFalsy(); + + api._onDidActiveChange.fire({ isActive: true }); + expect(api.isActive).toBeTruthy(); + + api._onDidActiveChange.fire({ isActive: false }); + expect(api.isActive).toBeFalsy(); + }); + + it('should update isActive getter', () => { + expect(api.isVisible).toBeTruthy(); + + api._onDidVisibilityChange.fire({ isVisible: false }); + expect(api.isVisible).toBeFalsy(); + + api._onDidVisibilityChange.fire({ isVisible: true }); + expect(api.isVisible).toBeTruthy(); + }); + + it('should update width and height getter', () => { + expect(api.height).toBe(0); + expect(api.width).toBe(0); + + api._onDidDimensionChange.fire({ height: 10, width: 20 }); + expect(api.height).toBe(10); + expect(api.width).toBe(20); + + api._onDidDimensionChange.fire({ height: 20, width: 10 }); + expect(api.height).toBe(20); + expect(api.width).toBe(10); + }); +}); diff --git a/build/packages/dockview/src/__tests__/api/component.api.spec.ts b/build/packages/dockview/src/__tests__/api/component.api.spec.ts new file mode 100644 index 000000000..d52697fbb --- /dev/null +++ b/build/packages/dockview/src/__tests__/api/component.api.spec.ts @@ -0,0 +1,155 @@ +import { + SplitviewApi, + PaneviewApi, + GridviewApi, + DockviewApi, +} from '../../api/component.api'; +import { GridviewComponent } from '../../gridview/gridviewComponent'; +import { PaneviewComponent } from '../../paneview/paneviewComponent'; +import { SplitviewComponent } from '../../splitview/splitviewComponent'; +import { DockviewComponent } from '../../dockview/dockviewComponent'; + +describe('component.api', () => { + describe('splitview', () => { + test('splitviewapi', () => { + const list: (keyof SplitviewComponent)[] = [ + 'minimumSize', + 'maximumSize', + 'height', + 'width', + 'length', + 'orientation', + 'onDidLayoutChange', + 'onDidAddView', + 'onDidRemoveView', + 'panels', + 'focus', + 'toJSON', + ]; + + for (const _ of list) { + const f = jest.fn(); + + const component: Partial = { + [_]: f(), + }; + + const cut = new SplitviewApi(component); + + (cut as any)[_]; + + expect(f).toBeCalledTimes(1); + } + }); + }); + + describe('paneview', () => { + test('panviewapi', () => { + const list: (keyof PaneviewComponent)[] = [ + 'minimumSize', + 'maximumSize', + 'height', + 'width', + 'onDidLayoutChange', + 'onDidAddView', + 'onDidRemoveView', + 'panels', + 'focus', + 'toJSON', + ]; + + for (const _ of list) { + const f = jest.fn(); + + const component: Partial = { + [_]: f(), + }; + + const cut = new PaneviewApi(component); + + (cut as any)[_]; + + expect(f).toBeCalledTimes(1); + } + }); + }); + + describe('gridview', () => { + test('gridviewapi', () => { + const list: (keyof GridviewComponent)[] = [ + 'minimumHeight', + 'maximumHeight', + 'minimumWidth', + 'maximumWidth', + 'width', + 'height', + 'onDidLayoutChange', + 'orientation', + 'focus', + 'toJSON', + 'onDidActiveGroupChange', + 'onDidAddGroup', + 'onDidRemoveGroup', + 'onDidLayoutFromJSON', + ]; + + for (const _ of list) { + const f = jest.fn(); + + const component: Partial = { + [_]: f(), + }; + + const cut = new GridviewApi(component); + + (cut as any)[_]; + + expect(f).toBeCalledTimes(1); + } + }); + }); + + describe('dockview', () => { + test('dockviewapi', () => { + const list: (keyof DockviewComponent)[] = [ + 'minimumHeight', + 'maximumHeight', + 'minimumWidth', + 'maximumWidth', + 'width', + 'height', + 'size', + 'totalPanels', + 'onDidLayoutChange', + 'panels', + 'groups', + 'activeGroup', + 'activePanel', + 'focus', + 'closeAllGroups', + 'toJSON', + 'onDidActiveGroupChange', + 'onDidAddGroup', + 'onDidRemoveGroup', + 'onDidActivePanelChange', + 'onDidAddPanel', + 'onDidRemovePanel', + 'onDidLayoutFromJSON', + ]; + + for (const _ of list) { + const f = jest.fn(); + + const component: Partial = { + [_]: f(), + }; + + const cut = new DockviewApi(component); + + (cut as any)[_]; + + expect(f).toBeCalledTimes(1); + } + }); + }); +}); diff --git a/build/packages/dockview/src/__tests__/api/groupPanelApi.spec.ts b/build/packages/dockview/src/__tests__/api/groupPanelApi.spec.ts new file mode 100644 index 000000000..f39a19936 --- /dev/null +++ b/build/packages/dockview/src/__tests__/api/groupPanelApi.spec.ts @@ -0,0 +1,79 @@ +import { DockviewComponent } from '../../dockview/dockviewComponent'; +import { DockviewPanelApiImpl, TitleEvent } from '../../api/groupPanelApi'; +import { IDockviewPanel } from '../../groupview/groupPanel'; +import { GroupPanel } from '../../groupview/groupviewPanel'; + +describe('groupPanelApi', () => { + test('title', () => { + const groupPanel: Partial = { + id: 'test_id', + title: 'test_title', + }; + + const accessor: Partial = {}; + const groupViewPanel = new GroupPanel( + accessor, + '', + {} + ); + + const cut = new DockviewPanelApiImpl( + groupPanel, + groupViewPanel + ); + + let events: TitleEvent[] = []; + + const disposable = cut.onDidTitleChange((event) => { + events.push(event); + }); + + expect(events.length).toBe(0); + expect(cut.title).toBe('test_title'); + + cut.setTitle('test_title_2'); + expect(events.length).toBe(1); + expect(events[0]).toEqual({ title: 'test_title_2' }); + expect(cut.title).toBe('test_title'); // title should remain unchanged + + disposable.dispose(); + }); + + test('onDidGroupChange', () => { + const groupPanel: Partial = { + id: 'test_id', + }; + + const accessor: Partial = {}; + const groupViewPanel = new GroupPanel( + accessor, + '', + {} + ); + + const cut = new DockviewPanelApiImpl( + groupPanel, + groupViewPanel + ); + + let events = 0; + + const disposable = cut.onDidGroupChange(() => { + events++; + }); + + expect(events).toBe(0); + expect(cut.group).toBe(groupViewPanel); + + const groupViewPanel2 = new GroupPanel( + accessor, + '', + {} + ); + cut.group = groupViewPanel2; + expect(events).toBe(1); + expect(cut.group).toBe(groupViewPanel2); + + disposable.dispose(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/array.spec.ts b/build/packages/dockview/src/__tests__/array.spec.ts new file mode 100644 index 000000000..46e5dcb5c --- /dev/null +++ b/build/packages/dockview/src/__tests__/array.spec.ts @@ -0,0 +1,57 @@ +import { + firstIndex, + last, + pushToEnd, + pushToStart, + range, + sequenceEquals, + tail, +} from '../array'; + +describe('array', () => { + test('tail', () => { + expect(tail([1, 2, 3, 4, 5])).toEqual([[1, 2, 3, 4], 5]); + expect(tail([1, 2])).toEqual([[1], 2]); + expect(tail([1])).toEqual([[], 1]); + expect(() => tail([])).toThrow('Invalid tail call'); + }); + + test('last', () => { + expect(last([1, 2, 3, 4])).toBe(4); + expect(last([])).toBeUndefined(); + }); + + test('pushToEnd', () => { + const arr1 = [1, 2, 3, 4]; + pushToEnd(arr1, 3); + expect(arr1).toEqual([1, 2, 4, 3]); + pushToEnd(arr1, 5); + expect(arr1).toEqual([1, 2, 4, 3]); + }); + + test('pushToStart', () => { + const arr1 = [1, 2, 3, 4]; + pushToStart(arr1, 3); + expect(arr1).toEqual([3, 1, 2, 4]); + pushToStart(arr1, 5); + expect(arr1).toEqual([3, 1, 2, 4]); + }); + + test('range', () => { + expect(range(0, 5)).toEqual([0, 1, 2, 3, 4]); + expect(range(5, 0)).toEqual([5, 4, 3, 2, 1]); + expect(range(5)).toEqual([0, 1, 2, 3, 4]); + }); + + test('firstIndex', () => { + expect(firstIndex([1, 2, 3, 4, 3], (item) => item === 3)).toBe(2); + expect(firstIndex([1, 2, 3, 4, 3], (item) => item === 5)).toBe(-1); + }); + + test('firstIndex', () => { + expect(sequenceEquals([1, 2, 3, 4], [1, 2, 3, 4])).toBeTruthy(); + expect(sequenceEquals([1, 2, 3, 4], [4, 3, 2, 1])).toBeFalsy(); + expect(sequenceEquals([1, 2, 3, 4], [1, 2, 3])).toBeFalsy(); + expect(sequenceEquals([1, 2, 3, 4], [1, 2, 3, 4, 5])).toBeFalsy(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/dnd/abstractDragHandler.spec.ts b/build/packages/dockview/src/__tests__/dnd/abstractDragHandler.spec.ts new file mode 100644 index 000000000..6e1b68600 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dnd/abstractDragHandler.spec.ts @@ -0,0 +1,87 @@ +import { fireEvent } from '@testing-library/dom'; +import { DragHandler } from '../../dnd/abstractDragHandler'; +import { IDisposable } from '../../lifecycle'; + +describe('abstractDragHandler', () => { + test('that className dragged is added to element after dragstart event', () => { + jest.useFakeTimers(); + + const element = document.createElement('div'); + + const handler = new (class TestClass extends DragHandler { + constructor(el: HTMLElement) { + super(el); + } + + getData(): IDisposable { + return { + dispose: () => { + // / + }, + }; + } + + dispose(): void { + super.dispose(); + } + })(element); + + expect(element.classList.contains('dragged')).toBeFalsy(); + + fireEvent.dragStart(element); + expect(element.classList.contains('dragged')).toBeTruthy(); + + jest.runAllTimers(); + expect(element.classList.contains('dragged')).toBeFalsy(); + + handler.dispose(); + }); + + test('that iframes and webviews have pointerEvents=none set whilst drag action is in process', () => { + jest.useFakeTimers(); + + const element = document.createElement('div'); + const iframe = document.createElement('iframe'); + const webview = document.createElement('webview'); + const span = document.createElement('span'); + + document.body.appendChild(element); + document.body.appendChild(iframe); + document.body.appendChild(webview); + document.body.appendChild(span); + + const handler = new (class TestClass extends DragHandler { + constructor(el: HTMLElement) { + super(el); + } + + getData(): IDisposable { + return { + dispose: () => { + // / + }, + }; + } + + dispose(): void { + // + } + })(element); + + expect(iframe.style.pointerEvents).toBeFalsy(); + expect(webview.style.pointerEvents).toBeFalsy(); + expect(span.style.pointerEvents).toBeFalsy(); + + fireEvent.dragStart(element); + expect(iframe.style.pointerEvents).toBe('none'); + expect(webview.style.pointerEvents).toBe('none'); + expect(span.style.pointerEvents).toBeFalsy(); + + fireEvent.dragEnd(element); + expect(iframe.style.pointerEvents).toBe('auto'); + expect(webview.style.pointerEvents).toBe('auto'); + expect(span.style.pointerEvents).toBeFalsy(); + + handler.dispose(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/dnd/dataTransfer.spec.ts b/build/packages/dockview/src/__tests__/dnd/dataTransfer.spec.ts new file mode 100644 index 000000000..d188747d2 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dnd/dataTransfer.spec.ts @@ -0,0 +1,101 @@ +import { + getPaneData, + getPanelData, + LocalSelectionTransfer, + PanelTransfer, + PaneTransfer, +} from '../../dnd/dataTransfer'; + +describe('dataTransfer', () => { + describe('getPanelData', () => { + test('should be undefined when there is no local transfer object', () => { + expect(getPanelData()).toBeUndefined(); + }); + + test('should be undefined when there is a local transfer object that is not a PanelTransfer', () => { + LocalSelectionTransfer.getInstance().setData( + [new PaneTransfer('viewId', 'groupId')], + PaneTransfer.prototype + ); + + expect(getPanelData()).toBeUndefined(); + }); + + test('should retrieve the PanelTransfer object when transfer is active', () => { + const transferObject = new PanelTransfer( + 'viewId', + 'groupId', + 'panelId' + ); + LocalSelectionTransfer.getInstance().setData( + [transferObject], + PanelTransfer.prototype + ); + + expect(getPanelData()).toBe(transferObject); + }); + + test('should retrieve the PanelTransfer when a new transfer overrides an existing one', () => { + LocalSelectionTransfer.getInstance().setData( + [new PaneTransfer('viewId', 'groupId')], + PaneTransfer.prototype + ); + + expect(getPanelData()).toBeUndefined(); + + const transferObject = new PanelTransfer( + 'viewId', + 'groupId', + 'panelId' + ); + LocalSelectionTransfer.getInstance().setData( + [transferObject], + PanelTransfer.prototype + ); + + expect(getPanelData()).toBe(transferObject); + }); + }); + + describe('getPaneData', () => { + test('should be undefined when there is no local transfer object', () => { + expect(getPaneData()).toBeUndefined(); + }); + + test('should be undefined when there is a local transfer object that is not a PaneTransfer', () => { + LocalSelectionTransfer.getInstance().setData( + [new PanelTransfer('viewId', 'groupId', 'panelId')], + PanelTransfer.prototype + ); + + expect(getPaneData()).toBeUndefined(); + }); + + test('should retrieve the PaneTransfer object when transfer is active', () => { + const transferObject = new PaneTransfer('viewId', 'groupId'); + LocalSelectionTransfer.getInstance().setData( + [transferObject], + PaneTransfer.prototype + ); + + expect(getPaneData()).toBe(transferObject); + }); + + test('should retrieve the PanelTransfer when a new transfer overrides an existing one', () => { + LocalSelectionTransfer.getInstance().setData( + [new PanelTransfer('viewId', 'groupId', 'panelId')], + PanelTransfer.prototype + ); + + expect(getPaneData()).toBeUndefined(); + + const transferObject = new PaneTransfer('viewId', 'groupId'); + LocalSelectionTransfer.getInstance().setData( + [transferObject], + PaneTransfer.prototype + ); + + expect(getPaneData()).toBe(transferObject); + }); + }); +}); diff --git a/build/packages/dockview/src/__tests__/dnd/droptarget.spec.ts b/build/packages/dockview/src/__tests__/dnd/droptarget.spec.ts new file mode 100644 index 000000000..630898bc7 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dnd/droptarget.spec.ts @@ -0,0 +1,162 @@ +import { Droptarget, Position } from '../../dnd/droptarget'; +import { fireEvent } from '@testing-library/dom'; + +function createOffsetDragOverEvent(params: { + offsetX: number; + offsetY: number; +}): Event { + const event = new Event('dragover', { + bubbles: true, + cancelable: true, + }); + Object.defineProperty(event, 'offsetX', { get: () => params.offsetX }); + Object.defineProperty(event, 'offsetY', { get: () => params.offsetY }); + return event; +} + +describe('droptarget', () => { + let element: HTMLElement; + let droptarget: Droptarget; + + beforeEach(() => { + element = document.createElement('div'); + + jest.spyOn(element, 'clientHeight', 'get').mockImplementation( + () => 100 + ); + jest.spyOn(element, 'clientWidth', 'get').mockImplementation(() => 200); + }); + + test('non-directional', () => { + let position: Position | undefined = undefined; + + droptarget = new Droptarget(element, { + canDisplayOverlay: () => true, + validOverlays: 'none', + }); + + droptarget.onDrop((event) => { + position = event.position; + }); + + fireEvent.dragEnter(element); + fireEvent.dragOver(element); + + const target = element.querySelector( + '.drop-target-dropzone' + ) as HTMLElement; + fireEvent.drop(target); + expect(position).toBe(Position.Center); + }); + + test('drop', () => { + let position: Position | undefined = undefined; + + droptarget = new Droptarget(element, { + canDisplayOverlay: () => true, + validOverlays: 'all', + }); + + droptarget.onDrop((event) => { + position = event.position; + }); + + fireEvent.dragEnter(element); + fireEvent.dragOver(element); + + const target = element.querySelector( + '.drop-target-dropzone' + ) as HTMLElement; + + jest.spyOn(target, 'clientHeight', 'get').mockImplementation(() => 100); + jest.spyOn(target, 'clientWidth', 'get').mockImplementation(() => 200); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 19, offsetY: 0 }) + ); + + expect(position).toBeUndefined(); + fireEvent.drop(target); + expect(position).toBe(Position.Left); + }); + + test('default', () => { + droptarget = new Droptarget(element, { + canDisplayOverlay: () => true, + validOverlays: 'all', + }); + + expect(droptarget.state).toBeUndefined(); + + fireEvent.dragEnter(element); + fireEvent.dragOver(element); + + let viewQuery = element.querySelectorAll( + '.drop-target > .drop-target-dropzone > .drop-target-selection' + ); + expect(viewQuery.length).toBe(1); + + const target = element.querySelector( + '.drop-target-dropzone' + ) as HTMLElement; + + jest.spyOn(target, 'clientHeight', 'get').mockImplementation(() => 100); + jest.spyOn(target, 'clientWidth', 'get').mockImplementation(() => 200); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 19, offsetY: 0 }) + ); + + viewQuery = element.querySelectorAll( + '.drop-target > .drop-target-dropzone > .drop-target-selection.left' + ); + expect(viewQuery.length).toBe(1); + expect(droptarget.state).toBe(Position.Left); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 40, offsetY: 19 }) + ); + + viewQuery = element.querySelectorAll( + '.drop-target > .drop-target-dropzone > .drop-target-selection.top' + ); + expect(viewQuery.length).toBe(1); + expect(droptarget.state).toBe(Position.Top); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 160, offsetY: 81 }) + ); + + viewQuery = element.querySelectorAll( + '.drop-target > .drop-target-dropzone > .drop-target-selection.bottom' + ); + expect(viewQuery.length).toBe(1); + expect(droptarget.state).toBe(Position.Bottom); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 161, offsetY: 0 }) + ); + + viewQuery = element.querySelectorAll( + '.drop-target > .drop-target-dropzone > .drop-target-selection.right' + ); + expect(viewQuery.length).toBe(1); + expect(droptarget.state).toBe(Position.Right); + + fireEvent( + target, + createOffsetDragOverEvent({ offsetX: 100, offsetY: 50 }) + ); + expect(droptarget.state).toBe(Position.Center); + + fireEvent.dragLeave(target); + expect(droptarget.state).toBeUndefined(); + viewQuery = element.querySelectorAll('.drop-target'); + expect(viewQuery.length).toBe(0); + }); +}); diff --git a/build/packages/dockview/src/__tests__/dockview/defaultGroupPanelView.spec.ts b/build/packages/dockview/src/__tests__/dockview/defaultGroupPanelView.spec.ts new file mode 100644 index 000000000..ab91faeb4 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dockview/defaultGroupPanelView.spec.ts @@ -0,0 +1,46 @@ +import { DefaultGroupPanelView } from '../../dockview/defaultGroupPanelView'; +import { + IActionsRenderer, + IContentRenderer, + ITabRenderer, +} from '../../groupview/types'; + +describe('defaultGroupPanelView', () => { + test('dispose cleanup', () => { + const contentMock = jest.fn(() => { + const partial: Partial = { + element: document.createElement('div'), + dispose: jest.fn(), + }; + return partial as IContentRenderer; + }); + + const tabMock = jest.fn(() => { + const partial: Partial = { + element: document.createElement('div'), + dispose: jest.fn(), + }; + return partial as IContentRenderer; + }); + + const actionsMock = jest.fn(() => { + const partial: Partial = { + element: document.createElement('div'), + dispose: jest.fn(), + }; + return partial as IContentRenderer; + }); + + const content = new contentMock(); + const tab = new tabMock(); + const actions = new actionsMock(); + + const cut = new DefaultGroupPanelView({ content, tab, actions }); + + cut.dispose(); + + expect(content.dispose).toHaveBeenCalled(); + expect(tab.dispose).toHaveBeenCalled(); + expect(actions.dispose).toHaveBeenCalled(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/dockview/dockviewComponent.spec.ts b/build/packages/dockview/src/__tests__/dockview/dockviewComponent.spec.ts new file mode 100644 index 000000000..3839d56c7 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dockview/dockviewComponent.spec.ts @@ -0,0 +1,1692 @@ +import { DockviewComponent } from '../../dockview/dockviewComponent'; +import { + GroupPanelPartInitParameters, + IContentRenderer, + ITabRenderer, +} from '../../groupview/types'; +import { PanelUpdateEvent } from '../../panel/types'; +import { Orientation } from '../../splitview/core/splitview'; +import { ReactPanelDeserialzier } from '../../react/deserializer'; +import { Position } from '../../dnd/droptarget'; +import { GroupPanel } from '../../groupview/groupviewPanel'; +import { CompositeDisposable } from '../../lifecycle'; +import { + GroupPanelUpdateEvent, + GroupviewPanelState, + IDockviewPanel, + IGroupPanelInitParameters, +} from '../../groupview/groupPanel'; +import { IGroupPanelView } from '../../dockview/defaultGroupPanelView'; +import { + DockviewPanelApi, + DockviewPanelApiImpl, +} from '../../api/groupPanelApi'; +import { DefaultTab } from '../../dockview/components/tab/defaultTab'; +import { Emitter } from '../../events'; + +class PanelContentPartTest implements IContentRenderer { + element: HTMLElement = document.createElement('div'); + + readonly _onDidDispose = new Emitter(); + readonly onDidDispose = this._onDidDispose.event; + + isDisposed: boolean = false; + + constructor(public readonly id: string, component: string) { + this.element.classList.add(`testpanel-${id}`); + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void { + //noop + } + + init(parameters: GroupPanelPartInitParameters): void { + //noop + } + + layout(width: number, height: number): void { + //noop + } + + update(event: PanelUpdateEvent): void { + //noop + } + + toJSON(): object { + return { id: this.id }; + } + + focus(): void { + //noop + } + + dispose(): void { + this.isDisposed = true; + this._onDidDispose.fire(); + } +} + +class PanelTabPartTest implements ITabRenderer { + element: HTMLElement = document.createElement('div'); + + readonly _onDidDispose = new Emitter(); + readonly onDidDispose = this._onDidDispose.event; + + isDisposed: boolean = false; + + constructor(public readonly id: string, component: string) { + this.element.classList.add(`testpanel-${id}`); + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void { + //noop + } + + init(parameters: GroupPanelPartInitParameters): void { + //noop + } + + layout(width: number, height: number): void { + //noop + } + + update(event: PanelUpdateEvent): void { + //noop + } + + toJSON(): object { + return { id: this.id }; + } + + focus(): void { + //noop + } + + dispose(): void { + this.isDisposed = true; + this._onDidDispose.fire(); + } +} + +class TestGroupPanelView implements IGroupPanelView { + readonly tab: ITabRenderer = new DefaultTab(); + + constructor(public readonly content: IContentRenderer) { + // + } + + update(event: GroupPanelUpdateEvent): void { + // + } + + layout(width: number, height: number): void { + // + } + + init(params: GroupPanelPartInitParameters): void { + // + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void { + // + } + + toJSON(): {} { + return {}; + } + + dispose(): void { + // + } +} + +class TestGroupPanel implements IDockviewPanel { + private _group: GroupPanel | undefined; + + readonly view: IGroupPanelView; + readonly suppressClosable: boolean = false; + readonly api: DockviewPanelApi; + + constructor( + public readonly id: string, + public readonly title: string, + accessor: DockviewComponent + ) { + this.api = new DockviewPanelApiImpl(this, this._group); + this._group = new GroupPanel(accessor, id, {}); + this.view = new TestGroupPanelView( + new PanelContentPartTest(id, 'component') + ); + } + + get params(): Record { + return {}; + } + + get group(): GroupPanel | undefined { + return this._group; + } + + updateParentGroup(group: GroupPanel, isGroupActive: boolean): void { + this._group = group; + } + + init(params: IGroupPanelInitParameters): void { + // + } + + layout(width: number, height: number): void { + // + } + + focus(): void { + // + } + + toJSON(): GroupviewPanelState { + return { + id: this.id, + title: this.title, + }; + } + + update(event: GroupPanelUpdateEvent): void { + // + } + + dispose(): void { + // + } +} + +describe('dockviewComponent', () => { + let container: HTMLElement; + let dockview: DockviewComponent; + + beforeEach(() => { + container = document.createElement('div'); + + dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + }); + + test('duplicate panel', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + expect(() => { + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + }).toThrowError('panel with id panel1 already exists'); + }); + + test('set active panel', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + dockview.addPanel({ + id: 'panel4', + component: 'default', + }); + + const panel1 = dockview.getGroupPanel('panel1'); + const panel2 = dockview.getGroupPanel('panel2'); + const panel3 = dockview.getGroupPanel('panel3'); + const panel4 = dockview.getGroupPanel('panel4'); + + const group1 = panel1!.group; + dockview.moveGroupOrPanel(group1, group1.id, 'panel1', Position.Right); + const group2 = panel1!.group; + dockview.moveGroupOrPanel(group2, group1.id, 'panel3', Position.Center); + + expect(dockview.activeGroup).toBe(group2); + expect(dockview.activeGroup!.model.activePanel).toBe(panel3); + expect(dockview.activeGroup!.model.indexOf(panel3!)).toBe(1); + + dockview.moveToPrevious({ includePanel: true }); + expect(dockview.activeGroup).toBe(group2); + expect(dockview.activeGroup!.model.activePanel).toBe(panel1); + + dockview.moveToNext({ includePanel: true }); + expect(dockview.activeGroup).toBe(group2); + expect(dockview.activeGroup!.model.activePanel).toBe(panel3); + + dockview.moveToPrevious({ includePanel: false }); + expect(dockview.activeGroup).toBe(group1); + expect(dockview.activeGroup!.model.activePanel).toBe(panel4); + + dockview.moveToPrevious({ includePanel: true }); + expect(dockview.activeGroup).toBe(group1); + expect(dockview.activeGroup!.model.activePanel).toBe(panel2); + + dockview.moveToNext({ includePanel: false }); + expect(dockview.activeGroup).toBe(group2); + expect(dockview.activeGroup!.model.activePanel).toBe(panel3); + }); + + test('remove group', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + dockview.addPanel({ + id: 'panel4', + component: 'default', + }); + + const panel1 = dockview.getGroupPanel('panel1'); + const panel2 = dockview.getGroupPanel('panel2'); + const group1 = panel1.group; + dockview.moveGroupOrPanel(group1, group1.id, 'panel1', Position.Right); + const group2 = panel1.group; + dockview.moveGroupOrPanel(group2, group1.id, 'panel3', Position.Center); + + expect(dockview.size).toBe(2); + expect(dockview.totalPanels).toBe(4); + expect(panel1.group.model.size).toBe(2); + expect(panel2.group.model.size).toBe(2); + + dockview.removeGroup(panel1.group); + + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(2); + + dockview.removeGroup(panel2.group); + + expect(dockview.size).toBe(0); + expect(dockview.totalPanels).toBe(0); + }); + + test('active panel', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + dockview.addPanel({ + id: 'panel4', + component: 'default', + }); + + const panel1 = dockview.getGroupPanel('panel1'); + const panel2 = dockview.getGroupPanel('panel2'); + const panel3 = dockview.getGroupPanel('panel3'); + const panel4 = dockview.getGroupPanel('panel4'); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeTruthy(); + + panel1.api.setActive(); + + expect(panel1.api.isActive).toBeTruthy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeFalsy(); + + panel2.api.setActive(); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeTruthy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeFalsy(); + + const group1 = panel1.group; + dockview.moveGroupOrPanel(group1, group1.id, 'panel1', Position.Right); + const group2 = panel1.group; + dockview.moveGroupOrPanel(group2, group1.id, 'panel3', Position.Center); + + expect(dockview.size).toBe(2); + expect(panel1.group).toBe(panel3.group); + expect(panel2.group).toBe(panel4.group); + expect(panel1.group).not.toBe(panel2.group); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeTruthy(); + expect(panel4.api.isActive).toBeFalsy(); + + panel1.api.setActive(); + expect(panel1.api.isActive).toBeTruthy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeFalsy(); + + panel2.api.setActive(); + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeTruthy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeFalsy(); + + panel3.api.setActive(); + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeTruthy(); + expect(panel4.api.isActive).toBeFalsy(); + + panel4.api.setActive(); + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeFalsy(); + expect(panel4.api.isActive).toBeTruthy(); + }); + + test('add a panel and move to a new group', async () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(2); + + const panel1 = dockview.getGroupPanel('panel1'); + const panel2 = dockview.getGroupPanel('panel2'); + + expect(panel1.group).toBe(panel2.group); + + const group = panel1.group; + + expect(group.model.size).toBe(2); + expect(group.model.containsPanel(panel1)).toBeTruthy(); + expect(group.model.containsPanel(panel2)).toBeTruthy(); + expect(group.model.activePanel).toBe(panel2); + + expect(group.model.indexOf(panel1)).toBe(0); + expect(group.model.indexOf(panel2)).toBe(1); + + dockview.moveGroupOrPanel(group, group.id, 'panel1', Position.Right); + + expect(dockview.size).toBe(2); + expect(dockview.totalPanels).toBe(2); + + expect(panel1.group).not.toBe(panel2.group); + expect(panel1.group.model.size).toBe(1); + expect(panel2.group.model.size).toBe(1); + expect(panel1.group.model.containsPanel(panel1)).toBeTruthy(); + expect(panel2.group.model.containsPanel(panel2)).toBeTruthy(); + expect(panel1.group.model.activePanel).toBe(panel1); + expect(panel2.group.model.activePanel).toBe(panel2); + + await panel1.api.close(); + + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(1); + + await panel2.api.close(); + + expect(dockview.size).toBe(1); // watermark + expect(dockview.totalPanels).toBe(0); + }); + + test('panel content added to content-container css check', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + + let viewQuery = container.querySelectorAll( + '.branch-node > .split-view-container > .view-container > .view' + ); + + expect(viewQuery.length).toBe(1); + + viewQuery = container.querySelectorAll( + '.branch-node > .split-view-container > .view-container > .view:nth-child(1) >.groupview > .content-container > .testpanel-panel2' + ); + + expect(viewQuery.length).toBe(1); + + const group = dockview.getGroupPanel('panel1').group; + dockview.moveGroupOrPanel(group, group.id, 'panel1', Position.Right); + + viewQuery = container.querySelectorAll( + '.branch-node > .split-view-container > .view-container > .view' + ); + + expect(viewQuery.length).toBe(2); + + viewQuery = container.querySelectorAll( + '.branch-node > .split-view-container > .view-container > .view:nth-child(1) >.groupview > .content-container > .testpanel-panel2' + ); + + expect(viewQuery.length).toBe(1); + + viewQuery = container.querySelectorAll( + '.branch-node > .split-view-container > .view-container > .view:nth-child(2) >.groupview > .content-container > .testpanel-panel1' + ); + + expect(viewQuery.length).toBe(1); + }); + + test('serialization', () => { + dockview.layout(1000, 1000); + + dockview.deserializer = new ReactPanelDeserialzier(dockview); + dockview.fromJSON({ + activeGroup: 'group-1', + grid: { + root: { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel1'], + id: 'group-1', + activeView: 'panel1', + }, + size: 500, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel2', 'panel3'], + id: 'group-2', + }, + size: 500, + }, + { + type: 'leaf', + data: { views: ['panel4'], id: 'group-3' }, + size: 500, + }, + ], + size: 250, + }, + { + type: 'leaf', + data: { views: ['panel5'], id: 'group-4' }, + size: 250, + }, + ], + size: 1000, + }, + height: 1000, + width: 1000, + orientation: Orientation.VERTICAL, + }, + panels: { + panel1: { + id: 'panel1', + view: { content: { id: 'default' } }, + title: 'panel1', + }, + panel2: { + id: 'panel2', + view: { content: { id: 'default' } }, + title: 'panel2', + }, + panel3: { + id: 'panel3', + view: { content: { id: 'default' } }, + title: 'panel3', + }, + panel4: { + id: 'panel4', + view: { content: { id: 'default' } }, + title: 'panel4', + }, + panel5: { + id: 'panel5', + view: { content: { id: 'default' } }, + title: 'panel5', + }, + }, + options: { tabHeight: 25 }, + }); + + expect(JSON.parse(JSON.stringify(dockview.toJSON()))).toEqual({ + activeGroup: 'group-1', + grid: { + root: { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel1'], + id: 'group-1', + activeView: 'panel1', + }, + size: 500, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel2', 'panel3'], + id: 'group-2', + activeView: 'panel3', + }, + size: 500, + }, + { + type: 'leaf', + data: { + views: ['panel4'], + id: 'group-3', + activeView: 'panel4', + }, + size: 500, + }, + ], + size: 250, + }, + { + type: 'leaf', + data: { + views: ['panel5'], + id: 'group-4', + activeView: 'panel5', + }, + size: 250, + }, + ], + size: 1000, + }, + height: 1000, + width: 1000, + orientation: Orientation.VERTICAL, + }, + panels: { + panel1: { + id: 'panel1', + view: { content: { id: 'default' } }, + title: 'panel1', + }, + panel2: { + id: 'panel2', + view: { content: { id: 'default' } }, + title: 'panel2', + }, + panel3: { + id: 'panel3', + view: { content: { id: 'default' } }, + title: 'panel3', + }, + panel4: { + id: 'panel4', + view: { content: { id: 'default' } }, + title: 'panel4', + }, + panel5: { + id: 'panel5', + view: { content: { id: 'default' } }, + title: 'panel5', + }, + }, + options: { tabHeight: 25 }, + }); + }); + + test('add panel', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + const panel1 = dockview.getGroupPanel('panel1'); + + expect(panel1!.api.id).toBe('panel1'); + expect(panel1!.api.isVisible).toBeTruthy(); + expect(panel1!.api.isActive).toBeTruthy(); + // expect(panel1?.api.isFocused).toBeTruthy(); + expect(panel1!.api.height).toBe(1000); + expect(panel1!.api.width).toBe(500); + expect(panel1!.api.group).toBe(panel1?.group); + expect(panel1!.api.group.isActive).toBeTruthy(); + expect(panel1!.api.isGroupActive).toBeTruthy(); + + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + + expect(panel1?.api.isActive).toBeFalsy(); + // expect(panel1?.api.isFocused).toBeFalsy(); + expect(panel1?.api.isVisible).toBeFalsy(); + expect(panel1!.api.isGroupActive).toBeTruthy(); + expect(panel1!.api.group.isActive).toBeTruthy(); + + const panel2 = dockview.getGroupPanel('panel2'); + + expect(panel2!.api.id).toBe('panel2'); + expect(panel2!.api.isVisible).toBeTruthy(); + expect(panel2!.api.isActive).toBeTruthy(); + // expect(panel2?.api.isFocused).toBeTruthy(); + expect(panel2!.api.height).toBe(1000); + expect(panel2!.api.width).toBe(500); + expect(panel2!.api.group).toBe(panel2?.group); + expect(panel2!.api.isGroupActive).toBeTruthy(); + expect(panel2!.api.group.isActive).toBeTruthy(); + + dockview.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + + expect(panel1!.api.isActive).toBeFalsy(); + expect(panel1!.api.isVisible).toBeFalsy(); + expect(panel1!.api.isGroupActive).toBeFalsy(); + expect(panel1!.api.group.isActive).toBeFalsy(); + expect(panel2!.api.isActive).toBeFalsy(); + expect(panel2!.api.isVisible).toBeTruthy(); + expect(panel2!.api.isGroupActive).toBeFalsy(); + expect(panel2!.api.group.isActive).toBeFalsy(); + + const panel3 = dockview.getGroupPanel('panel3'); + + expect(panel3!.api.isActive).toBeTruthy(); + expect(panel3!.api.isGroupActive).toBeTruthy(); + expect(panel3!.api.group.isActive).toBeTruthy(); + + dockview.setActivePanel(panel1!); + + expect(panel1!.api.isActive).toBeTruthy(); + expect(panel1!.api.isVisible).toBeTruthy(); + expect(panel1!.api.isGroupActive).toBeTruthy(); + expect(panel1!.api.group.isActive).toBeTruthy(); + expect(panel2!.api.isActive).toBeFalsy(); + expect(panel2!.api.isVisible).toBeFalsy(); + expect(panel2!.api.isGroupActive).toBeTruthy(); + expect(panel2!.api.group.isActive).toBeTruthy(); + expect(panel3!.api.isActive).toBeFalsy(); + expect(panel3!.api.isVisible).toBeTruthy(); + expect(panel3!.api.isGroupActive).toBeFalsy(); + expect(panel3!.api.group.isActive).toBeFalsy(); + }); + + test('toJSON shouldnt fire any layout events', () => { + dockview.layout(1000, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + dockview.addPanel({ + id: 'panel4', + component: 'default', + }); + + const disposable = dockview.onDidLayoutChange(() => { + fail('onDidLayoutChange shouldnt have been called'); + }); + + const result = dockview.toJSON(); + expect(result).toBeTruthy(); + + disposable.dispose(); + }); + + test('totalPanels is updated before panel event fires', () => { + dockview.layout(1000, 1000); + + let counter = 0; + + const disposable = new CompositeDisposable( + dockview.onDidAddPanel(() => { + counter++; + expect(counter).toBe(dockview.totalPanels); + }), + dockview.onDidRemovePanel(() => { + counter--; + expect(counter).toBe(dockview.totalPanels); + }) + ); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + position: { referencePanel: 'panel1', direction: 'within' }, + }); + + const panel3 = dockview.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + + dockview.removePanel(panel1); + dockview.removePanel(panel3); + dockview.removePanel(panel2); + + disposable.dispose(); + }); + + test('size is updated before group event fires', () => { + dockview.layout(1000, 1000); + + let counter = 0; + + const disposable = new CompositeDisposable( + dockview.onDidAddGroup(() => { + counter++; + expect(counter).toBe(dockview.size); + }), + dockview.onDidRemoveGroup(() => { + counter--; + expect(counter).toBe(dockview.size); + }) + ); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + position: { referencePanel: 'panel1', direction: 'within' }, + }); + + const panel3 = dockview.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel1', direction: 'right' }, + }); + + dockview.removePanel(panel1); + dockview.removePanel(panel3); + dockview.removePanel(panel2); + + disposable.dispose(); + }); + + test('events flow', () => { + dockview.layout(1000, 1000); + + let events: { + panel?: IDockviewPanel; + group?: GroupPanel | undefined; + type: string; + }[] = []; + + const disposable = new CompositeDisposable( + dockview.onDidAddGroup((group) => { + events.push({ type: 'ADD_GROUP', group }); + }), + dockview.onDidActiveGroupChange((group) => { + events.push({ type: 'ACTIVE_GROUP', group }); + }), + dockview.onDidRemoveGroup((group) => { + events.push({ type: 'REMOVE_GROUP', group }); + }), + dockview.onDidAddPanel((panel) => { + events.push({ type: 'ADD_PANEL', panel }); + }), + dockview.onDidRemovePanel((panel) => { + events.push({ type: 'REMOVE_PANEL', panel }); + }), + dockview.onDidActivePanelChange((panel) => { + events.push({ type: 'ACTIVE_PANEL', panel }); + }) + ); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + expect(panel1.group).toBeTruthy(); + + expect(events).toEqual([ + { type: 'ADD_GROUP', group: panel1.group }, + { type: 'ACTIVE_GROUP', group: panel1.group }, + { type: 'ADD_PANEL', panel: panel1 }, + { type: 'ACTIVE_PANEL', panel: panel1 }, + ]); + + events = []; + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + expect(events).toEqual([ + { type: 'ADD_PANEL', panel: panel2 }, + { type: 'ACTIVE_PANEL', panel: panel2 }, + ]); + + events = []; + const panel3 = dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + expect(events).toEqual([ + { type: 'ADD_PANEL', panel: panel3 }, + { type: 'ACTIVE_PANEL', panel: panel3 }, + ]); + + events = []; + dockview.removePanel(panel1); + expect(events).toEqual([{ type: 'REMOVE_PANEL', panel: panel1 }]); + + events = []; + dockview.removePanel(panel3); + expect(events).toEqual([ + { type: 'REMOVE_PANEL', panel: panel3 }, + { type: 'ACTIVE_PANEL', panel: panel2 }, + ]); + + events = []; + const panel4 = dockview.addPanel({ + id: 'panel4', + component: 'default', + position: { referencePanel: panel2.id, direction: 'right' }, + }); + + expect(panel4.group).toBeTruthy(); + expect(panel4.group).not.toBe(panel1.group); + + expect(events).toEqual([ + { type: 'ADD_GROUP', group: panel4.group }, + { type: 'ACTIVE_GROUP', group: panel4.group }, + { type: 'ADD_PANEL', panel: panel4 }, + { type: 'ACTIVE_PANEL', panel: panel4 }, + ]); + + events = []; + const panel5 = dockview.addPanel({ + id: 'panel5', + component: 'default', + position: { referencePanel: panel4.id, direction: 'within' }, + }); + expect(events).toEqual([ + { type: 'ADD_PANEL', panel: panel5 }, + { type: 'ACTIVE_PANEL', panel: panel5 }, + ]); + + events = []; + dockview.moveGroupOrPanel( + panel2.group!, + panel5.group!.id, + panel5.id, + Position.Center + ); + expect(events).toEqual([ + { type: 'REMOVE_PANEL', panel: panel5 }, + { type: 'ACTIVE_PANEL', panel: panel4 }, + { type: 'ADD_PANEL', panel: panel5 }, + { type: 'ACTIVE_PANEL', panel: panel5 }, + { type: 'ACTIVE_GROUP', group: panel2.group }, + { type: 'ACTIVE_PANEL', panel: panel5 }, + ]); + + events = []; + + const groupReferenceBeforeMove = panel4.group; + + dockview.moveGroupOrPanel( + panel2.group!, + panel4.group!.id, + panel4.id, + Position.Center + ); + + expect(events).toEqual([ + { type: 'REMOVE_PANEL', panel: panel4 }, + { type: 'REMOVE_GROUP', group: groupReferenceBeforeMove }, + { type: 'ADD_PANEL', panel: panel4 }, + { type: 'ACTIVE_PANEL', panel: panel4 }, + ]); + + disposable.dispose(); + }); + + test('that removing a panel from a group reflects in the dockviewcomponent when searching for a panel', () => { + dockview.layout(500, 500); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + + expect(dockview.getGroupPanel('panel1')).toEqual(panel1); + expect(dockview.getGroupPanel('panel2')).toEqual(panel2); + + panel1.group.model.removePanel(panel1); + + expect(dockview.getGroupPanel('panel1')).toBeUndefined(); + expect(dockview.getGroupPanel('panel2')).toEqual(panel2); + + dockview.removePanel(panel2); + + expect(dockview.getGroupPanel('panel1')).toBeUndefined(); + expect(dockview.getGroupPanel('panel2')).toBeUndefined(); + }); + + test('#1', () => { + dockview.layout(500, 500); + dockview.deserializer = { + fromJSON: (panelData: GroupviewPanelState): IDockviewPanel => { + return new TestGroupPanel( + panelData.id, + panelData.title, + dockview + ); + }, + }; + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel3 = dockview.addPanel({ + id: 'panel3', + component: 'default', + position: { referencePanel: 'panel2', direction: 'below' }, + }); + + const removedGroups: GroupPanel[] = []; + const removedPanels: IDockviewPanel[] = []; + + const disposable = new CompositeDisposable( + dockview.onDidRemoveGroup((group) => { + removedGroups.push(group); + }), + dockview.onDidRemovePanel((panel) => { + removedPanels.push(panel); + }) + ); + + dockview.fromJSON({ + grid: { + height: 500, + width: 500, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['view_1', 'view_2'], + id: 'group_1', + }, + }, + { + type: 'leaf', + data: { views: ['view_3'], id: 'group_2' }, + }, + ], + }, + }, + panels: { + view_1: { + id: 'view_1', + title: 'view_1_title', + view: {}, + }, + view_2: { + id: 'view_2', + title: 'view_2_title', + view: {}, + }, + view_3: { + id: 'view_3', + title: 'view_3_title', + view: {}, + }, + }, + options: {}, + }); + + expect(removedGroups.length).toBe(2); + expect(removedPanels.length).toBe(3); + + disposable.dispose(); + }); + + test('dispose of dockviewComponent', () => { + dockview.layout(500, 1000); + + dockview.addPanel({ + id: 'panel1', + component: 'default', + }); + dockview.addPanel({ + id: 'panel2', + component: 'default', + }); + dockview.addPanel({ + id: 'panel3', + component: 'default', + }); + dockview.addPanel({ + id: 'panel4', + component: 'default', + }); + + expect(container.childNodes.length).toBe(1); + + dockview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); + + test('panel is disposed of when closed', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { default: PanelContentPartTest }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + + expect(panel1Spy).not.toHaveBeenCalled(); + + panel1.api.close(); + + expect(panel1Spy).toBeCalledTimes(1); + }); + + test('can add panel of same id if already removed', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { default: PanelContentPartTest }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + expect(dockview.totalPanels).toBe(1); + + panel1.api.close(); + + expect(dockview.totalPanels).toBe(0); + + const panel1Again = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + expect(dockview.totalPanels).toBe(1); + + panel1Again.api.close(); + + expect(dockview.totalPanels).toBe(0); + }); + + test('last group is retained for watermark', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { default: PanelContentPartTest }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(1); + + const group = panel1.group; + + dockview.removePanel(panel1); + + expect(group.model.hasWatermark).toBeTruthy(); + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(0); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + }); + + expect(group.model.hasWatermark).toBeFalsy(); + + const panel3 = dockview.addPanel({ + id: 'panel3', + component: 'default', + tabComponent: 'default', + }); + + expect(dockview.size).toBe(1); + expect(dockview.totalPanels).toBe(2); + + panel2.api.close(); + expect(group.model.hasWatermark).toBeFalsy(); + panel3.api.close(); + expect(group.model.hasWatermark).toBeTruthy(); + }); + + test('panel is disposed of when removed', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { default: PanelContentPartTest }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + + expect(panel1Spy).not.toHaveBeenCalled(); + + dockview.removePanel(panel1); + + expect(panel1Spy).toBeCalledTimes(1); + }); + + test('panel is not disposed of when moved to a new group', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + position: { + referencePanel: 'panel1', + direction: 'right', + }, + }); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.moveGroupOrPanel( + panel1.group, + panel2.group.id, + 'panel2', + Position.Left + ); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).not.toHaveBeenCalled(); + }); + + test('panel is not disposed of when moved within another group', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + position: { + referencePanel: 'panel1', + direction: 'right', + }, + }); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.moveGroupOrPanel( + panel1.group, + panel2.group.id, + 'panel2', + Position.Center + ); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).not.toHaveBeenCalled(); + }); + + test('panel is not disposed of when moved within another group', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + }); + + expect(panel1.group).toEqual(panel2.group); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.moveGroupOrPanel( + panel1.group, + panel1.group.id, + 'panel1', + Position.Center, + 0 + ); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).not.toHaveBeenCalled(); + }); + + test('panel is disposed of when group is disposed', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + }); + + expect(panel1.group).toEqual(panel2.group); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.removeGroup(panel1.group); + + expect(panel1Spy).toBeCalledTimes(1); + expect(panel2Spy).toBeCalledTimes(1); + }); + + test('panel is disposed of when component is disposed', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + }); + + expect(panel1.group).toEqual(panel2.group); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.dispose(); + + expect(panel1Spy).toBeCalledTimes(1); + expect(panel2Spy).toBeCalledTimes(1); + }); + + test('panel is disposed of when from JSON is called', () => { + const container = document.createElement('div'); + + const dockview = new DockviewComponent(container, { + components: { + default: PanelContentPartTest, + }, + }); + dockview.deserializer = new ReactPanelDeserialzier(dockview); + + dockview.layout(500, 1000); + + const panel1 = dockview.addPanel({ + id: 'panel1', + component: 'default', + tabComponent: 'default', + }); + + const panel2 = dockview.addPanel({ + id: 'panel2', + component: 'default', + tabComponent: 'default', + }); + + expect(panel1.group).toEqual(panel2.group); + + const groupSpy = jest.spyOn(panel1.group, 'dispose'); + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + dockview.fromJSON({ + grid: { + height: 0, + width: 0, + root: { type: 'branch', data: [] }, + orientation: Orientation.HORIZONTAL, + }, + panels: {}, + }); + + expect(groupSpy).toBeCalledTimes(1); + expect(panel1Spy).toBeCalledTimes(1); + expect(panel2Spy).toBeCalledTimes(1); + }); + + test('fromJSON events should still fire', () => { + jest.useFakeTimers(); + + dockview.layout(1000, 1000); + + let addGroup: GroupPanel[] = []; + let removeGroup: GroupPanel[] = []; + let activeGroup: (GroupPanel | undefined)[] = []; + let addPanel: IDockviewPanel[] = []; + let removePanel: IDockviewPanel[] = []; + let activePanel: (IDockviewPanel | undefined)[] = []; + let layoutChange = 0; + let layoutChangeFromJson = 0; + + const disposable = new CompositeDisposable( + dockview.onDidAddGroup((panel) => { + addGroup.push(panel); + }), + dockview.onDidRemoveGroup((panel) => { + removeGroup.push(panel); + }), + dockview.onDidActiveGroupChange((event) => { + activeGroup.push(event); + }), + dockview.onDidAddPanel((panel) => { + addPanel.push(panel); + }), + dockview.onDidRemovePanel((panel) => { + removePanel.push(panel); + }), + dockview.onDidActivePanelChange((event) => { + activePanel.push(event); + }), + dockview.onDidLayoutChange(() => { + layoutChange++; + }), + dockview.onDidLayoutFromJSON(() => { + layoutChangeFromJson++; + }) + ); + + dockview.deserializer = new ReactPanelDeserialzier(dockview); + dockview.fromJSON({ + activeGroup: 'group-1', + grid: { + root: { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel1'], + id: 'group-1', + activeView: 'panel1', + }, + size: 500, + }, + { + type: 'branch', + data: [ + { + type: 'leaf', + data: { + views: ['panel2', 'panel3'], + id: 'group-2', + }, + size: 500, + }, + { + type: 'leaf', + data: { views: ['panel4'], id: 'group-3' }, + size: 500, + }, + ], + size: 250, + }, + { + type: 'leaf', + data: { views: ['panel5'], id: 'group-4' }, + size: 250, + }, + ], + size: 1000, + }, + height: 1000, + width: 1000, + orientation: Orientation.VERTICAL, + }, + panels: { + panel1: { + id: 'panel1', + view: { content: { id: 'default' } }, + title: 'panel1', + }, + panel2: { + id: 'panel2', + view: { content: { id: 'default' } }, + title: 'panel2', + }, + panel3: { + id: 'panel3', + view: { content: { id: 'default' } }, + title: 'panel3', + }, + panel4: { + id: 'panel4', + view: { content: { id: 'default' } }, + title: 'panel4', + }, + panel5: { + id: 'panel5', + view: { content: { id: 'default' } }, + title: 'panel5', + }, + }, + options: { tabHeight: 25 }, + }); + + jest.runAllTimers(); + + console.log(activePanel.map((_) => _?.id).join(' ')); + + expect(addGroup.length).toBe(4); + expect(removeGroup.length).toBe(0); + expect(activeGroup.length).toBe(1); + expect(addPanel.length).toBe(5); + expect(removePanel.length).toBe(0); + expect(activePanel.length).toBe(5); + expect(layoutChange).toBe(1); + expect(layoutChangeFromJson).toBe(1); + + addGroup = []; + removeGroup = []; + activeGroup = []; + addPanel = []; + removePanel = []; + activePanel = []; + layoutChange = 0; + layoutChangeFromJson = 0; + + dockview.fromJSON({ + grid: { + root: { + type: 'branch', + data: [], + size: 1000, + }, + height: 1000, + width: 1000, + orientation: Orientation.VERTICAL, + }, + panels: {}, + options: { tabHeight: 25 }, + }); + + jest.runAllTimers(); + + expect(addGroup.length).toBe(0); + expect(removeGroup.length).toBe(4); + expect(activeGroup.length).toBe(1); + expect(addPanel.length).toBe(0); + expect(removePanel.length).toBe(5); + expect(activePanel.length).toBe(1); + expect(layoutChange).toBe(1); + expect(layoutChangeFromJson).toBe(1); + + return disposable.dispose(); + }); + + // group is disposed of when dockview is disposed + // watermark is disposed of when removed + // watermark is disposed of when dockview is disposed +}); diff --git a/build/packages/dockview/src/__tests__/dockview/dockviewGroupPanel.spec.ts b/build/packages/dockview/src/__tests__/dockview/dockviewGroupPanel.spec.ts new file mode 100644 index 000000000..6187c5069 --- /dev/null +++ b/build/packages/dockview/src/__tests__/dockview/dockviewGroupPanel.spec.ts @@ -0,0 +1,114 @@ +import { DockviewComponent } from '../../dockview/dockviewComponent'; +import { DockviewApi } from '../../api/component.api'; +import { IGroupPanelView } from '../../dockview/defaultGroupPanelView'; +import { DockviewGroupPanel } from '../../dockview/dockviewGroupPanel'; +import { GroupPanel } from '../../groupview/groupviewPanel'; + +describe('dockviewGroupPanel', () => { + test('update title', () => { + const dockviewApiMock = jest.fn(() => { + return { + onDidActiveChange: jest.fn(), + } as any; + }); + const accessorMock = jest.fn(() => { + return {} as any; + }); + const groupMock = jest.fn(() => { + return {} as any; + }); + const api = new dockviewApiMock(); + const accessor = new accessorMock(); + const group = new groupMock(); + const cut = new DockviewGroupPanel('fake-id', accessor, api, group); + + let latestTitle: string | undefined = undefined; + + const disposable = cut.api.titleChanged((event) => { + latestTitle = event.title; + }); + + expect(cut.title).toBe(''); + + cut.init({ title: 'new title', params: {}, view: null }); + expect(latestTitle).toBe('new title'); + expect(cut.title).toBe('new title'); + + cut.update({ params: { title: 'another title' } }); + expect(latestTitle).toBe('another title'); + expect(cut.title).toBe('another title'); + + disposable.dispose(); + }); + + test('update suppress closable', () => { + const dockviewApiMock = jest.fn(() => { + return {} as any; + }); + const accessorMock = jest.fn(() => { + return {} as any; + }); + const groupMock = jest.fn(() => { + return {} as any; + }); + const api = new dockviewApiMock(); + const accessor = new accessorMock(); + const group = new groupMock(); + + const cut = new DockviewGroupPanel('fake-id', accessor, api, group); + + let latestSuppressClosable: boolean | undefined = undefined; + + const disposable = cut.api.suppressClosableChanged((event) => { + latestSuppressClosable = event.suppressClosable; + }); + + expect(latestSuppressClosable).toBeFalsy(); + + cut.init({ + title: 'new title', + suppressClosable: true, + params: {}, + view: null, + }); + expect(latestSuppressClosable).toBeTruthy(); + expect(cut.suppressClosable).toBeTruthy(); + + cut.update({ params: { suppressClosable: false } }); + expect(latestSuppressClosable).toBeFalsy(); + expect(cut.suppressClosable).toBeFalsy(); + + disposable.dispose(); + }); + + test('dispose cleanup', () => { + const dockviewApiMock = jest.fn(() => { + return {} as any; + }); + const accessorMock = jest.fn(() => { + return {} as any; + }); + const groupMock = jest.fn(() => { + return {} as any; + }); + const api = new dockviewApiMock(); + const accessor = new accessorMock(); + const group = new groupMock(); + + const cut = new DockviewGroupPanel('fake-id', accessor, api, group); + + const viewMock = jest.fn(() => { + return { + init: jest.fn(), + dispose: jest.fn(), + } as any; + }); + const view = new viewMock(); + + cut.init({ params: {}, view, title: 'title' }); + + cut.dispose(); + + expect(view.dispose).toHaveBeenCalled(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/events.spec.ts b/build/packages/dockview/src/__tests__/events.spec.ts new file mode 100644 index 000000000..69790cee4 --- /dev/null +++ b/build/packages/dockview/src/__tests__/events.spec.ts @@ -0,0 +1,100 @@ +import { Emitter, Event } from '../events'; + +describe('events', () => { + describe('emitter', () => { + it('should emit values', () => { + const emitter = new Emitter(); + let value: number | undefined = undefined; + + emitter.fire(-1); + expect(value).toBeUndefined(); + + const stream = emitter.event((x) => { + value = x; + }); + + emitter.fire(0); + expect(value).toBe(0); + + emitter.fire(1); + expect(value).toBe(1); + + stream.dispose(); + }); + + it('should stop emitting after dispose', () => { + const emitter = new Emitter(); + let value: number | undefined = undefined; + + const stream = emitter.event((x) => { + value = x; + }); + + emitter.fire(0); + expect(value).toBe(0); + + stream.dispose(); + + value = undefined; + emitter.fire(1); + expect(value).toBeUndefined(); + }); + + it('should stop emitting after dispose', () => { + const emitter = new Emitter(); + let value: number | undefined = undefined; + + const stream = emitter.event((x) => { + value = x; + }); + + emitter.fire(0); + expect(value).toBe(0); + + stream.dispose(); + + value = undefined; + emitter.fire(1); + expect(value).toBeUndefined(); + }); + + it('should relay last value in replay mode', () => { + const emitter = new Emitter({ replay: true }); + let value: number | undefined = undefined; + + emitter.fire(1); + + const stream = emitter.event((x) => { + value = x; + }); + expect(value).toBe(1); + + stream.dispose(); + }); + }); + + it('should emit a value when any event fires', () => { + const emitter1 = new Emitter(); + const emitter2 = new Emitter(); + const emitter3 = new Emitter(); + + let value: number | undefined = 0; + + const stream = Event.any( + emitter1.event, + emitter2.event, + emitter3.event + )((x) => { + value = x; + }); + + emitter2.fire(2); + expect(value).toBe(2); + + emitter1.fire(1); + expect(value).toBe(1); + + emitter3.fire(3); + expect(value).toBe(3); + }); +}); diff --git a/build/packages/dockview/src/__tests__/gridview/baseComponentGridview.spec.ts b/build/packages/dockview/src/__tests__/gridview/baseComponentGridview.spec.ts new file mode 100644 index 000000000..2019d8f3a --- /dev/null +++ b/build/packages/dockview/src/__tests__/gridview/baseComponentGridview.spec.ts @@ -0,0 +1,170 @@ +import { Emitter } from '../../events'; +import { + BaseGrid, + IGridPanelView, + BaseGridOptions, +} from '../../gridview/baseComponentGridview'; +import { IViewSize } from '../../gridview/gridview'; +import { CompositeDisposable } from '../../lifecycle'; +import { + PanelInitParameters, + PanelUpdateEvent, + Parameters, +} from '../../panel/types'; +import { LayoutPriority, Orientation } from '../../splitview/core/splitview'; + +class TestPanel implements IGridPanelView { + _onDidChange = new Emitter(); + readonly onDidChange = this._onDidChange.event; + + get isActive(): boolean { + return true; + } + + get params(): Record { + return {}; + } + + constructor( + public readonly id: string, + public readonly element: HTMLElement, + public readonly minimumWidth: number, + public readonly maximumWidth: number, + public readonly minimumHeight: number, + public readonly maximumHeight: number, + public priority: LayoutPriority, + public snap: boolean + ) {} + + init(params: PanelInitParameters): void { + // + } + + setActive(isActive: boolean): void { + // + } + + toJSON(): object { + return {}; + } + + layout(width: number, height: number): void { + // + } + + update(event: PanelUpdateEvent): void { + // + } + + focus(): void { + // + } + + fromJSON(json: object): void { + // + } + + dispose(): void { + // + } +} + +class ClassUnderTest extends BaseGrid { + constructor(element: HTMLElement, options: BaseGridOptions) { + super(element, options); + } + + doRemoveGroup( + group: TestPanel, + options?: { skipActive?: boolean; skipDispose?: boolean } + ): TestPanel { + return super.doRemoveGroup(group, options); + } + + doAddGroup(group: TestPanel, location?: number[], size?: number): void { + this._groups.set(group.id, { + value: group, + disposable: { + dispose: () => { + // + }, + }, + }); + super.doAddGroup(group, location, size); + } + + public fromJSON(data: any): void { + // + } + + public toJSON(): object { + return {}; + } + + public clear(): void { + // + } +} + +describe('baseComponentGridview', () => { + test('can add group', () => { + const cut = new ClassUnderTest(document.createElement('div'), { + orientation: Orientation.HORIZONTAL, + proportionalLayout: true, + }); + + const events: TestPanel[] = []; + + const disposable = new CompositeDisposable( + cut.onDidAddGroup((event) => { + events.push(event); + }), + cut.onDidRemoveGroup((event) => { + events.push(event); + }), + cut.onDidActiveGroupChange((event) => { + events.push(event); + }) + ); + + const panel1 = new TestPanel( + 'id', + document.createElement('div'), + 0, + 100, + 0, + 100, + LayoutPriority.Normal, + false + ); + + cut.doAddGroup(panel1); + + expect(events.length).toBe(2); + expect(events[0]).toBe(panel1); + expect(events[1]).toBe(panel1); + + const panel2 = new TestPanel( + 'id', + document.createElement('div'), + 0, + 100, + 0, + 100, + LayoutPriority.Normal, + false + ); + + cut.doAddGroup(panel2); + + expect(events.length).toBe(4); + expect(events[2]).toBe(panel2); + + cut.doRemoveGroup(panel1); + expect(events.length).toBe(5); + expect(events[4]).toBe(panel1); + + disposable.dispose(); + cut.dispose(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/gridview/gridview.spec.ts b/build/packages/dockview/src/__tests__/gridview/gridview.spec.ts new file mode 100644 index 000000000..9574f8069 --- /dev/null +++ b/build/packages/dockview/src/__tests__/gridview/gridview.spec.ts @@ -0,0 +1,28 @@ +import { Gridview } from '../../gridview/gridview'; +import { Orientation } from '../../splitview/core/splitview'; + +describe('gridview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + }); + + test('dispose of gridview', () => { + expect(container.childNodes.length).toBe(0); + + const gridview = new Gridview( + false, + { separatorBorder: '' }, + Orientation.HORIZONTAL + ); + + container.appendChild(gridview.element); + + expect(container.childNodes.length).toBe(1); + + gridview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); +}); diff --git a/build/packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts b/build/packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts new file mode 100644 index 000000000..19184a993 --- /dev/null +++ b/build/packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts @@ -0,0 +1,1886 @@ +import { GridviewComponent } from '../../gridview/gridviewComponent'; +import { GridviewPanel } from '../../gridview/gridviewPanel'; +import { CompositeDisposable } from '../../lifecycle'; +import { IFrameworkPart } from '../../panel/types'; +import { Orientation } from '../../splitview/core/splitview'; + +class TestGridview extends GridviewPanel { + constructor(id: string, componentName: string) { + super(id, componentName); + + this.element.id = id; + } + + getComponent(): IFrameworkPart { + return { + update: (params) => { + // + }, + dispose: () => { + // + }, + }; + } +} + +describe('gridview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + }); + + test('added views are visible by default', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + gridview.addPanel({ + id: 'panel_1', + component: 'default', + }); + + const panel = gridview.getPanel('panel_1'); + + expect(panel?.api.isVisible).toBeTruthy(); + }); + + test('remove panel', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + + expect(gridview.size).toBe(1); + + const panel1 = gridview.getPanel('panel1'); + + gridview.removePanel(panel1); + + expect(gridview.size).toBe(0); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + + expect(gridview.size).toBe(1); + }); + + test('active panel', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + gridview.addPanel({ + id: 'panel3', + component: 'default', + }); + + const panel1 = gridview.getPanel('panel1'); + const panel2 = gridview.getPanel('panel2'); + const panel3 = gridview.getPanel('panel3'); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeTruthy(); + + panel1.api.setActive(); + + expect(panel1.api.isActive).toBeTruthy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeFalsy(); + + panel2.api.setActive(); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeTruthy(); + expect(panel3.api.isActive).toBeFalsy(); + + panel3.api.setActive(); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeTruthy(); + + gridview.removePanel(panel3); + + expect(panel1.api.isActive).toBeTruthy(); + expect(panel2.api.isActive).toBeFalsy(); + + gridview.removePanel(panel1); + + expect(panel2.api.isActive).toBeTruthy(); + + gridview.removePanel(panel2); + }); + + test('deserialize and serialize a layout', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + visible: false, + data: { + id: 'panel_2', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + visible: true, + data: { + id: 'panel_3', + component: 'default', + snap: true, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + gridview.layout(800, 400, true); + + const panel1 = gridview.getPanel('panel_1'); + const panel2 = gridview.getPanel('panel_2'); + const panel3 = gridview.getPanel('panel_3'); + + expect(panel1?.api.isVisible).toBeTruthy(); + expect(panel1?.api.id).toBe('panel_1'); + expect(panel1?.api.isActive).toBeTruthy(); + expect(panel1?.api.isFocused).toBeFalsy(); + expect(panel1?.api.height).toBe(400); + expect(panel1?.api.width).toBe(300); + + expect(panel2?.api.isVisible).toBeFalsy(); + expect(panel2?.api.id).toBe('panel_2'); + expect(panel2?.api.isActive).toBeFalsy(); + expect(panel2?.api.isFocused).toBeFalsy(); + expect(panel2?.api.height).toBe(400); + expect(panel2?.api.width).toBe(0); + + expect(panel3?.api.isVisible).toBeTruthy(); + expect(panel3?.api.id).toBe('panel_3'); + expect(panel3?.api.isActive).toBeFalsy(); + expect(panel3?.api.isFocused).toBeFalsy(); + expect(panel3?.api.height).toBe(400); + expect(panel3?.api.width).toBe(500); + + panel2.api.setActive(); + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeTruthy(); + expect(panel3.api.isActive).toBeFalsy(); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + visible: false, + data: { + id: 'panel_2', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 500, + data: { + id: 'panel_3', + component: 'default', + snap: true, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('toJSON shouldnt fire any layout events', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(1000, 1000); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + gridview.addPanel({ + id: 'panel3', + component: 'default', + }); + gridview.addPanel({ + id: 'panel4', + component: 'default', + }); + + const disposable = gridview.onDidLayoutChange(() => { + fail('onDidLayoutChange shouldnt have been called'); + }); + + const result = gridview.toJSON(); + expect(result).toBeTruthy(); + + disposable.dispose(); + }); + + test('gridview events', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + let events: { group: GridviewPanel | undefined; type: string }[] = []; + + const disposable = new CompositeDisposable( + gridview.onDidAddGroup((group) => { + events.push({ type: 'ADD', group }); + }), + gridview.onDidActiveGroupChange((group) => { + events.push({ type: 'ACTIVE', group }); + }), + gridview.onDidRemoveGroup((group) => { + events.push({ type: 'REMOVE', group }); + }) + ); + + gridview.addPanel({ + id: 'panel_1', + component: 'default', + }); + + const panel1 = gridview.getPanel('panel_1'); + + expect(events).toEqual([ + { + type: 'ADD', + group: panel1, + }, + { + type: 'ACTIVE', + group: panel1, + }, + ]); + events = []; + + gridview.addPanel({ + id: 'panel_2', + component: 'default', + }); + + const panel2 = gridview.getPanel('panel_2'); + + expect(events).toEqual([ + { + type: 'ADD', + group: panel2, + }, + { + type: 'ACTIVE', + group: panel2, + }, + ]); + events = []; + + gridview.addPanel({ + id: 'panel_3', + component: 'default', + }); + + const panel3 = gridview.getPanel('panel_3'); + + expect(events).toEqual([ + { + type: 'ADD', + group: panel3, + }, + { + type: 'ACTIVE', + group: panel3, + }, + ]); + events = []; + + gridview.removePanel(panel2); + + expect(events).toEqual([ + { + type: 'REMOVE', + group: panel2, + }, + ]); + events = []; + + gridview.removePanel(panel3); + + expect(events).toEqual([ + { + type: 'REMOVE', + group: panel3, + }, + { + type: 'ACTIVE', + group: panel1, + }, + ]); + events = []; + + gridview.removePanel(panel1); + + expect(events).toEqual([ + { + type: 'REMOVE', + group: panel1, + }, + { + type: 'ACTIVE', + group: undefined, + }, + ]); + events = []; + + disposable.dispose(); + }); + + test('dispose of gridviewComponent', () => { + expect(container.childNodes.length).toBe(0); + + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + gridview.addPanel({ + id: 'panel3', + component: 'default', + }); + + expect(container.childNodes.length).toBeGreaterThan(0); + + gridview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); + + test('#1/VERTICAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#2/HORIZONTAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + // gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 800, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + // gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 800, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#3/HORIZONTAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + // gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + // gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#4/HORIZONTAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + // gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + // gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 400, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#5/VERTICAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + // gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + // gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#5/VERTICAL/proportional/false', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#6/VERTICAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + // gridview.layout(800, 400); + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + // gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#7/VERTICAL layout first', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(800, 400); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#8/VERTICAL layout after', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + gridview.layout(800, 400, true); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.VERTICAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 200, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 100, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#9/HORIZONTAL', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#9/HORIZONTAL/proportional/false', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('#10/HORIZONTAL scale x:1.5 y:2', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + // relayout to a few random sizes + gridview.layout(234, 654); + gridview.layout(4532, 34562); + gridview.layout(1200, 800); + + expect(JSON.parse(JSON.stringify(gridview.toJSON()))).toEqual({ + grid: { + height: 800, + width: 1200, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 800, + data: [ + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 600, + data: [ + { + type: 'leaf', + size: 500, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 300, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + }); + + test('panel is disposed of when component is disposed', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + + gridview.layout(1000, 1000); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = gridview.getPanel('panel1'); + const panel2 = gridview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + gridview.dispose(); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when removed', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + gridview.layout(1000, 1000); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = gridview.getPanel('panel1'); + const panel2 = gridview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + gridview.removePanel(panel2); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when fromJSON is called', () => { + const gridview = new GridviewComponent(container, { + proportionalLayout: false, + orientation: Orientation.VERTICAL, + components: { default: TestGridview }, + }); + gridview.layout(1000, 1000); + + gridview.addPanel({ + id: 'panel1', + component: 'default', + }); + gridview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = gridview.getPanel('panel1'); + const panel2 = gridview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + gridview.fromJSON({ + grid: { + height: 0, + width: 0, + root: { type: 'branch', data: [] }, + orientation: Orientation.HORIZONTAL, + }, + }); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('fromJSON events should still fire', () => { + jest.useFakeTimers(); + + const gridview = new GridviewComponent(container, { + proportionalLayout: true, + orientation: Orientation.HORIZONTAL, + components: { default: TestGridview }, + }); + + let addGroup: GridviewPanel[] = []; + let removeGroup: GridviewPanel[] = []; + let activeGroup: (GridviewPanel | undefined)[] = []; + let layoutChange = 0; + let layoutChangeFromJson = 0; + + const disposable = new CompositeDisposable( + gridview.onDidAddGroup((panel) => { + addGroup.push(panel); + }), + gridview.onDidRemoveGroup((panel) => { + removeGroup.push(panel); + }), + gridview.onDidActiveGroupChange((event) => { + activeGroup.push(event); + }), + gridview.onDidLayoutChange(() => { + layoutChange++; + }), + gridview.onDidLayoutFromJSON(() => { + layoutChangeFromJson++; + }) + ); + + gridview.fromJSON({ + grid: { + height: 400, + width: 800, + orientation: Orientation.HORIZONTAL, + root: { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 200, + data: { + id: 'panel_1', + component: 'default', + snap: false, + }, + }, + { + type: 'branch', + size: 400, + data: [ + { + type: 'leaf', + size: 250, + data: { + id: 'panel_2', + component: 'default', + snap: false, + }, + }, + { + type: 'leaf', + size: 150, + data: { + id: 'panel_3', + component: 'default', + snap: false, + }, + }, + ], + }, + { + type: 'leaf', + size: 200, + data: { + id: 'panel_4', + component: 'default', + snap: false, + }, + }, + ], + }, + }, + activePanel: 'panel_1', + }); + + jest.runAllTimers(); + + expect(addGroup.length).toBe(4); + expect(removeGroup.length).toBe(0); + expect(activeGroup.length).toBe(1); + expect(activeGroup[0]).toEqual(gridview.getPanel('panel_1')); + expect(layoutChange).toBe(1); + expect(layoutChangeFromJson).toBe(1); + + addGroup = []; + activeGroup = []; + + gridview.fromJSON({ + grid: { + height: 0, + width: 0, + root: { type: 'branch', data: [] }, + orientation: Orientation.HORIZONTAL, + }, + }); + + jest.runAllTimers(); + + expect(addGroup.length).toBe(0); + expect(removeGroup.length).toBe(4); + expect(activeGroup.length).toBe(1); + expect(layoutChange).toBe(2); + expect(layoutChangeFromJson).toBe(2); + + return disposable.dispose(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/groupview/groupview.spec.ts b/build/packages/dockview/src/__tests__/groupview/groupview.spec.ts new file mode 100644 index 000000000..838d7affa --- /dev/null +++ b/build/packages/dockview/src/__tests__/groupview/groupview.spec.ts @@ -0,0 +1,571 @@ +import { DockviewComponent } from '../../dockview/dockviewComponent'; +import { + GroupviewPanelState, + IDockviewPanel, + IGroupPanelInitParameters, +} from '../../groupview/groupPanel'; +import { + GroupPanelPartInitParameters, + IContentRenderer, + ITabRenderer, + IWatermarkRenderer, +} from '../../groupview/types'; +import { PanelUpdateEvent } from '../../panel/types'; +import { + GroupChangeKind2, + GroupOptions, + Groupview, +} from '../../groupview/groupview'; +import { + DockviewPanelApi, + DockviewPanelApiImpl, +} from '../../api/groupPanelApi'; +import { + DefaultGroupPanelView, + IGroupPanelView, +} from '../../dockview/defaultGroupPanelView'; +import { GroupPanel } from '../../groupview/groupviewPanel'; +import { DockviewApi } from '../../api/component.api'; + +class Watermark implements IWatermarkRenderer { + public readonly element = document.createElement('div'); + + get id() { + return 'watermark-id'; + } + + init(params: GroupPanelPartInitParameters) { + // + } + + layout(width: number, height: number) { + // noop + } + + update(event: PanelUpdateEvent) { + // noop + } + + focus() { + // noop + } + + toJSON() { + return {}; + } + + updateParentGroup() { + // + } + + dispose() { + // + } +} + +class TestContentPart implements IContentRenderer { + public element = document.createElement('div'); + + constructor(public readonly id: string) { + this.element.className = `content-part-${id}`; + } + + init(params: GroupPanelPartInitParameters) { + //noop + } + + layout(width: number, height: number) { + //noop + } + + update(event: PanelUpdateEvent) { + //void + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean) { + //noop + } + + focus() { + //noop + } + + dispose() { + //noop + } + + toJSON() { + return {}; + } +} +class TestHeaderPart implements ITabRenderer { + public element = document.createElement('div'); + + constructor(public readonly id: string) { + this.element.className = `header-part-${id}`; + } + + init(params: GroupPanelPartInitParameters) { + //noop + } + + layout(width: number, height: number) { + //noop + } + + update(event: PanelUpdateEvent) { + //void + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean) { + //noop + } + + focus() { + //noop + } + + dispose() { + //noop + } + + toJSON() { + return {}; + } +} + +class TestPanel implements IDockviewPanel { + private _view: IGroupPanelView | undefined; + private _group: GroupPanel | undefined; + private _params: IGroupPanelInitParameters; + + get title() { + return ''; + } + + get suppressClosable() { + return false; + } + + get group() { + return this._group; + } + + get view() { + return this._view; + } + + get params(): Record { + return {}; + } + + constructor(public readonly id: string, public api: DockviewPanelApi) { + this.init({ + view: new DefaultGroupPanelView({ + tab: new TestHeaderPart(id), + content: new TestContentPart(id), + }), + title: `${id}`, + params: {}, + }); + } + + init(params: IGroupPanelInitParameters) { + this._view = params.view; + + this._params = params; + } + + updateParentGroup(group: GroupPanel, isGroupActive: boolean) { + this._group = group; + } + + layout(width: number, height: number) { + //noop + } + + update(event: PanelUpdateEvent) { + //noop + } + + focus() { + //noop + } + + toJSON(): GroupviewPanelState { + return { + id: this.id, + view: this._view.toJSON(), + title: this._params?.title, + }; + } + + dispose() { + //noop + } +} + +describe('groupview', () => { + let groupview: GroupPanel; + let dockview: DockviewComponent; + let options: GroupOptions; + + let removePanelMock: jest.Mock; + let removeGroupMock: jest.Mock; + + beforeEach(() => { + removePanelMock = jest.fn(); + removeGroupMock = jest.fn(); + + dockview = (>{ + options: {}, + createWatermarkComponent: () => new Watermark(), + doSetGroupActive: jest.fn(), + id: 'dockview-1', + removePanel: removePanelMock, + removeGroup: removeGroupMock, + }) as DockviewComponent; + + options = { + tabHeight: 30, + }; + groupview = new GroupPanel(dockview, 'groupview-1', options); + groupview.initialize(); + }); + + test('serialized layout shows active panel', () => { + const panel1 = new TestPanel('panel1', jest.fn() as any); + const panel2 = new TestPanel('panel2', jest.fn() as any); + const panel3 = new TestPanel('panel3', jest.fn() as any); + + const groupview2 = new GroupPanel(dockview, 'groupview-2', { + tabHeight: 25, + panels: [panel1, panel2, panel3], + activePanel: panel2, + }); + groupview2.initialize(); + + expect(groupview2.model.activePanel).toBe(panel2); + + expect( + groupview2.element.querySelector('.content-part-panel1') + ).toBeFalsy(); + expect( + groupview2.element.querySelector('.content-part-panel2') + ).toBeTruthy(); + expect( + groupview2.element.querySelector('.content-part-panel3') + ).toBeFalsy(); + }); + + test('panel events are captured during de-serialization', () => { + const panel1 = new TestPanel('panel1', jest.fn() as any); + const panel2 = new TestPanel('panel2', jest.fn() as any); + const panel3 = new TestPanel('panel3', jest.fn() as any); + + const groupview2 = new GroupPanel(dockview, 'groupview-2', { + tabHeight: 25, + panels: [panel1, panel2, panel3], + activePanel: panel2, + }); + + const events: Array<{ + kind: GroupChangeKind2; + }> = []; + const disposable = groupview2.model.onDidGroupChange((e) => { + events.push(e); + }); + + groupview2.initialize(); + + expect(events).toEqual([ + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel1, + }, + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel2, + }, + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel3, + }, + { + kind: GroupChangeKind2.PANEL_ACTIVE, + panel: panel2, + }, + ]); + + disposable.dispose(); + }); + + test('panel events flow', () => { + let events: Array<{ + kind: GroupChangeKind2; + }> = []; + const disposable = groupview.model.onDidGroupChange((e) => { + events.push(e); + }); + + const panel1 = new TestPanel('panel1', jest.fn() as any); + const panel2 = new TestPanel('panel2', jest.fn() as any); + const panel3 = new TestPanel('panel3', jest.fn() as any); + + expect(events.length).toBe(0); + + groupview.model.openPanel(panel1); + expect(events).toEqual([ + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel1, + }, + { + kind: GroupChangeKind2.PANEL_ACTIVE, + panel: panel1, + }, + ]); + events = []; + + groupview.model.openPanel(panel2); + expect(events).toEqual([ + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel2, + }, + { + kind: GroupChangeKind2.PANEL_ACTIVE, + panel: panel2, + }, + ]); + events = []; + + groupview.model.openPanel(panel3); + expect(events).toEqual([ + { + kind: GroupChangeKind2.ADD_PANEL, + panel: panel3, + }, + { + kind: GroupChangeKind2.PANEL_ACTIVE, + panel: panel3, + }, + ]); + events = []; + + groupview.model.removePanel(panel3); + expect(events).toEqual([ + { + kind: GroupChangeKind2.REMOVE_PANEL, + panel: panel3, + }, + { + kind: GroupChangeKind2.PANEL_ACTIVE, + panel: panel2, + }, + ]); + events = []; + + groupview.model.removePanel(panel1); + expect(events).toEqual([ + { + kind: GroupChangeKind2.REMOVE_PANEL, + panel: panel1, + }, + ]); + events = []; + + groupview.model.removePanel(panel2); + expect(events).toEqual([ + { + kind: GroupChangeKind2.REMOVE_PANEL, + panel: panel2, + }, + ]); + events = []; + + disposable.dispose(); + }); + + test('moveToPrevious and moveToNext', () => { + const panel1 = new TestPanel('panel1', jest.fn() as any); + const panel2 = new TestPanel('panel2', jest.fn() as any); + const panel3 = new TestPanel('panel3', jest.fn() as any); + + groupview.model.openPanel(panel1); + groupview.model.openPanel(panel2); + groupview.model.openPanel(panel3); + + groupview.model.openPanel(panel2); // set active + + groupview.model.moveToPrevious(); + expect(groupview.model.activePanel).toBe(panel1); + + groupview.model.moveToPrevious({ suppressRoll: true }); + expect(groupview.model.activePanel).toBe(panel1); + + groupview.model.moveToPrevious(); + expect(groupview.model.activePanel).toBe(panel3); + + groupview.model.moveToNext({ suppressRoll: true }); + expect(groupview.model.activePanel).toBe(panel3); + + groupview.model.moveToNext({ suppressRoll: false }); + expect(groupview.model.activePanel).toBe(panel1); + + groupview.model.moveToPrevious({ suppressRoll: false }); + expect(groupview.model.activePanel).toBe(panel3); + + groupview.model.moveToNext(); + groupview.model.moveToNext(); + expect(groupview.model.activePanel).toBe(panel2); + }); + + test('default', () => { + let viewQuery = groupview.element.querySelectorAll( + '.groupview > .tabs-and-actions-container' + ); + expect(viewQuery).toBeTruthy(); + + viewQuery = groupview.element.querySelectorAll( + '.groupview > .content-container' + ); + expect(viewQuery).toBeTruthy(); + }); + + test('closeAllPanels with panels', () => { + const panel1 = new TestPanel('panel1', jest.fn() as any); + const panel2 = new TestPanel('panel2', jest.fn() as any); + const panel3 = new TestPanel('panel3', jest.fn() as any); + + groupview.model.openPanel(panel1); + groupview.model.openPanel(panel2); + groupview.model.openPanel(panel3); + + groupview.model.closeAllPanels(); + + expect(removePanelMock).toBeCalledWith(panel1); + expect(removePanelMock).toBeCalledWith(panel2); + expect(removePanelMock).toBeCalledWith(panel3); + }); + + test('closeAllPanels with no panels', () => { + groupview.model.closeAllPanels(); + expect(removeGroupMock).toBeCalledWith(groupview); + }); + + test('that group is set on panel during onDidAddPanel event', () => { + const cut = new DockviewComponent(document.createElement('div'), { + components: { + component: TestContentPart, + }, + }); + + const disposable = cut.onDidAddPanel((panel) => { + expect(panel.group).toBeTruthy(); + }); + + const panel = cut.addPanel({ id: 'id', component: 'component' }); + disposable.dispose(); + }); + + test('toJSON() default', () => { + const dockviewComponent = new DockviewComponent( + document.createElement('div'), + { + components: { + component: TestContentPart, + }, + } + ); + + const cut = new Groupview( + document.createElement('div'), + dockviewComponent, + 'id', + {}, + null + ); + + expect(cut.toJSON()).toEqual({ + views: [], + activeView: undefined, + id: 'id', + }); + }); + + test('toJSON() locked and hideHeader', () => { + const dockviewComponent = new DockviewComponent( + document.createElement('div'), + { + components: { + component: TestContentPart, + }, + } + ); + + const cut = new Groupview( + document.createElement('div'), + dockviewComponent, + 'id', + {}, + null + ); + + cut.locked = true; + cut.header.hidden = true; + + expect(cut.toJSON()).toEqual({ + views: [], + activeView: undefined, + id: 'id', + locked: true, + hideHeader: true, + }); + }); + + test("that openPanel with skipSetActive doesn't set panel to active", () => { + const dockviewComponent = new DockviewComponent( + document.createElement('div'), + { + components: { + component: TestContentPart, + }, + } + ); + + const groupviewContainer = document.createElement('div'); + const cut = new Groupview( + groupviewContainer, + dockviewComponent, + 'id', + {}, + null + ); + const contentContainer = groupviewContainer + .getElementsByClassName('content-container') + .item(0).childNodes; + + const panel1 = new TestPanel('id_1', null); + + cut.openPanel(panel1); + expect(contentContainer.length).toBe(1); + expect(contentContainer.item(0)).toBe(panel1.view.content.element); + + const panel2 = new TestPanel('id_2', null); + + cut.openPanel(panel2); + expect(contentContainer.length).toBe(1); + expect(contentContainer.item(0)).toBe(panel2.view.content.element); + + const panel3 = new TestPanel('id_2', null); + + cut.openPanel(panel3, { skipSetPanelActive: true }); + expect(contentContainer.length).toBe(1); + expect(contentContainer.item(0)).toBe(panel2.view.content.element); + + cut.openPanel(panel3); + expect(contentContainer.length).toBe(1); + expect(contentContainer.item(0)).toBe(panel3.view.content.element); + }); +}); diff --git a/build/packages/dockview/src/__tests__/groupview/panel/content.spec.ts b/build/packages/dockview/src/__tests__/groupview/panel/content.spec.ts new file mode 100644 index 000000000..e261fa44d --- /dev/null +++ b/build/packages/dockview/src/__tests__/groupview/panel/content.spec.ts @@ -0,0 +1,140 @@ +import { fireEvent } from '@testing-library/dom'; +import { Emitter, Event } from '../../../events'; +import { ContentContainer } from '../../../groupview/panel/content'; +import { + GroupPanelContentPartInitParameters, + IContentRenderer, +} from '../../../groupview/types'; +import { CompositeDisposable } from '../../../lifecycle'; +import { PanelUpdateEvent } from '../../../panel/types'; +import { IGroupPanelView } from '../../../dockview/defaultGroupPanelView'; +import { IDockviewPanel } from '../../../groupview/groupPanel'; +import { GroupPanel } from '../../../groupview/groupviewPanel'; + +class TestContentRenderer + extends CompositeDisposable + implements IContentRenderer +{ + readonly element: HTMLElement; + + readonly _onDidFocus = new Emitter(); + readonly _onDidBlur = new Emitter(); + readonly onDidFocus: Event = this._onDidFocus.event; + readonly onDidBlur: Event = this._onDidBlur.event; + + constructor(public id: string) { + super(); + this.element = document.createElement('div'); + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void { + // + } + + init(parameters: GroupPanelContentPartInitParameters): void { + // + } + + layout(width: number, height: number): void { + // + } + update(event: PanelUpdateEvent): void { + // + } + + toJSON(): object { + return {}; + } + + focus(): void { + // + } +} + +describe('contentContainer', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + test('basic focus test', () => { + let focus = 0; + let blur = 0; + + const disposable = new CompositeDisposable(); + const cut = new ContentContainer(); + + disposable.addDisposables( + cut.onDidFocus(() => { + focus++; + }), + cut.onDidBlur(() => { + blur++; + }) + ); + + const contentRenderer = new TestContentRenderer('id-1'); + + const panel = { + view: { + content: contentRenderer, + } as Partial, + } as Partial; + + cut.openPanel(panel as IDockviewPanel); + + expect(focus).toBe(0); + expect(blur).toBe(0); + + // container has focus within + fireEvent.focus(contentRenderer.element); + expect(focus).toBe(1); + expect(blur).toBe(0); + + // container looses focus + fireEvent.blur(contentRenderer.element); + jest.runAllTimers(); + expect(focus).toBe(1); + expect(blur).toBe(1); + + // renderer explicitly asks for focus + contentRenderer._onDidFocus.fire(); + expect(focus).toBe(2); + expect(blur).toBe(1); + + // renderer explicitly looses focus + contentRenderer._onDidBlur.fire(); + expect(focus).toBe(2); + expect(blur).toBe(2); + + const contentRenderer2 = new TestContentRenderer('id-2'); + + const panel2 = { + view: { + content: contentRenderer2, + } as Partial, + } as Partial; + + cut.openPanel(panel2 as IDockviewPanel); + expect(focus).toBe(2); + expect(blur).toBe(2); + + // previous renderer events should no longer be attached to container + contentRenderer._onDidFocus.fire(); + contentRenderer._onDidBlur.fire(); + expect(focus).toBe(2); + expect(blur).toBe(2); + + // new panel recieves focus + fireEvent.focus(contentRenderer2.element); + expect(focus).toBe(3); + expect(blur).toBe(2); + + // new panel looses focus + fireEvent.blur(contentRenderer2.element); + jest.runAllTimers(); + expect(focus).toBe(3); + expect(blur).toBe(3); + + disposable.dispose(); + }); +}); diff --git a/build/packages/dockview/src/__tests__/groupview/tab.spec.ts b/build/packages/dockview/src/__tests__/groupview/tab.spec.ts new file mode 100644 index 000000000..a1e3c762e --- /dev/null +++ b/build/packages/dockview/src/__tests__/groupview/tab.spec.ts @@ -0,0 +1,25 @@ +import { Tab } from '../../groupview/tab'; + +describe('tab', () => { + test('that empty tab has inactive-tab class', () => { + const accessorMock = jest.fn(); + const groupMock = jest.fn(); + + const cut = new Tab('panelId', new accessorMock(), new groupMock()); + + expect(cut.element.className).toBe('tab inactive-tab'); + }); + + test('that active tab has active-tab class', () => { + const accessorMock = jest.fn(); + const groupMock = jest.fn(); + + const cut = new Tab('panelId', new accessorMock(), new groupMock()); + + cut.setActive(true); + expect(cut.element.className).toBe('tab active-tab'); + + cut.setActive(false); + expect(cut.element.className).toBe('tab inactive-tab'); + }); +}); diff --git a/build/packages/dockview/src/__tests__/lifecycle.spec.ts b/build/packages/dockview/src/__tests__/lifecycle.spec.ts new file mode 100644 index 000000000..100b04f5b --- /dev/null +++ b/build/packages/dockview/src/__tests__/lifecycle.spec.ts @@ -0,0 +1,51 @@ +import { CompositeDisposable, MutableDisposable } from '../lifecycle'; + +describe('lifecycle', () => { + test('mutable disposable', () => { + const mutableDisposable = new MutableDisposable(); + + let disposed = 0; + + const disposable = () => ({ + dispose: () => { + disposed++; + }, + }); + + mutableDisposable.value = disposable(); + expect(disposed).toBe(0); + + mutableDisposable.value = disposable(); + expect(disposed).toBe(1); + + mutableDisposable.dispose(); + expect(disposed).toBe(2); + + mutableDisposable.dispose(); + }); + + test('composite disposable', () => { + const d1 = { + dispose: jest.fn(), + }; + const d2 = { + dispose: jest.fn(), + }; + const d3 = { + dispose: jest.fn(), + }; + const d4 = { + dispose: jest.fn(), + }; + + const cut = new CompositeDisposable(d1, d2); + cut.addDisposables(d3, d4); + + cut.dispose(); + + expect(d1.dispose).toHaveBeenCalledTimes(1); + expect(d2.dispose).toHaveBeenCalledTimes(1); + expect(d3.dispose).toHaveBeenCalledTimes(1); + expect(d4.dispose).toHaveBeenCalledTimes(1); + }); +}); diff --git a/build/packages/dockview/src/__tests__/math.spec.ts b/build/packages/dockview/src/__tests__/math.spec.ts new file mode 100644 index 000000000..6b1e26d4b --- /dev/null +++ b/build/packages/dockview/src/__tests__/math.spec.ts @@ -0,0 +1,17 @@ +import { clamp } from '../math'; + +describe('math', () => { + describe('clamp', () => { + it('should clamp between a minimum and maximum value', () => { + expect(clamp(45, 40, 50)).toBe(45); + expect(clamp(35, 40, 50)).toBe(40); + expect(clamp(55, 40, 50)).toBe(50); + }); + + it('should throw an error if min > max', () => { + expect(() => clamp(55, 50, 40)).toThrow( + '50 > 40 is an invalid condition' + ); + }); + }); +}); diff --git a/build/packages/dockview/src/__tests__/panel/componentFactory.spec.ts b/build/packages/dockview/src/__tests__/panel/componentFactory.spec.ts new file mode 100644 index 000000000..3fc2c0c53 --- /dev/null +++ b/build/packages/dockview/src/__tests__/panel/componentFactory.spec.ts @@ -0,0 +1,102 @@ +import { createComponent } from '../../panel/componentFactory'; + +describe('componentFactory', () => { + describe('createComponent', () => { + test('valid component and framework component', () => { + const mock = jest.fn(); + const mock2 = jest.fn(); + + expect(() => + createComponent( + 'id-1', + 'component-1', + { 'component-1': mock }, + { 'component-1': mock2 } + ) + ).toThrow( + "Cannot create 'id-1'. component 'component-1' registered as both a component and frameworkComponent" + ); + }); + + test('valid framework component but no factory', () => { + const mock = jest.fn(); + + expect(() => + createComponent( + 'id-1', + 'component-1', + {}, + { 'component-1': mock } + ) + ).toThrow( + "Cannot create 'id-1' for framework component 'component-1'. you must register a frameworkPanelWrapper to use framework components" + ); + }); + + test('valid framework component', () => { + const component = jest.fn(); + const createComponentFn = jest + .fn() + .mockImplementation(() => component); + const frameworkComponent = jest.fn(); + + expect( + createComponent( + 'id-1', + 'component-1', + {}, + { 'component-1': frameworkComponent }, + { + createComponent: createComponentFn, + } + ) + ).toBe(component); + + expect(createComponentFn).toHaveBeenCalledWith( + 'id-1', + 'component-1', + frameworkComponent + ); + }); + + test('no valid component with fallback', () => { + const mock = jest.fn(); + + expect( + createComponent( + 'id-1', + 'component-1', + {}, + {}, + { + createComponent: () => null, + }, + () => mock + ) + ).toBe(mock); + }); + + test('no valid component', () => { + expect(() => + createComponent('id-1', 'component-1', {}, {}) + ).toThrow( + "Cannot create 'id-1', no component 'component-1' provided" + ); + }); + + test('valid component', () => { + const component = jest.fn(); + + const componentResult = createComponent( + 'id-1', + 'component-1', + { 'component-1': component }, + {} + ); + + expect(component).toHaveBeenCalled(); + + expect(componentResult instanceof component); + }); + }); +}); diff --git a/build/packages/dockview/src/__tests__/paneview/paneview.spec.ts b/build/packages/dockview/src/__tests__/paneview/paneview.spec.ts new file mode 100644 index 000000000..1abefcf0c --- /dev/null +++ b/build/packages/dockview/src/__tests__/paneview/paneview.spec.ts @@ -0,0 +1,139 @@ +import { CompositeDisposable } from '../../lifecycle'; +import { Paneview } from '../../paneview/paneview'; +import { + IPaneBodyPart, + IPaneHeaderPart, + PaneviewPanel, +} from '../../paneview/paneviewPanel'; +import { Orientation } from '../../splitview/core/splitview'; + +class TestPanel extends PaneviewPanel { + protected getBodyComponent(): IPaneBodyPart { + return { + element: document.createElement('div'), + update: () => { + // + }, + dispose: () => { + // + }, + init: () => { + // / + }, + }; + } + + protected getHeaderComponent(): IPaneHeaderPart { + return { + element: document.createElement('div'), + update: () => { + // + }, + dispose: () => { + // + }, + init: () => { + // / + }, + }; + } +} + +describe('paneview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + container.className = 'container'; + }); + + test('onDidAddView and onDidRemoveView events', () => { + const paneview = new Paneview(container, { + orientation: Orientation.HORIZONTAL, + }); + + const added: PaneviewPanel[] = []; + const removed: PaneviewPanel[] = []; + + const disposable = new CompositeDisposable( + paneview.onDidAddView((view) => added.push(view)), + paneview.onDidRemoveView((view) => removed.push(view)) + ); + + const view1 = new TestPanel( + 'id', + 'component', + 'headerComponent', + Orientation.VERTICAL, + true, + true + ); + const view2 = new TestPanel( + 'id2', + 'component', + 'headerComponent', + Orientation.VERTICAL, + true, + true + ); + + expect(added.length).toBe(0); + expect(removed.length).toBe(0); + + paneview.addPane(view1); + expect(added.length).toBe(1); + expect(removed.length).toBe(0); + expect(added[0]).toBe(view1); + + paneview.addPane(view2); + expect(added.length).toBe(2); + expect(removed.length).toBe(0); + expect(added[1]).toBe(view2); + + paneview.removePane(0); + expect(added.length).toBe(2); + expect(removed.length).toBe(1); + expect(removed[0]).toBe(view1); + + paneview.removePane(0); + expect(added.length).toBe(2); + expect(removed.length).toBe(2); + expect(removed[1]).toBe(view2); + + disposable.dispose(); + }); + + test('dispose of paneview', () => { + expect(container.childNodes.length).toBe(0); + + const paneview = new Paneview(container, { + orientation: Orientation.HORIZONTAL, + }); + + const view1 = new TestPanel( + 'id', + 'component', + 'headerComponent', + Orientation.VERTICAL, + true, + true + ); + const view2 = new TestPanel( + 'id2', + 'component', + 'headerComponent', + Orientation.VERTICAL, + true, + true + ); + + paneview.addPane(view1); + paneview.addPane(view2); + + expect(container.childNodes.length).toBeGreaterThan(0); + + paneview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); +}); diff --git a/build/packages/dockview/src/__tests__/paneview/paneviewComponent.spec.ts b/build/packages/dockview/src/__tests__/paneview/paneviewComponent.spec.ts new file mode 100644 index 000000000..f47da6f5d --- /dev/null +++ b/build/packages/dockview/src/__tests__/paneview/paneviewComponent.spec.ts @@ -0,0 +1,404 @@ +import { PanelDimensionChangeEvent } from '../../api/panelApi'; +import { CompositeDisposable } from '../../lifecycle'; +import { PanelUpdateEvent } from '../../panel/types'; +import { PaneviewComponent } from '../../paneview/paneviewComponent'; +import { + PaneviewPanel, + IPaneBodyPart, + IPaneHeaderPart, + PanePanelComponentInitParameter, +} from '../../paneview/paneviewPanel'; +import { Orientation } from '../../splitview/core/splitview'; + +class TestPanel extends PaneviewPanel { + constructor(id: string, component: string) { + super(id, component, 'header', Orientation.VERTICAL, false, true); + } + + getHeaderComponent() { + return new (class Header implements IPaneHeaderPart { + private _element: HTMLElement = document.createElement('div'); + + get element() { + return this._element; + } + + init(params: PanePanelComponentInitParameter) { + // + } + + update(params: PanelUpdateEvent) { + // + } + + dispose() { + // + } + })(); + } + + getBodyComponent() { + return new (class Header implements IPaneBodyPart { + private _element: HTMLElement = document.createElement('div'); + + get element() { + return this._element; + } + + init(params: PanePanelComponentInitParameter) { + // + } + + update(params: PanelUpdateEvent) { + // + } + + dispose() { + // + } + })(); + } +} + +describe('componentPaneview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + container.className = 'container'; + }); + + test('vertical panels', () => { + const disposables = new CompositeDisposable(); + + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.layout(600, 400); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel2', + }); + + const panel1 = paneview.getPanel('panel1') as PaneviewPanel; + const panel2 = paneview.getPanel('panel2') as PaneviewPanel; + + let panel1Dimensions: PanelDimensionChangeEvent | undefined = undefined; + disposables.addDisposables( + panel1.api.onDidDimensionsChange((event) => { + panel1Dimensions = event; + }) + ); + + let panel2Dimensions: PanelDimensionChangeEvent | undefined = undefined; + disposables.addDisposables( + panel2.api.onDidDimensionsChange((event) => { + panel2Dimensions = event; + }) + ); + + expect(panel1Dimensions).toEqual({ width: 600, height: 22 }); + expect(panel2Dimensions).toEqual({ width: 600, height: 22 }); + + panel1.api.setSize({ size: 300 }); + + expect(panel1Dimensions).toEqual({ width: 600, height: 22 }); + expect(panel2Dimensions).toEqual({ width: 600, height: 22 }); + + paneview.layout(200, 600); + + expect(panel1Dimensions).toEqual({ width: 200, height: 22 }); + expect(panel2Dimensions).toEqual({ width: 200, height: 22 }); + + panel1.api.setExpanded(true); + + expect(panel1Dimensions).toEqual({ width: 200, height: 578 }); + expect(panel2Dimensions).toEqual({ width: 200, height: 22 }); + + panel2.api.setExpanded(true); + panel1.api.setSize({ size: 300 }); + + expect(panel1Dimensions).toEqual({ width: 200, height: 300 }); + expect(panel2Dimensions).toEqual({ width: 200, height: 300 }); + + panel1.api.setSize({ size: 200 }); + + expect(panel1Dimensions).toEqual({ width: 200, height: 200 }); + expect(panel2Dimensions).toEqual({ width: 200, height: 400 }); + + disposables.dispose(); + paneview.dispose(); + }); + + test('serialization', () => { + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.fromJSON({ + size: 6, + views: [ + { + size: 1, + data: { + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }, + expanded: true, + }, + { + size: 2, + data: { + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }, + expanded: false, + }, + { + size: 3, + data: { + id: 'panel3', + component: 'testPanel', + title: 'Panel 3', + }, + }, + ], + }); + + paneview.layout(400, 800); + + const panel1 = paneview.getPanel('panel1'); + + expect(panel1!.api.height).toBe(756); + expect(panel1!.api.width).toBe(400); + expect(panel1!.api.id).toBe('panel1'); + // expect(panel1!.api.isActive).toBeTruthy(); + // expect(panel1?.api.isFocused).toBeFalsy(); + expect(panel1!.api.isVisible).toBeTruthy(); + expect(panel1!.api.isExpanded).toBeTruthy(); + + const panel2 = paneview.getPanel('panel2'); + + expect(panel2!.api.height).toBe(22); + expect(panel2!.api.width).toBe(400); + expect(panel2!.api.id).toBe('panel2'); + // expect(panel2!.api.isActive).toBeTruthy(); + // expect(panel2?.api.isFocused).toBeFalsy(); + expect(panel2!.api.isVisible).toBeTruthy(); + expect(panel2!.api.isExpanded).toBeFalsy(); + + const panel3 = paneview.getPanel('panel3'); + + expect(panel3!.api.height).toBe(22); + expect(panel3!.api.width).toBe(400); + expect(panel3!.api.id).toBe('panel3'); + // expect(panel3!.api.isActive).toBeTruthy(); + // expect(panel3?.api.isFocused).toBeFalsy(); + expect(panel3!.api.isVisible).toBeTruthy(); + expect(panel3!.api.isExpanded).toBeFalsy(); + + expect(JSON.parse(JSON.stringify(paneview.toJSON()))).toEqual({ + size: 800, + views: [ + { + size: 756, + data: { + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }, + expanded: true, + minimumSize: 100, + }, + { + size: 22, + data: { + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }, + expanded: false, + minimumSize: 100, + }, + { + size: 22, + data: { + id: 'panel3', + component: 'testPanel', + title: 'Panel 3', + }, + expanded: false, + minimumSize: 100, + }, + ], + }); + }); + + test('toJSON shouldnt fire any layout events', () => { + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + paneview.layout(1000, 1000); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }); + + const disposable = paneview.onDidLayoutChange(() => { + fail('onDidLayoutChange shouldnt have been called'); + }); + + const result = paneview.toJSON(); + expect(result).toBeTruthy(); + + disposable.dispose(); + }); + + test('dispose of paneviewComponent', () => { + expect(container.childNodes.length).toBe(0); + + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.layout(1000, 1000); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }); + + expect(container.childNodes.length).toBeGreaterThan(0); + + paneview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); + + test('panel is disposed of when component is disposed', () => { + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.layout(1000, 1000); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }); + + const panel1 = paneview.getPanel('panel1'); + const panel2 = paneview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + paneview.dispose(); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when removed', () => { + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.layout(1000, 1000); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }); + + const panel1 = paneview.getPanel('panel1'); + const panel2 = paneview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + paneview.removePanel(panel2); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when fromJSON is called', () => { + const paneview = new PaneviewComponent(container, { + components: { + testPanel: TestPanel, + }, + }); + + paneview.layout(1000, 1000); + + paneview.addPanel({ + id: 'panel1', + component: 'testPanel', + title: 'Panel 1', + }); + paneview.addPanel({ + id: 'panel2', + component: 'testPanel', + title: 'Panel 2', + }); + + const panel1 = paneview.getPanel('panel1'); + const panel2 = paneview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + paneview.fromJSON({ views: [], size: 0 }); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/build/packages/dockview/src/__tests__/react/dockview/dockview.spec.tsx b/build/packages/dockview/src/__tests__/react/dockview/dockview.spec.tsx new file mode 100644 index 000000000..6913654dc --- /dev/null +++ b/build/packages/dockview/src/__tests__/react/dockview/dockview.spec.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { DockviewApi } from '../../../api/component.api'; +import { + IDockviewPanelProps, + DockviewReact, + DockviewReadyEvent, +} from '../../../react/dockview/dockview'; +import { PanelCollection } from '../../../react/types'; +import { setMockRefElement } from '../../__test_utils__/utils'; + +describe('gridview react', () => { + let components: PanelCollection; + + beforeEach(() => { + components = { + default: (props: IDockviewPanelProps) => { + return
hello world
; + }, + }; + }); + + test('default', () => { + let api: DockviewApi | undefined; + + const onReady = (event: DockviewReadyEvent) => { + api = event.api; + }; + + render(); + + expect(api).toBeTruthy(); + }); + + test('is sized to container', () => { + setMockRefElement({ + clientHeight: 450, + clientWidth: 650, + appendChild: jest.fn(), + }); + let api: DockviewApi | undefined; + + const onReady = (event: DockviewReadyEvent) => { + api = event.api; + }; + + render(); + + expect(api.width).toBe(650); + expect(api.height).toBe(450); + }); +}); diff --git a/build/packages/dockview/src/__tests__/react/gridview/gridview.spec.tsx b/build/packages/dockview/src/__tests__/react/gridview/gridview.spec.tsx new file mode 100644 index 000000000..b3b2088d3 --- /dev/null +++ b/build/packages/dockview/src/__tests__/react/gridview/gridview.spec.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { GridviewApi } from '../../../api/component.api'; +import { + IGridviewPanelProps, + GridviewReact, + GridviewReadyEvent, +} from '../../../react/gridview/gridview'; +import { PanelCollection } from '../../../react/types'; +import { Orientation } from '../../../splitview/core/splitview'; +import { setMockRefElement } from '../../__test_utils__/utils'; + +describe('gridview react', () => { + let components: PanelCollection; + + beforeEach(() => { + components = { + default: (props: IGridviewPanelProps) => { + return
hello world
; + }, + }; + }); + + test('default', () => { + let api: GridviewApi | undefined; + + const onReady = (event: GridviewReadyEvent) => { + api = event.api; + }; + + render( + + ); + + expect(api).toBeTruthy(); + }); + + test('is sized to container', () => { + setMockRefElement({ + clientHeight: 450, + clientWidth: 650, + appendChild: jest.fn(), + }); + let api: GridviewApi | undefined; + + const onReady = (event: GridviewReadyEvent) => { + api = event.api; + }; + + render( + + ); + + expect(api.width).toBe(650); + expect(api.height).toBe(450); + }); +}); diff --git a/build/packages/dockview/src/__tests__/react/paneview/paneview.spec.tsx b/build/packages/dockview/src/__tests__/react/paneview/paneview.spec.tsx new file mode 100644 index 000000000..a3ccb1e6e --- /dev/null +++ b/build/packages/dockview/src/__tests__/react/paneview/paneview.spec.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { PaneviewApi } from '../../../api/component.api'; +import { + IPaneviewPanelProps, + PaneviewReact, + PaneviewReadyEvent, +} from '../../../react/paneview/paneview'; +import { PanelCollection } from '../../../react/types'; +import { setMockRefElement } from '../../__test_utils__/utils'; + +describe('gridview react', () => { + let components: PanelCollection; + + beforeEach(() => { + components = { + default: (props: IPaneviewPanelProps) => { + return
hello world
; + }, + }; + }); + + test('default', () => { + let api: PaneviewApi | undefined; + + const onReady = (event: PaneviewReadyEvent) => { + api = event.api; + }; + + render(); + + expect(api).toBeTruthy(); + }); + + test('is sized to container', () => { + setMockRefElement({ + clientHeight: 450, + clientWidth: 650, + appendChild: jest.fn(), + }); + let api: PaneviewApi | undefined; + + const onReady = (event: PaneviewReadyEvent) => { + api = event.api; + }; + + render(); + + expect(api.width).toBe(650); + expect(api.height).toBe(450); + }); +}); diff --git a/build/packages/dockview/src/__tests__/react/react.spec.tsx b/build/packages/dockview/src/__tests__/react/react.spec.tsx new file mode 100644 index 000000000..9be93848d --- /dev/null +++ b/build/packages/dockview/src/__tests__/react/react.spec.tsx @@ -0,0 +1,90 @@ +import { ReactPart } from '../../react/react'; +import * as React from 'react'; +import { render, screen, act } from '@testing-library/react'; + +interface TestInterface { + valueA: string; + valueB: number; +} + +describe('react', () => { + describe('ReactPart', () => { + test('update underlying component via ReactPart class', () => { + let api: ReactPart; + + const onReady = (_api: ReactPart) => { + api = _api; + }; + + render(); + + expect(api).toBeTruthy(); + + expect(screen.getByTestId('valueA').textContent).toBe('stringA'); + expect(screen.getByTestId('valueB').textContent).toBe('42'); + + act(() => { + api.update({ valueB: '32' }); + }); + + expect(screen.getByTestId('valueA').textContent).toBe('stringA'); + expect(screen.getByTestId('valueB').textContent).toBe('32'); + + act(() => { + api.update({ valueA: 'anotherStringA', valueB: '22' }); + }); + + expect(screen.getByTestId('valueA').textContent).toBe( + 'anotherStringA' + ); + expect(screen.getByTestId('valueB').textContent).toBe('22'); + }); + }); +}); + +const Component = (props: TestInterface) => { + return ( +
+
{props.valueA}
+
{props.valueB}
+
+ ); +}; + +const TestWrapper = (props: { + component: React.FunctionComponent; + onReady: (api: ReactPart) => void; +}) => { + const [portal, setPortal] = React.useState([]); + const ref = React.useRef(null); + + React.useEffect(() => { + const cut = new ReactPart( + ref.current, + { + addPortal: (portal: React.ReactPortal) => { + setPortal((_) => [..._, portal]); + + return { + dispose: () => { + setPortal((_) => _.filter((_) => _ !== portal)); + }, + }; + }, + }, + props.component, + { + valueA: 'stringA', + valueB: 42, + } + ); + + props.onReady(cut); + + return () => { + cut.dispose(); + }; + }, []); + + return
{portal}
; +}; diff --git a/build/packages/dockview/src/__tests__/react/splitview/splitview.spec.tsx b/build/packages/dockview/src/__tests__/react/splitview/splitview.spec.tsx new file mode 100644 index 000000000..78ebf7467 --- /dev/null +++ b/build/packages/dockview/src/__tests__/react/splitview/splitview.spec.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; +import { render } from '@testing-library/react'; +import { SplitviewApi } from '../../../api/component.api'; +import { + ISplitviewPanelProps, + SplitviewReact, + SplitviewReadyEvent, +} from '../../../react/splitview/splitview'; +import { PanelCollection } from '../../../react/types'; +import { Orientation } from '../../../splitview/core/splitview'; +import { setMockRefElement } from '../../__test_utils__/utils'; + +describe('splitview react', () => { + let components: PanelCollection; + + beforeEach(() => { + components = { + default: (props: ISplitviewPanelProps) => { + return
hello world
; + }, + }; + }); + + test('default', () => { + let api: SplitviewApi | undefined; + + const onReady = (event: SplitviewReadyEvent) => { + api = event.api; + }; + + render( + + ); + + expect(api).toBeTruthy(); + }); + + test('is sized to container', () => { + setMockRefElement({ + clientHeight: 450, + clientWidth: 650, + appendChild: jest.fn(), + }); + let api: SplitviewApi | undefined; + + const onReady = (event: SplitviewReadyEvent) => { + api = event.api; + }; + + render( + + ); + + expect(api.width).toBe(650); + expect(api.height).toBe(450); + }); +}); diff --git a/build/packages/dockview/src/__tests__/splitview/core/splitview.spec.ts b/build/packages/dockview/src/__tests__/splitview/core/splitview.spec.ts new file mode 100644 index 000000000..ef4f607d2 --- /dev/null +++ b/build/packages/dockview/src/__tests__/splitview/core/splitview.spec.ts @@ -0,0 +1,589 @@ +import { Emitter } from '../../../events'; +import { CompositeDisposable } from '../../../lifecycle'; +import { + IView, + LayoutPriority, + Orientation, + Sizing, + Splitview, +} from '../../../splitview/core/splitview'; + +class Testview implements IView { + private _element: HTMLElement = document.createElement('div'); + private _size = 0; + private _orthogonalSize = 0; + private _priority: LayoutPriority | undefined; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange = this._onDidChange.event; + + private readonly _onLayoutCalled = new Emitter(); + readonly onLayoutCalled = this._onLayoutCalled.event; + + private readonly _onRendered = new Emitter(); + readonly onRenderered = this._onRendered.event; + + get minimumSize() { + return this._minimumSize; + } + + get maximumSize() { + return this._maxiumSize; + } + + get element() { + this._onRendered.fire(); + return this._element; + } + + get size() { + return this._size; + } + + get orthogonalSize() { + return this._orthogonalSize; + } + + get priority() { + return this._priority; + } + + constructor( + private _minimumSize: number, + private _maxiumSize: number, + priority?: LayoutPriority + ) { + this._priority = priority; + } + + layout(size: number, orthogonalSize: number) { + this._size = size; + this._orthogonalSize = orthogonalSize; + this._onLayoutCalled.fire(); + } + + fireChangeEvent(value: number | undefined) { + this._onDidChange.fire(value); + } + + setVisible(isVisible: boolean) { + // + } + + dispose() { + this._onDidChange.dispose(); + } +} + +describe('splitview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + container.className = 'container'; + }); + + test('vertical splitview', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + expect(splitview.orientation).toBe(Orientation.HORIZONTAL); + + const viewQuery = container.querySelectorAll( + '.split-view-container horizontal' + ); + expect(viewQuery).toBeTruthy(); + + splitview.dispose(); + }); + + test('horiziontal splitview', () => { + const splitview = new Splitview(container, { + orientation: Orientation.VERTICAL, + }); + + expect(splitview.orientation).toBe(Orientation.VERTICAL); + + const viewQuery = container.querySelectorAll( + '.split-view-container vertical' + ); + expect(viewQuery).toBeTruthy(); + + splitview.dispose(); + }); + + test('has views and sashes', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.addView(new Testview(50, 50)); + splitview.addView(new Testview(50, 50)); + splitview.addView(new Testview(50, 50)); + + let viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view' + ); + expect(viewQuery.length).toBe(3); + + let sashQuery = container.querySelectorAll( + '.split-view-container > .sash-container > .sash' + ); + expect(sashQuery.length).toBe(2); + + splitview.removeView(2); + + viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view' + ); + expect(viewQuery.length).toBe(2); + + sashQuery = container.querySelectorAll( + '.split-view-container > .sash-container > .sash' + ); + expect(sashQuery.length).toBe(1); + + splitview.removeView(0); + + viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view' + ); + expect(viewQuery.length).toBe(1); + + sashQuery = container.querySelectorAll( + '.split-view-container > .sash-container > .sash' + ); + expect(sashQuery.length).toBe(0); + + splitview.removeView(0); + + viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view' + ); + expect(viewQuery.length).toBe(0); + + sashQuery = container.querySelectorAll( + '.split-view-container > .sash-container > .sash' + ); + expect(sashQuery.length).toBe(0); + + splitview.dispose(); + }); + + test('visiblity classnames', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + const view1 = new Testview(50, 50); + const view2 = new Testview(50, 50); + + splitview.addView(view1); + splitview.addView(view2); + + let viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view.visible' + ); + expect(viewQuery.length).toBe(2); + + splitview.setViewVisible(1, false); + + viewQuery = container.querySelectorAll( + '.split-view-container > .view-container > .view.visible' + ); + expect(viewQuery.length).toBe(1); + + splitview.dispose(); + }); + + test('calls lifecycle methods on view', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + let rendered = false; + let layout = false; + + const view = new Testview(50, Number.POSITIVE_INFINITY); + const layoutDisposable = view.onLayoutCalled(() => { + layout = true; + }); + const renderDisposable = view.onRenderered(() => { + rendered = true; + }); + + splitview.addView(view); + + splitview.layout(100, 100); + + expect(rendered).toBeTruthy(); + expect(layout).toBeTruthy(); + + layoutDisposable.dispose(); + renderDisposable.dispose(); + splitview.dispose(); + }); + + test('add view at specified index', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(50, 200); + const view2 = new Testview(50, 200); + const view3 = new Testview(50, 200); + + splitview.addView(view1); + splitview.addView(view2, Sizing.Distribute, 0); + splitview.addView(view3, Sizing.Distribute, 1); + + expect(splitview.getViews()).toEqual([view2, view3, view1]); + }); + + test('streches to viewport', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view = new Testview(50, Number.POSITIVE_INFINITY); + + splitview.addView(view); + expect(view.size).toBe(200); + + splitview.layout(100, 500); + expect(view.size).toBe(100); + + splitview.layout(50, 500); + expect(view.size).toBe(50); + + splitview.layout(30, 500); + expect(view.size).toBe(50); + + splitview.layout(100, 500); + expect(view.size).toBe(100); + + splitview.dispose(); + }); + + test('can resize views 1', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(50, 200); + const view2 = new Testview(50, 200); + + splitview.addView(view1); + splitview.addView(view2); + + expect(view1.size).toBe(100); + expect(view2.size).toBe(100); + + view1.fireChangeEvent(65); + + expect(view1.size).toBe(65); + expect(view2.size).toBe(135); + + view2.fireChangeEvent(75); + + expect(view1.size).toBe(125); + expect(view2.size).toBe(75); + + view2.fireChangeEvent(undefined); + + expect(view1.size).toBe(125); + expect(view2.size).toBe(75); + + splitview.dispose(); + }); + + test('can resize views 2', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(50, 200); + const view2 = new Testview(50, 200); + const view3 = new Testview(50, 200); + + splitview.addView(view1); + splitview.addView(view2); + splitview.addView(view3); + + expect([view1.size, view2.size, view3.size]).toEqual([66, 66, 68]); + + splitview.resizeView(1, 100); + expect([view1.size, view2.size, view3.size]).toEqual([50, 100, 50]); + + splitview.resizeView(2, 60); + expect([view1.size, view2.size, view3.size]).toEqual([50, 90, 60]); + + expect([ + splitview.getViewSize(0), + splitview.getViewSize(1), + splitview.getViewSize(2), + splitview.getViewSize(3), + ]).toEqual([50, 90, 60, -1]); + + splitview.dispose(); + }); + + test('move view', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(50, 200); + const view2 = new Testview(50, 200); + const view3 = new Testview(50, 200); + + splitview.addView(view1); + splitview.addView(view2); + splitview.addView(view3); + + expect([view1.size, view2.size, view3.size]).toEqual([66, 66, 68]); + + splitview.moveView(2, 0); + expect(splitview.getViews()).toEqual([view3, view1, view2]); + expect([view1.size, view2.size, view3.size]).toEqual([66, 66, 68]); + + splitview.moveView(0, 2); + expect(splitview.getViews()).toEqual([view1, view2, view3]); + expect([view1.size, view2.size, view3.size]).toEqual([66, 66, 68]); + + splitview.dispose(); + }); + + test('layout called after views added', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + const view1 = new Testview(50, 200); + const view2 = new Testview(50, 200); + const view3 = new Testview(50, 200); + + splitview.addView(view1); + splitview.addView(view2); + splitview.addView(view3); + + splitview.layout(200, 500); + + expect([view1.size, view2.size, view3.size]).toEqual([67, 67, 66]); + + splitview.dispose(); + }); + + test('proportional layout', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(20, Number.POSITIVE_INFINITY); + const view2 = new Testview(20, Number.POSITIVE_INFINITY); + + splitview.addView(view1); + splitview.addView(view2); + + expect([view1.size, view2.size]).toEqual([100, 100]); + + splitview.layout(100, 500); + + expect([view1.size, view2.size]).toEqual([50, 50]); + + splitview.dispose(); + }); + + test('disable proportional layout', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + }); + + splitview.layout(200, 500); + + const view1 = new Testview(20, Number.POSITIVE_INFINITY); + const view2 = new Testview(20, Number.POSITIVE_INFINITY); + + splitview.addView(view1); + splitview.addView(view2); + + expect([view1.size, view2.size]).toEqual([100, 100]); + + splitview.layout(100, 500); + + expect([view1.size, view2.size]).toEqual([80, 20]); + + splitview.dispose(); + }); + + test('high priority', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + }); + + splitview.layout(300, 500); + + const view1 = new Testview(50, Number.POSITIVE_INFINITY); + const view2 = new Testview( + 50, + Number.POSITIVE_INFINITY, + LayoutPriority.High + ); + const view3 = new Testview(50, Number.POSITIVE_INFINITY); + + splitview.addView(view1); + splitview.addView(view2); + splitview.addView(view3); + + expect([view1.size, view2.size, view3.size]).toEqual([100, 100, 100]); + + splitview.layout(400, 500); + + expect([view1.size, view2.size, view3.size]).toEqual([100, 200, 100]); + + splitview.dispose(); + }); + + test('low priority', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + }); + + splitview.layout(300, 500); + + const view1 = new Testview( + 50, + Number.POSITIVE_INFINITY, + LayoutPriority.Low + ); + const view2 = new Testview(50, Number.POSITIVE_INFINITY); + const view3 = new Testview(50, Number.POSITIVE_INFINITY); + + splitview.addView(view1); + splitview.addView(view2); + splitview.addView(view3); + + expect([view1.size, view2.size, view3.size]).toEqual([100, 100, 100]); + + splitview.layout(400, 500); + + expect([view1.size, view2.size, view3.size]).toEqual([100, 100, 200]); + + splitview.dispose(); + }); + + test('from descriptor', () => { + const descriptor = { + size: 300, + views: [ + { + size: 80, + view: new Testview(0, Number.POSITIVE_INFINITY), + }, + { + size: 100, + view: new Testview(0, Number.POSITIVE_INFINITY), + }, + { + size: 120, + view: new Testview(0, Number.POSITIVE_INFINITY), + }, + ], + }; + + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + descriptor, + }); + + expect([ + descriptor.views[0].size, + descriptor.views[1].size, + descriptor.views[2].size, + ]).toEqual([80, 100, 120]); + expect(splitview.size).toBe(300); + }); + + test('onDidAddView and onDidRemoveView events', () => { + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + }); + + const added: IView[] = []; + const removed: IView[] = []; + + const disposable = new CompositeDisposable( + splitview.onDidAddView((view) => added.push(view)), + splitview.onDidRemoveView((view) => removed.push(view)) + ); + + const view1 = new Testview(0, 100); + const view2 = new Testview(0, 100); + + expect(added.length).toBe(0); + expect(removed.length).toBe(0); + + splitview.addView(view1); + expect(added.length).toBe(1); + expect(removed.length).toBe(0); + expect(added[0]).toBe(view1); + + splitview.addView(view2); + expect(added.length).toBe(2); + expect(removed.length).toBe(0); + expect(added[1]).toBe(view2); + + splitview.removeView(0); + expect(added.length).toBe(2); + expect(removed.length).toBe(1); + expect(removed[0]).toBe(view1); + + splitview.removeView(0); + expect(added.length).toBe(2); + expect(removed.length).toBe(2); + expect(removed[1]).toBe(view2); + + disposable.dispose(); + }); + + test('dispose of splitview', () => { + expect(container.childNodes.length).toBe(0); + + const splitview = new Splitview(container, { + orientation: Orientation.HORIZONTAL, + proportionalLayout: false, + }); + + const view1 = new Testview(0, 100); + const view2 = new Testview(0, 100); + + splitview.addView(view1); + splitview.addView(view2); + + expect(container.childNodes.length).toBeGreaterThan(0); + + splitview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); +}); diff --git a/build/packages/dockview/src/__tests__/splitview/splitviewComponent.spec.ts b/build/packages/dockview/src/__tests__/splitview/splitviewComponent.spec.ts new file mode 100644 index 000000000..a6cca1bf6 --- /dev/null +++ b/build/packages/dockview/src/__tests__/splitview/splitviewComponent.spec.ts @@ -0,0 +1,485 @@ +import { PanelDimensionChangeEvent } from '../../api/panelApi'; +import { CompositeDisposable } from '../../lifecycle'; +import { Orientation } from '../../splitview/core/splitview'; +import { SplitviewComponent } from '../../splitview/splitviewComponent'; +import { SplitviewPanel } from '../../splitview/splitviewPanel'; + +class TestPanel extends SplitviewPanel { + getComponent() { + return { + update: () => { + // + }, + dispose: () => { + // + }, + }; + } +} + +describe('componentSplitview', () => { + let container: HTMLElement; + + beforeEach(() => { + container = document.createElement('div'); + container.className = 'container'; + }); + + test('remove panel', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.VERTICAL, + components: { + testPanel: TestPanel, + }, + }); + splitview.layout(600, 400); + + splitview.addPanel({ id: 'panel1', component: 'testPanel' }); + splitview.addPanel({ id: 'panel2', component: 'testPanel' }); + splitview.addPanel({ id: 'panel3', component: 'testPanel' }); + + const panel1 = splitview.getPanel('panel1'); + const panel2 = splitview.getPanel('panel2'); + const panel3 = splitview.getPanel('panel3'); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeFalsy(); + expect(panel3.api.isActive).toBeTruthy(); + + splitview.removePanel(panel3); + + expect(panel1.api.isActive).toBeFalsy(); + expect(panel2.api.isActive).toBeTruthy(); + expect(splitview.length).toBe(2); + + splitview.removePanel(panel1); + expect(panel2.api.isActive).toBeTruthy(); + expect(splitview.length).toBe(1); + + splitview.removePanel(panel2); + expect(splitview.length).toBe(0); + }); + + test('horizontal dimensions', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + testPanel: TestPanel, + }, + }); + splitview.layout(600, 400); + + expect(splitview.height).toBe(400); + expect(splitview.width).toBe(600); + }); + + test('vertical dimensions', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.VERTICAL, + components: { + testPanel: TestPanel, + }, + }); + splitview.layout(600, 400); + + expect(splitview.height).toBe(400); + expect(splitview.width).toBe(600); + }); + + test('api resize', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.VERTICAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(400, 600); + splitview.addPanel({ id: 'panel1', component: 'testPanel' }); + splitview.addPanel({ id: 'panel2', component: 'testPanel' }); + splitview.addPanel({ id: 'panel3', component: 'testPanel' }); + + const panel1 = splitview.getPanel('panel1'); + const panel2 = splitview.getPanel('panel2'); + const panel3 = splitview.getPanel('panel3'); + + expect(panel1.width).toBe(400); + expect(panel1.height).toBe(200); + expect(panel2.width).toBe(400); + expect(panel2.height).toBe(200); + expect(panel3.width).toBe(400); + expect(panel3.height).toBe(200); + + panel1.api.setSize({ size: 100 }); + + expect(panel1.width).toBe(400); + expect(panel1.height).toBe(100); + expect(panel2.width).toBe(400); + expect(panel2.height).toBe(200); + expect(panel3.width).toBe(400); + expect(panel3.height).toBe(300); + + panel2.api.setSize({ size: 100 }); + + expect(panel1.width).toBe(400); + expect(panel1.height).toBe(100); + expect(panel2.width).toBe(400); + expect(panel2.height).toBe(100); + expect(panel3.width).toBe(400); + expect(panel3.height).toBe(400); + + panel3.api.setSize({ size: 100 }); + + expect(panel1.width).toBe(400); + expect(panel1.height).toBe(100); + expect(panel2.width).toBe(400); + expect(panel2.height).toBe(400); + expect(panel3.width).toBe(400); + expect(panel3.height).toBe(100); + }); + + test('api', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(600, 400); + splitview.addPanel({ id: 'panel1', component: 'testPanel' }); + + const panel1 = splitview.getPanel('panel1'); + + expect(panel1!.api.height).toBe(400); + expect(panel1!.api.width).toBe(600); + expect(panel1!.api.id).toBe('panel1'); + expect(panel1!.api.isActive).toBeTruthy(); + // expect(panel1?.api.isFocused).toBeFalsy(); + expect(panel1!.api.isVisible).toBeTruthy(); + + splitview.addPanel({ id: 'panel2', component: 'testPanel' }); + + const panel2 = splitview.getPanel('panel2'); + + expect(panel1!.api.isActive).toBeFalsy(); + + expect(panel2!.api.height).toBe(400); + expect(panel2!.api.width).toBe(300); + expect(panel2!.api.id).toBe('panel2'); + expect(panel2!.api.isActive).toBeTruthy(); + // expect(panel2!.api.isFocused).toBeFalsy(); + expect(panel2!.api.isVisible).toBeTruthy(); + + panel1?.api.setActive(); + + expect(panel1!.api.isActive).toBeTruthy(); + expect(panel2!.api.isActive).toBeFalsy(); + }); + + test('vertical panels', () => { + const disposables = new CompositeDisposable(); + + const splitview = new SplitviewComponent(container, { + orientation: Orientation.VERTICAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(600, 400); + + splitview.addPanel({ id: 'panel1', component: 'testPanel' }); + splitview.addPanel({ id: 'panel2', component: 'testPanel' }); + + const panel1 = splitview.getPanel('panel1') as SplitviewPanel; + const panel2 = splitview.getPanel('panel2') as SplitviewPanel; + + let panel1Dimensions: PanelDimensionChangeEvent | undefined; + disposables.addDisposables( + panel1.api.onDidDimensionsChange((event) => { + panel1Dimensions = event; + }) + ); + + let panel2Dimensions: PanelDimensionChangeEvent | undefined; + disposables.addDisposables( + panel2.api.onDidDimensionsChange((event) => { + panel2Dimensions = event; + }) + ); + + expect(panel1Dimensions).toEqual({ width: 600, height: 200 }); + expect(panel2Dimensions).toEqual({ width: 600, height: 200 }); + + panel1.api.setSize({ size: 300 }); + + expect(panel1Dimensions).toEqual({ width: 600, height: 300 }); + expect(panel2Dimensions).toEqual({ width: 600, height: 100 }); + + splitview.layout(200, 600); + + expect(panel1Dimensions).toEqual({ width: 200, height: 450 }); + expect(panel2Dimensions).toEqual({ width: 200, height: 150 }); + + disposables.dispose(); + splitview.dispose(); + }); + + test('horizontal panels', () => { + const disposables = new CompositeDisposable(); + + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(600, 400); + + splitview.addPanel({ id: 'panel1', component: 'testPanel' }); + splitview.addPanel({ id: 'panel2', component: 'testPanel' }); + + const panel1 = splitview.getPanel('panel1') as SplitviewPanel; + const panel2 = splitview.getPanel('panel2') as SplitviewPanel; + + let panel1Dimensions: PanelDimensionChangeEvent | undefined; + disposables.addDisposables( + panel1.api.onDidDimensionsChange((event) => { + panel1Dimensions = event; + }) + ); + + let panel2Dimensions: PanelDimensionChangeEvent | undefined; + disposables.addDisposables( + panel2.api.onDidDimensionsChange((event) => { + panel2Dimensions = event; + }) + ); + + expect(panel1Dimensions).toEqual({ width: 300, height: 400 }); + expect(panel2Dimensions).toEqual({ width: 300, height: 400 }); + + panel1.api.setSize({ size: 200 }); + + expect(panel1Dimensions).toEqual({ width: 200, height: 400 }); + expect(panel2Dimensions).toEqual({ width: 400, height: 400 }); + + splitview.layout(200, 600); + + expect(panel1Dimensions).toEqual({ width: 67, height: 600 }); + expect(panel2Dimensions).toEqual({ width: 133, height: 600 }); + + disposables.dispose(); + splitview.dispose(); + }); + + test('serialization', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.VERTICAL, + components: { + testPanel: TestPanel, + }, + }); + splitview.layout(600, 400); + + splitview.fromJSON({ + views: [ + { + size: 1, + data: { id: 'panel1', component: 'testPanel' }, + snap: false, + }, + { + size: 2, + data: { id: 'panel2', component: 'testPanel' }, + snap: true, + }, + { size: 3, data: { id: 'panel3', component: 'testPanel' } }, + ], + size: 6, + orientation: Orientation.VERTICAL, + activeView: 'panel1', + }); + + expect(splitview.length).toBe(3); + + expect(JSON.parse(JSON.stringify(splitview.toJSON()))).toEqual({ + views: [ + { + size: 1, + data: { id: 'panel1', component: 'testPanel' }, + snap: false, + }, + { + size: 2, + data: { id: 'panel2', component: 'testPanel' }, + snap: true, + }, + { + size: 3, + data: { id: 'panel3', component: 'testPanel' }, + snap: false, + }, + ], + size: 6, + orientation: Orientation.VERTICAL, + activeView: 'panel1', + }); + }); + + test('toJSON shouldnt fire any layout events', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(1000, 1000); + + splitview.addPanel({ + id: 'panel1', + component: 'testPanel', + }); + splitview.addPanel({ + id: 'panel2', + component: 'testPanel', + }); + + const disposable = splitview.onDidLayoutChange(() => { + fail('onDidLayoutChange shouldnt have been called'); + }); + + const result = splitview.toJSON(); + expect(result).toBeTruthy(); + + disposable.dispose(); + }); + + test('dispose of splitviewComponent', () => { + expect(container.childNodes.length).toBe(0); + + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + testPanel: TestPanel, + }, + }); + + splitview.layout(1000, 1000); + + splitview.addPanel({ + id: 'panel1', + component: 'testPanel', + }); + splitview.addPanel({ + id: 'panel2', + component: 'testPanel', + }); + + expect(container.childNodes.length).toBeGreaterThan(0); + + splitview.dispose(); + + expect(container.childNodes.length).toBe(0); + }); + + test('panel is disposed of when component is disposed', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + default: TestPanel, + }, + }); + + splitview.layout(1000, 1000); + + splitview.addPanel({ + id: 'panel1', + component: 'default', + }); + splitview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = splitview.getPanel('panel1'); + const panel2 = splitview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + splitview.dispose(); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when removed', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + default: TestPanel, + }, + }); + + splitview.layout(1000, 1000); + + splitview.addPanel({ + id: 'panel1', + component: 'default', + }); + splitview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = splitview.getPanel('panel1'); + const panel2 = splitview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + splitview.removePanel(panel2); + + expect(panel1Spy).not.toHaveBeenCalled(); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); + + test('panel is disposed of when fromJSON is called', () => { + const splitview = new SplitviewComponent(container, { + orientation: Orientation.HORIZONTAL, + components: { + default: TestPanel, + }, + }); + + splitview.layout(1000, 1000); + + splitview.addPanel({ + id: 'panel1', + component: 'default', + }); + splitview.addPanel({ + id: 'panel2', + component: 'default', + }); + + const panel1 = splitview.getPanel('panel1'); + const panel2 = splitview.getPanel('panel2'); + + const panel1Spy = jest.spyOn(panel1, 'dispose'); + const panel2Spy = jest.spyOn(panel2, 'dispose'); + + splitview.fromJSON({ + orientation: Orientation.HORIZONTAL, + size: 0, + views: [], + }); + + expect(panel1Spy).toHaveBeenCalledTimes(1); + expect(panel2Spy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/build/packages/dockview/src/actionbar/actionsContainer.scss b/build/packages/dockview/src/actionbar/actionsContainer.scss new file mode 100644 index 000000000..78b0a1ac5 --- /dev/null +++ b/build/packages/dockview/src/actionbar/actionsContainer.scss @@ -0,0 +1,30 @@ +.actions-bar { + text-align: right; + width: 28px; + display: flex; + align-items: center; + flex-shrink: 0; + + .actions-container { + display: flex; + padding: 0px; + margin: 0px; + justify-content: flex-end; + + a:active { + -webkit-mask-size: 100% 100% !important; + mask-size: 100% 100% !important; + } + + .close-action { + background-color: white; + height: 16px; + width: 16px; + display: block; + -webkit-mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% no-repeat; + mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% no-repeat; + margin-right: '0.5em'; + cursor: pointer; + } + } +} diff --git a/build/packages/dockview/src/actionbar/actionsContainer.ts b/build/packages/dockview/src/actionbar/actionsContainer.ts new file mode 100644 index 000000000..1f8f7ce56 --- /dev/null +++ b/build/packages/dockview/src/actionbar/actionsContainer.ts @@ -0,0 +1,24 @@ +export class ActionContainer { + private _element: HTMLElement; + private _list: HTMLElement; + + get element() { + return this._element; + } + + constructor() { + this._element = document.createElement('div'); + this._element.className = 'actions-bar'; + + this._list = document.createElement('ul'); + this._list.className = 'actions-container'; + + this._element.appendChild(this._list); + } + + public add(element: HTMLElement) { + const listItem = document.createElement('li'); + listItem.className = 'action-item'; + this._list.appendChild(element); + } +} diff --git a/build/packages/dockview/src/api/component.api.ts b/build/packages/dockview/src/api/component.api.ts new file mode 100644 index 000000000..5802a546b --- /dev/null +++ b/build/packages/dockview/src/api/component.api.ts @@ -0,0 +1,473 @@ +import { + DockviewDropEvent, + IDockviewComponent, + SerializedDockview, +} from '../dockview/dockviewComponent'; +import { + AddGroupOptions, + AddPanelOptions, + MovementOptions, +} from '../dockview/options'; +import { Direction } from '../gridview/baseComponentGridview'; +import { + AddComponentOptions, + IGridviewComponent, + SerializedGridview, +} from '../gridview/gridviewComponent'; +import { IGridviewPanel } from '../gridview/gridviewPanel'; +import { IDockviewPanel } from '../groupview/groupPanel'; +import { + AddPaneviewComponentOptions, + SerializedPaneview, + IPaneviewComponent, +} from '../paneview/paneviewComponent'; +import { IPaneviewPanel } from '../paneview/paneviewPanel'; +import { + AddSplitviewComponentOptions, + ISplitviewComponent, + SerializedSplitview, + SplitviewComponentUpdateOptions, +} from '../splitview/splitviewComponent'; +import { IView, Orientation, Sizing } from '../splitview/core/splitview'; +import { ISplitviewPanel } from '../splitview/splitviewPanel'; +import { GroupPanel, IGroupviewPanel } from '../groupview/groupviewPanel'; +import { Emitter, Event } from '../events'; +import { PaneviewDropEvent } from '../react'; + +export interface CommonApi { + readonly height: number; + readonly width: number; + readonly onDidLayoutChange: Event; + readonly onDidLayoutFromJSON: Event; + focus(): void; + layout(width: number, height: number): void; + fromJSON(data: T): void; + toJSON(): T; + clear(): void; +} + +export class SplitviewApi implements CommonApi { + get minimumSize(): number { + return this.component.minimumSize; + } + + get maximumSize(): number { + return this.component.maximumSize; + } + + get height(): number { + return this.component.height; + } + + get width(): number { + return this.component.width; + } + + get length(): number { + return this.component.length; + } + + get orientation(): Orientation { + return this.component.orientation; + } + + get panels(): ISplitviewPanel[] { + return this.component.panels; + } + + get onDidLayoutFromJSON(): Event { + return this.component.onDidLayoutFromJSON; + } + + get onDidLayoutChange(): Event { + return this.component.onDidLayoutChange; + } + + get onDidAddView(): Event { + return this.component.onDidAddView; + } + + get onDidRemoveView(): Event { + return this.component.onDidRemoveView; + } + + constructor(private readonly component: ISplitviewComponent) {} + + updateOptions(options: SplitviewComponentUpdateOptions): void { + this.component.updateOptions(options); + } + + removePanel(panel: ISplitviewPanel, sizing?: Sizing): void { + this.component.removePanel(panel, sizing); + } + + focus(): void { + this.component.focus(); + } + + getPanel(id: string): ISplitviewPanel | undefined { + return this.component.getPanel(id); + } + + layout(width: number, height: number): void { + return this.component.layout(width, height); + } + + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel { + return this.component.addPanel(options); + } + + movePanel(from: number, to: number): void { + this.component.movePanel(from, to); + } + + fromJSON(data: SerializedSplitview): void { + this.component.fromJSON(data); + } + + toJSON(): SerializedSplitview { + return this.component.toJSON(); + } + + clear(): void { + this.component.clear(); + } +} + +export class PaneviewApi implements CommonApi { + get minimumSize(): number { + return this.component.minimumSize; + } + + get maximumSize(): number { + return this.component.maximumSize; + } + + get height(): number { + return this.component.height; + } + + get width(): number { + return this.component.width; + } + + get panels(): IPaneviewPanel[] { + return this.component.panels; + } + + get onDidLayoutChange(): Event { + return this.component.onDidLayoutChange; + } + + get onDidLayoutFromJSON(): Event { + return this.component.onDidLayoutFromJSON; + } + + get onDidAddView(): Event { + return this.component.onDidAddView; + } + + get onDidRemoveView(): Event { + return this.component.onDidRemoveView; + } + + get onDidDrop(): Event { + const emitter = new Emitter(); + + const disposable = this.component.onDidDrop((e) => { + emitter.fire({ ...e, api: this }); + }); + + emitter.dispose = () => { + disposable.dispose(); + emitter.dispose(); + }; + + return emitter.event; + } + + constructor(private readonly component: IPaneviewComponent) {} + + removePanel(panel: IPaneviewPanel): void { + this.component.removePanel(panel); + } + + getPanel(id: string): IPaneviewPanel | undefined { + return this.component.getPanel(id); + } + + movePanel(from: number, to: number): void { + this.component.movePanel(from, to); + } + + focus(): void { + this.component.focus(); + } + + layout(width: number, height: number): void { + this.component.layout(width, height); + } + + addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel { + return this.component.addPanel(options); + } + + fromJSON(data: SerializedPaneview): void { + this.component.fromJSON(data); + } + + toJSON(): SerializedPaneview { + return this.component.toJSON(); + } + + clear(): void { + this.component.clear(); + } +} + +export class GridviewApi implements CommonApi { + get minimumHeight(): number { + return this.component.minimumHeight; + } + + get maximumHeight(): number { + return this.component.maximumHeight; + } + + get minimumWidth(): number { + return this.component.minimumWidth; + } + + get maximumWidth(): number { + return this.component.maximumWidth; + } + + get width(): number { + return this.component.width; + } + + get height(): number { + return this.component.height; + } + + get onDidLayoutChange(): Event { + return this.component.onDidLayoutChange; + } + + get onDidAddPanel(): Event { + return this.component.onDidAddGroup; + } + + get onDidRemovePanel(): Event { + return this.component.onDidRemoveGroup; + } + + get onDidActivePanelChange(): Event { + return this.component.onDidActiveGroupChange; + } + + get onDidLayoutFromJSON(): Event { + return this.component.onDidLayoutFromJSON; + } + + get panels(): IGridviewPanel[] { + return this.component.groups; + } + + get orientation(): Orientation { + return this.component.orientation; + } + + set orientation(value: Orientation) { + this.component.updateOptions({ orientation: value }); + } + + constructor(private readonly component: IGridviewComponent) {} + + focus(): void { + this.component.focus(); + } + + layout(width: number, height: number, force = false): void { + this.component.layout(width, height, force); + } + + addPanel(options: AddComponentOptions): IGridviewPanel { + return this.component.addPanel(options); + } + + removePanel(panel: IGridviewPanel, sizing?: Sizing): void { + this.component.removePanel(panel, sizing); + } + + movePanel( + panel: IGridviewPanel, + options: { direction: Direction; reference: string; size?: number } + ): void { + this.component.movePanel(panel, options); + } + + getPanel(id: string): IGridviewPanel | undefined { + return this.component.getPanel(id); + } + + fromJSON(data: SerializedGridview): void { + return this.component.fromJSON(data); + } + + toJSON(): SerializedGridview { + return this.component.toJSON(); + } + + clear(): void { + this.component.clear(); + } +} + +export class DockviewApi implements CommonApi { + get width(): number { + return this.component.width; + } + + get height(): number { + return this.component.height; + } + + get minimumHeight(): number { + return this.component.minimumHeight; + } + + get maximumHeight(): number { + return this.component.maximumHeight; + } + + get minimumWidth(): number { + return this.component.minimumWidth; + } + + get maximumWidth(): number { + return this.component.maximumWidth; + } + + get size(): number { + return this.component.size; + } + + get totalPanels(): number { + return this.component.totalPanels; + } + + get onDidActiveGroupChange(): Event { + return this.component.onDidActiveGroupChange; + } + + get onDidAddGroup(): Event { + return this.component.onDidAddGroup; + } + + get onDidRemoveGroup(): Event { + return this.component.onDidRemoveGroup; + } + + get onDidActivePanelChange(): Event { + return this.component.onDidActivePanelChange; + } + + get onDidAddPanel(): Event { + return this.component.onDidAddPanel; + } + + get onDidRemovePanel(): Event { + return this.component.onDidRemovePanel; + } + + get onDidLayoutFromJSON(): Event { + return this.component.onDidLayoutFromJSON; + } + + get onDidLayoutChange(): Event { + return this.component.onDidLayoutChange; + } + + get onDidDrop(): Event { + return this.component.onDidDrop; + } + + get panels(): IDockviewPanel[] { + return this.component.panels; + } + + get groups(): GroupPanel[] { + return this.component.groups; + } + + get activePanel(): IDockviewPanel | undefined { + return this.component.activePanel; + } + + get activeGroup(): GroupPanel | undefined { + return this.component.activeGroup; + } + + constructor(private readonly component: IDockviewComponent) {} + + getTabHeight(): number | undefined { + return this.component.tabHeight; + } + + setTabHeight(height: number | undefined): void { + this.component.tabHeight = height; + } + + focus(): void { + this.component.focus(); + } + + getPanel(id: string): IDockviewPanel | undefined { + return this.component.getGroupPanel(id); + } + + layout(width: number, height: number, force = false): void { + this.component.layout(width, height, force); + } + + addPanel(options: AddPanelOptions): IDockviewPanel { + return this.component.addPanel(options); + } + + addEmptyGroup(options?: AddGroupOptions): void { + this.component.addEmptyGroup(options); + } + + moveToNext(options?: MovementOptions): void { + this.component.moveToNext(options); + } + + moveToPrevious(options?: MovementOptions): void { + this.component.moveToPrevious(options); + } + + closeAllGroups(): void { + return this.component.closeAllGroups(); + } + + removeGroup(group: IGroupviewPanel): void { + this.component.removeGroup(group); + } + + getGroup(id: string): GroupPanel | undefined { + return this.component.getPanel(id); + } + + fromJSON(data: SerializedDockview): void { + this.component.fromJSON(data); + } + + toJSON(): SerializedDockview { + return this.component.toJSON(); + } + + clear(): void { + this.component.clear(); + } +} diff --git a/build/packages/dockview/src/api/gridviewPanelApi.ts b/build/packages/dockview/src/api/gridviewPanelApi.ts new file mode 100644 index 000000000..34495c64e --- /dev/null +++ b/build/packages/dockview/src/api/gridviewPanelApi.ts @@ -0,0 +1,68 @@ +import { Emitter, Event } from '../events'; +import { FunctionOrValue } from '../types'; +import { PanelApiImpl, PanelApi } from './panelApi'; + +export interface GridConstraintChangeEvent { + readonly minimumWidth?: number; + readonly minimumHeight?: number; + readonly maximumWidth?: number; + readonly maximumHeight?: number; +} + +interface GridConstraintChangeEvent2 { + readonly minimumWidth?: FunctionOrValue; + readonly minimumHeight?: FunctionOrValue; + readonly maximumWidth?: FunctionOrValue; + readonly maximumHeight?: FunctionOrValue; +} + +export interface SizeEvent { + readonly width?: number; + readonly height?: number; +} + +export interface GridviewPanelApi extends PanelApi { + readonly onDidConstraintsChange: Event; + setConstraints(value: GridConstraintChangeEvent2): void; + setSize(event: SizeEvent): void; +} + +export class GridviewPanelApiImpl + extends PanelApiImpl + implements GridviewPanelApi +{ + readonly _onDidConstraintsChangeInternal = + new Emitter(); + readonly onDidConstraintsChangeInternal: Event = + this._onDidConstraintsChangeInternal.event; + // + + readonly _onDidConstraintsChange = new Emitter({ + replay: true, + }); + readonly onDidConstraintsChange: Event = + this._onDidConstraintsChange.event; + // + + readonly _onDidSizeChange = new Emitter(); + readonly onDidSizeChange: Event = this._onDidSizeChange.event; + // + + constructor(id: string) { + super(id); + + this.addDisposables( + this._onDidConstraintsChangeInternal, + this._onDidConstraintsChange, + this._onDidSizeChange + ); + } + + public setConstraints(value: GridConstraintChangeEvent) { + this._onDidConstraintsChangeInternal.fire(value); + } + + public setSize(event: SizeEvent) { + this._onDidSizeChange.fire(event); + } +} diff --git a/build/packages/dockview/src/api/groupPanelApi.ts b/build/packages/dockview/src/api/groupPanelApi.ts new file mode 100644 index 000000000..827130c3e --- /dev/null +++ b/build/packages/dockview/src/api/groupPanelApi.ts @@ -0,0 +1,109 @@ +import { Emitter } from '../events'; +import { GridviewPanelApiImpl, GridviewPanelApi } from './gridviewPanelApi'; +import { IDockviewPanel } from '../groupview/groupPanel'; +import { GroupPanel } from '../groupview/groupviewPanel'; +import { MutableDisposable } from '../lifecycle'; + +export interface TitleEvent { + readonly title: string; +} + +export interface SuppressClosableEvent { + readonly suppressClosable: boolean; +} + +/* + * omit visibility modifiers since the visibility of a single group doesn't make sense + * because it belongs to a groupview + */ +export interface DockviewPanelApi extends Omit { + readonly group: GroupPanel; + readonly isGroupActive: boolean; + readonly title: string; + readonly suppressClosable: boolean; + close(): void; + setTitle(title: string): void; +} + +export class DockviewPanelApiImpl + extends GridviewPanelApiImpl + implements DockviewPanelApi +{ + private _group: GroupPanel; + + readonly _onDidTitleChange = new Emitter(); + readonly onDidTitleChange = this._onDidTitleChange.event; + + readonly _titleChanged = new Emitter(); + readonly titleChanged = this._titleChanged.event; + + readonly _suppressClosableChanged = new Emitter(); + readonly suppressClosableChanged = this._suppressClosableChanged.event; + + private readonly _onDidActiveGroupChange = new Emitter(); + readonly onDidActiveGroupChange = this._onDidActiveGroupChange.event; + + private readonly _onDidGroupChange = new Emitter(); + readonly onDidGroupChange = this._onDidGroupChange.event; + + private disposable = new MutableDisposable(); + + get title() { + return this.panel.title; + } + + get suppressClosable() { + return !!this.panel.suppressClosable; + } + + get isGroupActive() { + return !!this.group?.isActive; + } + + set group(value: GroupPanel) { + const isOldGroupActive = this.isGroupActive; + + this._group = value; + + this._onDidGroupChange.fire(); + + if (this._group) { + this.disposable.value = this._group.api.onDidActiveChange(() => { + this._onDidActiveGroupChange.fire(); + }); + + if (this.isGroupActive !== isOldGroupActive) { + this._onDidActiveGroupChange.fire(); + } + } + } + + get group(): GroupPanel { + return this._group; + } + + constructor(private panel: IDockviewPanel, group: GroupPanel) { + super(panel.id); + this._group = group; + + this.addDisposables( + this.disposable, + this._onDidTitleChange, + this._titleChanged, + this._suppressClosableChanged, + this._onDidGroupChange, + this._onDidActiveGroupChange + ); + } + + public setTitle(title: string) { + this._onDidTitleChange.fire({ title }); + } + + public close(): void { + if (!this.group) { + throw new Error(`panel ${this.id} has no group`); + } + return this.group.model.closePanel(this.panel); + } +} diff --git a/build/packages/dockview/src/api/panelApi.ts b/build/packages/dockview/src/api/panelApi.ts new file mode 100644 index 000000000..1b16d9195 --- /dev/null +++ b/build/packages/dockview/src/api/panelApi.ts @@ -0,0 +1,155 @@ +import { Emitter, Event } from '../events'; +import { CompositeDisposable } from '../lifecycle'; + +export interface FocusEvent { + readonly isFocused: boolean; +} +export interface PanelDimensionChangeEvent { + readonly width: number; + readonly height: number; +} + +export interface VisibilityEvent { + readonly isVisible: boolean; +} + +export interface ActiveEvent { + readonly isActive: boolean; +} + +export interface PanelApi { + // events + readonly onDidDimensionsChange: Event; + readonly onDidFocusChange: Event; + readonly onDidVisibilityChange: Event; + readonly onDidActiveChange: Event; + setVisible(isVisible: boolean): void; + setActive(): void; + /** + * The id of the panel that would have been assigned when the panel was created + */ + readonly id: string; + /** + * Whether the panel holds the current focus + */ + readonly isFocused: boolean; + /** + * Whether the panel is the actively selected panel + */ + readonly isActive: boolean; + /** + * Whether the panel is visible + */ + readonly isVisible: boolean; + /** + * The panel width in pixels + */ + readonly width: number; + /** + * The panel height in pixels + */ + readonly height: number; +} + +/** + * A core api implementation that should be used across all panel-like objects + */ +export class PanelApiImpl extends CompositeDisposable implements PanelApi { + private _isFocused = false; + private _isActive = false; + private _isVisible = true; + private _width = 0; + private _height = 0; + + readonly _onDidDimensionChange = new Emitter({ + replay: true, + }); + readonly onDidDimensionsChange = this._onDidDimensionChange.event; + // + readonly _onDidChangeFocus = new Emitter({ + replay: true, + }); + readonly onDidFocusChange: Event = this._onDidChangeFocus.event; + // + readonly _onFocusEvent = new Emitter(); + readonly onFocusEvent: Event = this._onFocusEvent.event; + // + readonly _onDidVisibilityChange = new Emitter({ + replay: true, + }); + readonly onDidVisibilityChange: Event = + this._onDidVisibilityChange.event; + // + + readonly _onVisibilityChange = new Emitter(); + readonly onVisibilityChange: Event = + this._onVisibilityChange.event; + // + readonly _onDidActiveChange = new Emitter({ + replay: true, + }); + readonly onDidActiveChange: Event = + this._onDidActiveChange.event; + // + readonly _onActiveChange = new Emitter(); + readonly onActiveChange: Event = this._onActiveChange.event; + // + + get isFocused() { + return this._isFocused; + } + + get isActive() { + return this._isActive; + } + get isVisible() { + return this._isVisible; + } + + get width() { + return this._width; + } + + get height() { + return this._height; + } + + constructor(readonly id: string) { + super(); + + this.addDisposables( + this._onDidDimensionChange, + this._onDidChangeFocus, + this._onDidVisibilityChange, + this._onDidActiveChange, + this._onFocusEvent, + this._onActiveChange, + this._onVisibilityChange, + this.onDidFocusChange((event) => { + this._isFocused = event.isFocused; + }), + this.onDidActiveChange((event) => { + this._isActive = event.isActive; + }), + this.onDidVisibilityChange((event) => { + this._isVisible = event.isVisible; + }), + this.onDidDimensionsChange((event) => { + this._width = event.width; + this._height = event.height; + }) + ); + } + + setVisible(isVisible: boolean) { + this._onVisibilityChange.fire({ isVisible }); + } + + setActive(): void { + this._onActiveChange.fire(); + } + + dispose() { + super.dispose(); + } +} diff --git a/build/packages/dockview/src/api/paneviewPanelApi.ts b/build/packages/dockview/src/api/paneviewPanelApi.ts new file mode 100644 index 000000000..c90a70db4 --- /dev/null +++ b/build/packages/dockview/src/api/paneviewPanelApi.ts @@ -0,0 +1,55 @@ +import { Emitter, Event } from '../events'; +import { PaneviewPanel } from '../paneview/paneviewPanel'; +import { SplitviewPanelApi, SplitviewPanelApiImpl } from './splitviewPanelApi'; + +export interface ExpansionEvent { + readonly isExpanded: boolean; +} + +export interface PaneviewPanelApi extends SplitviewPanelApi { + readonly isExpanded: boolean; + readonly onDidExpansionChange: Event; + readonly onMouseEnter: Event; + readonly onMouseLeave: Event; + setExpanded(isExpanded: boolean): void; +} + +export class PaneviewPanelApiImpl + extends SplitviewPanelApiImpl + implements PaneviewPanelApi +{ + readonly _onDidExpansionChange = new Emitter({ + replay: true, + }); + readonly onDidExpansionChange: Event = + this._onDidExpansionChange.event; + + readonly _onMouseEnter = new Emitter({}); + readonly onMouseEnter: Event = this._onMouseEnter.event; + readonly _onMouseLeave = new Emitter({}); + readonly onMouseLeave: Event = this._onMouseLeave.event; + + private _pane: PaneviewPanel | undefined; + + set pane(pane: PaneviewPanel) { + this._pane = pane; + } + + constructor(id: string) { + super(id); + + this.addDisposables( + this._onDidExpansionChange, + this._onMouseEnter, + this._onMouseLeave + ); + } + + setExpanded(isExpanded: boolean): void { + this._pane?.setExpanded(isExpanded); + } + + get isExpanded(): boolean { + return !!this._pane?.isExpanded(); + } +} diff --git a/build/packages/dockview/src/api/splitviewPanelApi.ts b/build/packages/dockview/src/api/splitviewPanelApi.ts new file mode 100644 index 000000000..cfe3cd103 --- /dev/null +++ b/build/packages/dockview/src/api/splitviewPanelApi.ts @@ -0,0 +1,65 @@ +import { Emitter, Event } from '../events'; +import { IDisposable } from '../lifecycle'; +import { FunctionOrValue } from '../types'; +import { PanelApiImpl, PanelApi } from './panelApi'; + +interface PanelConstraintChangeEvent2 { + readonly minimumSize?: FunctionOrValue; + readonly maximumSize?: FunctionOrValue; +} + +export interface PanelConstraintChangeEvent { + readonly minimumSize?: number; + readonly maximumSize?: number; +} + +export interface PanelSizeEvent { + readonly size: number; +} + +export interface SplitviewPanelApi extends PanelApi { + readonly onDidConstraintsChange: Event; + setConstraints(value: PanelConstraintChangeEvent2): void; + setSize(event: PanelSizeEvent): void; +} + +export class SplitviewPanelApiImpl + extends PanelApiImpl + implements SplitviewPanelApi, IDisposable +{ + readonly _onDidConstraintsChangeInternal = + new Emitter(); + readonly onDidConstraintsChangeInternal: Event = + this._onDidConstraintsChangeInternal.event; + // + + readonly _onDidConstraintsChange = new Emitter({ + replay: true, + }); + readonly onDidConstraintsChange: Event = + this._onDidConstraintsChange.event; + // + + readonly _onDidSizeChange = new Emitter(); + readonly onDidSizeChange: Event = + this._onDidSizeChange.event; + // + + constructor(id: string) { + super(id); + + this.addDisposables( + this._onDidConstraintsChangeInternal, + this._onDidConstraintsChange, + this._onDidSizeChange + ); + } + + setConstraints(value: PanelConstraintChangeEvent2) { + this._onDidConstraintsChangeInternal.fire(value); + } + + setSize(event: PanelSizeEvent) { + this._onDidSizeChange.fire(event); + } +} diff --git a/build/packages/dockview/src/array.ts b/build/packages/dockview/src/array.ts new file mode 100644 index 000000000..b2e0a7e34 --- /dev/null +++ b/build/packages/dockview/src/array.ts @@ -0,0 +1,84 @@ +export function tail(arr: T[]): [T[], T] { + if (arr.length === 0) { + throw new Error('Invalid tail call'); + } + + return [arr.slice(0, arr.length - 1), arr[arr.length - 1]]; +} + +export function last(arr: T[]): T | undefined { + return arr.length > 0 ? arr[arr.length - 1] : undefined; +} + +export function sequenceEquals(arr1: T[], arr2: T[]): boolean { + if (arr1.length !== arr2.length) { + return false; + } + + for (let i = 0; i < arr1.length; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} + +/** + * Pushes an element to the start of the array, if found. + */ +export function pushToStart(arr: T[], value: T): void { + const index = arr.indexOf(value); + + if (index > -1) { + arr.splice(index, 1); + arr.unshift(value); + } +} + +/** + * Pushes an element to the end of the array, if found. + */ +export function pushToEnd(arr: T[], value: T): void { + const index = arr.indexOf(value); + + if (index > -1) { + arr.splice(index, 1); + arr.push(value); + } +} + +export const range = (from: number, to?: number): number[] => { + const result: number[] = []; + + if (typeof to !== 'number') { + to = from; + from = 0; + } + + if (from <= to) { + for (let i = from; i < to; i++) { + result.push(i); + } + } else { + for (let i = from; i > to; i--) { + result.push(i); + } + } + + return result; +}; + +export function firstIndex( + array: T[] | ReadonlyArray, + fn: (item: T) => boolean +): number { + for (let i = 0; i < array.length; i++) { + const element = array[i]; + + if (fn(element)) { + return i; + } + } + + return -1; +} diff --git a/build/packages/dockview/src/dnd/abstractDragHandler.ts b/build/packages/dockview/src/dnd/abstractDragHandler.ts new file mode 100644 index 000000000..e16a1cc46 --- /dev/null +++ b/build/packages/dockview/src/dnd/abstractDragHandler.ts @@ -0,0 +1,56 @@ +import { getElementsByTagName } from '../dom'; +import { addDisposableListener, Emitter } from '../events'; +import { + CompositeDisposable, + IDisposable, + MutableDisposable, +} from '../lifecycle'; + +export abstract class DragHandler extends CompositeDisposable { + private readonly disposable = new MutableDisposable(); + + private readonly _onDragStart = new Emitter(); + readonly onDragStart = this._onDragStart.event; + + private iframes: HTMLElement[] = []; + + constructor(private readonly el: HTMLElement) { + super(); + this.configure(); + } + + abstract getData(): IDisposable; + + private configure() { + this.addDisposables( + this._onDragStart, + addDisposableListener(this.el, 'dragstart', (event) => { + this.iframes = [ + ...getElementsByTagName('iframe'), + ...getElementsByTagName('webview'), + ]; + + for (const iframe of this.iframes) { + iframe.style.pointerEvents = 'none'; + } + + this.el.classList.add('dragged'); + setTimeout(() => this.el.classList.remove('dragged'), 0); + + this.disposable.value = this.getData(); + + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = 'move'; + } + }), + addDisposableListener(this.el, 'dragend', () => { + for (const iframe of this.iframes) { + iframe.style.pointerEvents = 'auto'; + } + this.iframes = []; + + this.disposable.dispose(); + }) + ); + } +} diff --git a/build/packages/dockview/src/dnd/dataTransfer.ts b/build/packages/dockview/src/dnd/dataTransfer.ts new file mode 100644 index 000000000..687e219a4 --- /dev/null +++ b/build/packages/dockview/src/dnd/dataTransfer.ts @@ -0,0 +1,90 @@ +class TransferObject { + constructor() { + // + } +} + +export class PanelTransfer extends TransferObject { + constructor( + public readonly viewId: string, + public readonly groupId: string, + public readonly panelId: string + ) { + super(); + } +} + +export class PaneTransfer extends TransferObject { + constructor( + public readonly viewId: string, + public readonly paneId: string + ) { + super(); + } +} + +/** + * A singleton to store transfer data during drag & drop operations that are only valid within the application. + */ +export class LocalSelectionTransfer { + private static readonly INSTANCE = new LocalSelectionTransfer(); + + private data?: T[]; + private proto?: T; + + private constructor() { + // protect against external instantiation + } + + static getInstance(): LocalSelectionTransfer { + return LocalSelectionTransfer.INSTANCE as LocalSelectionTransfer; + } + + hasData(proto: T): boolean { + return proto && proto === this.proto; + } + + clearData(proto: T): void { + if (this.hasData(proto)) { + this.proto = undefined; + this.data = undefined; + } + } + + getData(proto: T): T[] | undefined { + if (this.hasData(proto)) { + return this.data; + } + + return undefined; + } + + setData(data: T[], proto: T): void { + if (proto) { + this.data = data; + this.proto = proto; + } + } +} + +export function getPanelData(): PanelTransfer | undefined { + const panelTransfer = LocalSelectionTransfer.getInstance(); + const isPanelEvent = panelTransfer.hasData(PanelTransfer.prototype); + + if (!isPanelEvent) { + return undefined; + } + + return panelTransfer.getData(PanelTransfer.prototype)![0]; +} + +export function getPaneData(): PaneTransfer | undefined { + const paneTransfer = LocalSelectionTransfer.getInstance(); + const isPanelEvent = paneTransfer.hasData(PaneTransfer.prototype); + + if (!isPanelEvent) { + return undefined; + } + + return paneTransfer.getData(PaneTransfer.prototype)![0]; +} diff --git a/build/packages/dockview/src/dnd/dnd.ts b/build/packages/dockview/src/dnd/dnd.ts new file mode 100644 index 000000000..4d2a38fdc --- /dev/null +++ b/build/packages/dockview/src/dnd/dnd.ts @@ -0,0 +1,86 @@ +import { addDisposableListener } from '../events'; +import { CompositeDisposable } from '../lifecycle'; + +export interface IDragAndDropObserverCallbacks { + onDragEnter: (e: DragEvent) => void; + onDragLeave: (e: DragEvent) => void; + onDrop: (e: DragEvent) => void; + onDragEnd: (e: DragEvent) => void; + + onDragOver?: (e: DragEvent) => void; +} + +export class DragAndDropObserver extends CompositeDisposable { + // A helper to fix issues with repeated DRAG_ENTER / DRAG_LEAVE + // calls see https://github.com/microsoft/vscode/issues/14470 + // when the element has child elements where the events are fired + // repeadedly. + private counter = 0; + + constructor( + private element: HTMLElement, + private callbacks: IDragAndDropObserverCallbacks + ) { + super(); + + this.registerListeners(); + } + + private registerListeners(): void { + this.addDisposables( + addDisposableListener(this.element, 'dragenter', (e: DragEvent) => { + this.counter++; + + this.callbacks.onDragEnter(e); + }) + ); + + this.addDisposables( + addDisposableListener(this.element, 'dragover', (e: DragEvent) => { + e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome) + + if (this.callbacks.onDragOver) { + this.callbacks.onDragOver(e); + } + }) + ); + + this.addDisposables( + addDisposableListener(this.element, 'dragleave', (e: DragEvent) => { + this.counter--; + + if (this.counter === 0) { + this.callbacks.onDragLeave(e); + } + }) + ); + + this.addDisposables( + addDisposableListener(this.element, 'dragend', (e: DragEvent) => { + this.counter = 0; + this.callbacks.onDragEnd(e); + }) + ); + + this.addDisposables( + addDisposableListener(this.element, 'drop', (e: DragEvent) => { + this.counter = 0; + this.callbacks.onDrop(e); + }) + ); + } +} + +export interface IDraggedCompositeData { + eventData: DragEvent; + dragAndDropData: any; +} + +export interface ICompositeDragAndDropObserverCallbacks { + onDragEnter?: (e: IDraggedCompositeData) => void; + onDragLeave?: (e: IDraggedCompositeData) => void; + onDrop?: (e: IDraggedCompositeData) => void; + onDragOver?: (e: IDraggedCompositeData) => void; + onDragStart?: (e: IDraggedCompositeData) => void; + onDragEnd?: (e: IDraggedCompositeData) => void; +} diff --git a/build/packages/dockview/src/dnd/droptarget.scss b/build/packages/dockview/src/dnd/droptarget.scss new file mode 100644 index 000000000..2e31aff4a --- /dev/null +++ b/build/packages/dockview/src/dnd/droptarget.scss @@ -0,0 +1,55 @@ +.drop-target { + position: relative; + + > .drop-target-dropzone { + position: absolute; + left: 0px; + top: 0px; + height: 100%; + width: 100%; + z-index: 10000; + + > .drop-target-selection { + position: relative; + box-sizing: border-box; + height: 100%; + width: 100%; + background-color: var(--dv-drag-over-background-color); + transition: top 70ms ease-out,left 70ms ease-out,width 70ms ease-out,height 70ms ease-out,opacity .15s ease-out; + will-change: transform; + pointer-events: none; + + &.left { + transform: translateX(-25%) scaleX(0.5) + } + + &.right { + transform: translateX(25%) scaleX(0.5) + } + + &.top { + transform: translateY(-25%) scaleY(0.5); + } + + &.bottom { + transform: translateY(25%) scaleY(0.5); + } + + &.small-top { + border-top: 1px solid var(--dv-drag-over-border-color); + } + + &.small-bottom { + border-bottom: 1px solid var(--dv-drag-over-border-color); + } + + &.small-left { + border-left: 1px solid var(--dv-drag-over-border-color); + } + + &.small-right { + border-right: 1px solid var(--dv-drag-over-border-color); + } + } + } +} diff --git a/build/packages/dockview/src/dnd/droptarget.ts b/build/packages/dockview/src/dnd/droptarget.ts new file mode 100644 index 000000000..0b706c8a8 --- /dev/null +++ b/build/packages/dockview/src/dnd/droptarget.ts @@ -0,0 +1,235 @@ +import { toggleClass } from '../dom'; +import { Emitter, Event } from '../events'; +import { CompositeDisposable } from '../lifecycle'; +import { DragAndDropObserver } from './dnd'; + +export enum Position { + Top = 'Top', + Left = 'Left', + Bottom = 'Bottom', + Right = 'Right', + Center = 'Center', +} + +export type Quadrant = 'top' | 'bottom' | 'left' | 'right'; + +export interface DroptargetEvent { + position: Position; + nativeEvent: DragEvent; +} + +export type DropTargetDirections = 'vertical' | 'horizontal' | 'all' | 'none'; + +function isBooleanValue( + canDisplayOverlay: CanDisplayOverlay +): canDisplayOverlay is boolean { + return typeof canDisplayOverlay === 'boolean'; +} + +export type CanDisplayOverlay = + | boolean + | ((dragEvent: DragEvent, state: Quadrant | null) => boolean); + +export class Droptarget extends CompositeDisposable { + private target: HTMLElement | undefined; + private overlay: HTMLElement | undefined; + private _state: Position | undefined; + + private readonly _onDrop = new Emitter(); + readonly onDrop: Event = this._onDrop.event; + + get state() { + return this._state; + } + + set validOverlays(value: DropTargetDirections) { + this.options.validOverlays = value; + } + + set canDisplayOverlay(value: CanDisplayOverlay) { + this.options.canDisplayOverlay = value; + } + + constructor( + private readonly element: HTMLElement, + private readonly options: { + canDisplayOverlay: CanDisplayOverlay; + validOverlays: DropTargetDirections; + } + ) { + super(); + + this.addDisposables( + this._onDrop, + new DragAndDropObserver(this.element, { + onDragEnter: () => undefined, + onDragOver: (e) => { + const width = this.element.clientWidth; + const height = this.element.clientHeight; + + if (width === 0 || height === 0) { + return; // avoid div!0 + } + + const x = e.offsetX; + const y = e.offsetY; + const xp = (100 * x) / width; + const yp = (100 * y) / height; + + const quadrant = this.calculateQuadrant( + this.options.validOverlays, + xp, + yp + ); + + if (isBooleanValue(this.options.canDisplayOverlay)) { + if (!this.options.canDisplayOverlay) { + return; + } + } else if (!this.options.canDisplayOverlay(e, quadrant)) { + return; + } + + if (!this.target) { + this.target = document.createElement('div'); + this.target.className = 'drop-target-dropzone'; + this.overlay = document.createElement('div'); + this.overlay.className = 'drop-target-selection'; + this._state = Position.Center; + this.target.appendChild(this.overlay); + + this.element.classList.add('drop-target'); + this.element.append(this.target); + } + + if (this.options.validOverlays === 'none') { + return; + } + + if (!this.target || !this.overlay) { + return; + } + + const isSmallX = width < 100; + const isSmallY = height < 100; + + this.toggleClasses(quadrant, isSmallX, isSmallY); + + this.setState(quadrant); + }, + onDragLeave: () => { + this.removeDropTarget(); + }, + onDragEnd: () => { + this.removeDropTarget(); + }, + onDrop: (e) => { + e.preventDefault(); + e.stopPropagation(); + + const state = this._state; + + this.removeDropTarget(); + + if (state) { + this._onDrop.fire({ position: state, nativeEvent: e }); + } + }, + }) + ); + } + + public dispose() { + this.removeDropTarget(); + } + + private toggleClasses( + quadrant: Quadrant | null, + isSmallX: boolean, + isSmallY: boolean + ) { + if (!this.overlay) { + return; + } + + const isLeft = quadrant === 'left'; + const isRight = quadrant === 'right'; + const isTop = quadrant === 'top'; + const isBottom = quadrant === 'bottom'; + + toggleClass(this.overlay, 'right', !isSmallX && isRight); + toggleClass(this.overlay, 'left', !isSmallX && isLeft); + toggleClass(this.overlay, 'top', !isSmallY && isTop); + toggleClass(this.overlay, 'bottom', !isSmallY && isBottom); + + toggleClass(this.overlay, 'small-right', isSmallX && isRight); + toggleClass(this.overlay, 'small-left', isSmallX && isLeft); + toggleClass(this.overlay, 'small-top', isSmallY && isTop); + toggleClass(this.overlay, 'small-bottom', isSmallY && isBottom); + } + + private setState(quadrant: Quadrant | null) { + switch (quadrant) { + case 'top': + this._state = Position.Top; + break; + case 'left': + this._state = Position.Left; + break; + case 'bottom': + this._state = Position.Bottom; + break; + case 'right': + this._state = Position.Right; + break; + default: + this._state = Position.Center; + break; + } + } + + private calculateQuadrant( + overlayType: DropTargetDirections, + xp: number, + yp: number + ): Quadrant | null { + switch (overlayType) { + case 'all': + if (xp < 20) { + return 'left'; + } + if (xp > 80) { + return 'right'; + } + if (yp < 20) { + return 'top'; + } + if (yp > 80) { + return 'bottom'; + } + break; + case 'vertical': + if (yp < 50) { + return 'top'; + } + return 'bottom'; + + case 'horizontal': + if (xp < 50) { + return 'left'; + } + return 'right'; + } + + return null; + } + + private removeDropTarget() { + if (this.target) { + this._state = undefined; + this.element.removeChild(this.target); + this.target = undefined; + this.element.classList.remove('drop-target'); + } + } +} diff --git a/build/packages/dockview/src/dockview/components/tab/defaultTab.scss b/build/packages/dockview/src/dockview/components/tab/defaultTab.scss new file mode 100644 index 000000000..d10afffbe --- /dev/null +++ b/build/packages/dockview/src/dockview/components/tab/defaultTab.scss @@ -0,0 +1,81 @@ +.dragged { + transform: translate3d( + 0px, + 0px, + 0px + ); /* forces tab to be drawn on a separate layer (see https://github.com/microsoft/vscode/issues/18733) */ +} + +.tab { + flex-shrink: 0; + + &.dragging { + .tab-action { + background-color: var(--dv-activegroup-visiblepanel-tab-color); + } + } + + &.active-tab > .default-tab { + .tab-action { + visibility: visible; + } + } + + &.inactive-tab > .default-tab { + .tab-action { + visibility: hidden; + } + &:hover { + .tab-action { + visibility: visible; + } + } + } + + .default-tab { + position: relative; + height: 100%; + display: flex; + min-width: 80px; + align-items: center; + padding-left: 10px; + white-space: nowrap; + text-overflow: elipsis; + + .tab-content { + flex-grow: 1; + } + + .action-container { + text-align: right; + width: 28px; + display: flex; + + .tab-list { + display: flex; + padding: 0px; + margin: 0px; + justify-content: flex-end; + + a:active:hover { + -webkit-mask-size: 100% 100% !important; + mask-size: 100% 100% !important; + } + + .tab-action { + height: 16px; + width: 16px; + display: block; + -webkit-mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% + no-repeat; + mask: var(--dv-tab-close-icon) 50% 50% / 90% 90% no-repeat; + margin-right: '0.5em'; + + &.disable-close { + display: none; + } + } + } + } + } +} diff --git a/build/packages/dockview/src/dockview/components/tab/defaultTab.ts b/build/packages/dockview/src/dockview/components/tab/defaultTab.ts new file mode 100644 index 000000000..19d0b06be --- /dev/null +++ b/build/packages/dockview/src/dockview/components/tab/defaultTab.ts @@ -0,0 +1,111 @@ +import { CompositeDisposable } from '../../../lifecycle'; +import { + ITabRenderer, + GroupPanelPartInitParameters, +} from '../../../groupview/types'; +import { addDisposableListener } from '../../../events'; +import { PanelUpdateEvent } from '../../../panel/types'; +import { GroupPanel } from '../../../groupview/groupviewPanel'; + +export class DefaultTab extends CompositeDisposable implements ITabRenderer { + private _element: HTMLElement; + + private _isPanelVisible = false; + private _isGroupActive = false; + private _content: HTMLElement; + private _actionContainer: HTMLElement; + private _list: HTMLElement; + private action: HTMLElement; + // + private params: GroupPanelPartInitParameters = {} as any; + + get element() { + return this._element; + } + + get id() { + return '__DEFAULT_TAB__'; + } + + constructor() { + super(); + + this._element = document.createElement('div'); + this._element.className = 'default-tab'; + // + this._content = document.createElement('div'); + this._content.className = 'tab-content'; + // + this._actionContainer = document.createElement('div'); + this._actionContainer.className = 'action-container'; + // + this._list = document.createElement('ul'); + this._list.className = 'tab-list'; + // + this.action = document.createElement('a'); + this.action.className = 'tab-action'; + // + this._element.appendChild(this._content); + this._element.appendChild(this._actionContainer); + this._actionContainer.appendChild(this._list); + this._list.appendChild(this.action); + // + this.addDisposables( + addDisposableListener(this._actionContainer, 'mousedown', (ev) => { + ev.preventDefault(); + }) + ); + + this.render(); + } + + public update(event: PanelUpdateEvent) { + this.params = { ...this.params, ...event.params }; + this.render(); + } + + public toJSON() { + return { id: this.id }; + } + + focus() { + //noop + } + + public init(params: GroupPanelPartInitParameters) { + this.params = params; + this._content.textContent = params.title; + + if (!this.params.suppressClosable) { + addDisposableListener(this.action, 'click', (ev) => { + ev.preventDefault(); // + this.params.api.close(); + }); + } else { + this.action.classList.add('disable-close'); + } + } + + public updateParentGroup(group: GroupPanel, isPanelVisible: boolean) { + const changed = + this._isPanelVisible !== isPanelVisible || + this._isGroupActive !== group.isActive; + + this._isPanelVisible = isPanelVisible; + this._isGroupActive = group.isActive; + + if (changed) { + this.render(); + } + } + + public layout(_width: number, _height: number) { + // noop + } + + private render() { + if (this._content.textContent !== this.params.title) { + this._content.textContent = this.params.title; + } + } +} diff --git a/build/packages/dockview/src/dockview/components/watermark/watermark.scss b/build/packages/dockview/src/dockview/components/watermark/watermark.scss new file mode 100644 index 000000000..a1e4b7a85 --- /dev/null +++ b/build/packages/dockview/src/dockview/components/watermark/watermark.scss @@ -0,0 +1,21 @@ +.watermark { + display: flex; + width: 100%; + + &.has-actions { + .watermark-title { + .actions-bar { + display: none; + } + } + } + + .watermark-title { + height: 35px; + width: 100%; + display: flex; + } + .watermark-content { + flex-grow: 1; + } +} diff --git a/build/packages/dockview/src/dockview/components/watermark/watermark.ts b/build/packages/dockview/src/dockview/components/watermark/watermark.ts new file mode 100644 index 000000000..5bf338a09 --- /dev/null +++ b/build/packages/dockview/src/dockview/components/watermark/watermark.ts @@ -0,0 +1,107 @@ +import { + GroupPanelPartInitParameters, + IWatermarkRenderer, +} from '../../../groupview/types'; +import { ActionContainer } from '../../../actionbar/actionsContainer'; +import { addDisposableListener } from '../../../events'; +import { toggleClass } from '../../../dom'; +import { CompositeDisposable } from '../../../lifecycle'; +import { GroupPanel } from '../../../groupview/groupviewPanel'; +import { PanelUpdateEvent } from '../../../panel/types'; + +export class Watermark + extends CompositeDisposable + implements IWatermarkRenderer +{ + private _element: HTMLElement; + private group: GroupPanel | undefined; + private params: GroupPanelPartInitParameters | undefined; + + get id() { + return 'watermark'; + } + + constructor() { + super(); + this._element = document.createElement('div'); + this._element.className = 'watermark'; + + const title = document.createElement('div'); + title.className = 'watermark-title'; + + const emptySpace = document.createElement('span'); + emptySpace.style.flexGrow = '1'; + + const content = document.createElement('div'); + content.className = 'watermark-content'; + + this._element.appendChild(title); + this._element.appendChild(content); + + const actions = new ActionContainer(); + title.appendChild(emptySpace); + title.appendChild(actions.element); + + const closeAnchor = document.createElement('a'); + closeAnchor.className = 'close-action'; + + actions.add(closeAnchor); + + this.addDisposables( + addDisposableListener(closeAnchor, 'click', (ev) => { + ev.preventDefault(); + if (this.group) { + this.params?.containerApi.removeGroup(this.group); + } + }) + ); + } + + update(_event: PanelUpdateEvent) { + // noop + } + + focus() { + // noop + } + + toJSON() { + return {}; + } + + layout(_width: number, _height: number) { + // noop + } + + init(params: GroupPanelPartInitParameters) { + this.params = params; + + this.addDisposables( + this.params.containerApi.onDidLayoutChange(() => { + this.render(); + }) + ); + + this.render(); + } + + updateParentGroup(group: GroupPanel, _visible: boolean): void { + this.group = group; + this.render(); + } + + get element() { + return this._element; + } + + private render() { + const isOneGroup = !!( + this.params && this.params.containerApi.size <= 1 + ); + toggleClass(this.element, 'has-actions', isOneGroup); + } + + dispose() { + super.dispose(); + } +} diff --git a/build/packages/dockview/src/dockview/defaultGroupPanelView.ts b/build/packages/dockview/src/dockview/defaultGroupPanelView.ts new file mode 100644 index 000000000..c59190758 --- /dev/null +++ b/build/packages/dockview/src/dockview/defaultGroupPanelView.ts @@ -0,0 +1,90 @@ +import { DefaultTab } from './components/tab/defaultTab'; +import { + GroupPanelPartInitParameters, + IActionsRenderer, + IContentRenderer, + ITabRenderer, +} from '../groupview/types'; +import { GroupPanel } from '../groupview/groupviewPanel'; +import { IDisposable } from '../lifecycle'; +import { GroupPanelUpdateEvent } from '../groupview/groupPanel'; + +export interface IGroupPanelView extends IDisposable { + readonly content: IContentRenderer; + readonly tab?: ITabRenderer; + readonly actions?: IActionsRenderer; + update(event: GroupPanelUpdateEvent): void; + layout(width: number, height: number): void; + init(params: GroupPanelPartInitParameters): void; + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void; + toJSON(): {}; +} + +export class DefaultGroupPanelView implements IGroupPanelView { + private readonly _content: IContentRenderer; + private readonly _tab: ITabRenderer; + private readonly _actions: IActionsRenderer | undefined; + + get content() { + return this._content; + } + + get tab() { + return this._tab; + } + + get actions() { + return this._actions; + } + + constructor(renderers: { + content: IContentRenderer; + tab?: ITabRenderer; + actions?: IActionsRenderer; + }) { + this._content = renderers.content; + this._tab = renderers.tab ?? new DefaultTab(); + this._actions = + renderers.actions || + (this.content.actions + ? { + element: this.content.actions, + dispose: () => { + // + }, + } + : undefined); + } + + init(params: GroupPanelPartInitParameters): void { + this.content.init({ ...params, tab: this.tab }); + this.tab.init(params); + } + + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void { + this._content.updateParentGroup(group, isPanelVisible); + this._tab?.updateParentGroup(group, isPanelVisible); + } + + layout(width: number, height: number): void { + this.content.layout(width, height); + } + + update(event: GroupPanelUpdateEvent): void { + this.content.update(event); + this.tab.update(event); + } + + toJSON(): {} { + return { + content: this.content.toJSON(), + tab: this.tab instanceof DefaultTab ? undefined : this.tab.toJSON(), + }; + } + + dispose(): void { + this.content.dispose(); + this.tab.dispose(); + this.actions?.dispose(); + } +} diff --git a/build/packages/dockview/src/dockview/deserializer.ts b/build/packages/dockview/src/dockview/deserializer.ts new file mode 100644 index 000000000..afb5adde6 --- /dev/null +++ b/build/packages/dockview/src/dockview/deserializer.ts @@ -0,0 +1,6 @@ +import { GroupviewPanelState, IDockviewPanel } from '../groupview/groupPanel'; +import { GroupPanel } from '../groupview/groupviewPanel'; + +export interface IPanelDeserializer { + fromJSON(panelData: GroupviewPanelState, group: GroupPanel): IDockviewPanel; +} diff --git a/build/packages/dockview/src/dockview/dockviewComponent.scss b/build/packages/dockview/src/dockview/dockviewComponent.scss new file mode 100644 index 000000000..f6df4a85d --- /dev/null +++ b/build/packages/dockview/src/dockview/dockviewComponent.scss @@ -0,0 +1,83 @@ +.custom-dragging { + height: 24px; + line-height: 24px; + font-size: 11px; + width: 100px; + background-color: dodgerblue; + color: ghostwhite; + border-radius: 11px; + position: absolute; + padding-left: 10px; +} + +.groupview { + &.active-group { + > .tabs-and-actions-container > .tabs-container > .tab { + &.active-tab { + background-color: var( + --dv-activegroup-visiblepanel-tab-background-color + ); + color: var(--dv-activegroup-visiblepanel-tab-color); + + .tab-action { + background-color: var( + --dv-activegroup-visiblepanel-tab-color + ); + } + } + &.inactive-tab { + background-color: var( + --dv-activegroup-hiddenpanel-tab-background-color + ); + color: var(--dv-activegroup-hiddenpanel-tab-color); + + .tab-action { + background-color: var( + --dv-activegroup-hiddenpanel-tab-color + ); + } + } + } + } + &.inactive-group { + > .tabs-and-actions-container > .tabs-container > .tab { + &.active-tab { + background-color: var( + --dv-inactivegroup-visiblepanel-tab-background-color + ); + color: var(--dv-inactivegroup-visiblepanel-tab-color); + + .tab-action { + background-color: var( + --dv-inactivegroup-visiblepanel-tab-color + ); + } + } + &.inactive-tab { + background-color: var( + --dv-inactivegroup-hiddenpanel-tab-background-color + ); + color: var(--dv-inactivegroup-hiddenpanel-tab-color); + + .tab-action { + background-color: var( + --dv-inactivegroup-hiddenpanel-tab-color + ); + } + } + } + } +} + +/** + * when a tab is dragged we lose the above stylings because they are conditional on parent elements + * therefore we also set some stylings for the dragging event + **/ +.tab { + &.dragging { + background-color: var( + --dv-activegroup-visiblepanel-tab-background-color + ); + color: var(--dv-activegroup-visiblepanel-tab-color); + } +} diff --git a/build/packages/dockview/src/dockview/dockviewComponent.ts b/build/packages/dockview/src/dockview/dockviewComponent.ts new file mode 100644 index 000000000..c3b631ff9 --- /dev/null +++ b/build/packages/dockview/src/dockview/dockviewComponent.ts @@ -0,0 +1,817 @@ +import { + getRelativeLocation, + SerializedGridObject, + getGridLocation, + ISerializedLeafNode, +} from '../gridview/gridview'; +import { Position } from '../dnd/droptarget'; +import { tail, sequenceEquals } from '../array'; +import { GroupviewPanelState, IDockviewPanel } from '../groupview/groupPanel'; +import { DockviewGroupPanel } from './dockviewGroupPanel'; +import { CompositeDisposable } from '../lifecycle'; +import { Event, Emitter } from '../events'; +import { Watermark } from './components/watermark/watermark'; +import { + IContentRenderer, + ITabRenderer, + IWatermarkRenderer, +} from '../groupview/types'; +import { sequentialNumberGenerator } from '../math'; +import { IPanelDeserializer } from './deserializer'; +import { createComponent } from '../panel/componentFactory'; +import { + AddGroupOptions, + AddPanelOptions, + DockviewComponentOptions, + MovementOptions, + TabContextMenuEvent, +} from './options'; +import { + BaseGrid, + IBaseGrid, + toTarget, +} from '../gridview/baseComponentGridview'; +import { DockviewApi } from '../api/component.api'; +import { LayoutMouseEvent, MouseEventKind } from '../groupview/tab'; +import { Orientation } from '../splitview/core/splitview'; +import { DefaultTab } from './components/tab/defaultTab'; +import { + GroupChangeKind2, + GroupOptions, + GroupPanelViewState, + GroupviewDropEvent, +} from '../groupview/groupview'; +import { GroupPanel } from '../groupview/groupviewPanel'; +import { DefaultGroupPanelView } from './defaultGroupPanelView'; + +const nextGroupId = sequentialNumberGenerator(); + +export interface PanelReference { + update: (event: { params: { [key: string]: any } }) => void; + remove: () => void; +} + +export interface SerializedDockview { + grid: { + root: SerializedGridObject; + height: number; + width: number; + orientation: Orientation; + }; + panels: { [key: string]: GroupviewPanelState }; + activeGroup?: string; + options?: { tabHeight?: number }; +} + +export type DockviewComponentUpdateOptions = Pick< + DockviewComponentOptions, + | 'orientation' + | 'components' + | 'frameworkComponents' + | 'tabComponents' + | 'frameworkTabComponents' + | 'showDndOverlay' + | 'watermarkFrameworkComponent' +>; + +export interface DockviewDropEvent extends GroupviewDropEvent { + api: DockviewApi; + group: GroupPanel; +} + +export interface IDockviewComponent extends IBaseGrid { + readonly activePanel: IDockviewPanel | undefined; + readonly totalPanels: number; + readonly panels: IDockviewPanel[]; + readonly onDidDrop: Event; + tabHeight: number | undefined; + deserializer: IPanelDeserializer | undefined; + updateOptions(options: DockviewComponentUpdateOptions): void; + moveGroupOrPanel( + referenceGroup: GroupPanel, + groupId: string, + itemId: string, + target: Position, + index?: number + ): void; + doSetGroupActive: (group: GroupPanel, skipFocus?: boolean) => void; + removeGroup: (group: GroupPanel) => void; + options: DockviewComponentOptions; + addPanel(options: AddPanelOptions): IDockviewPanel; + removePanel(panel: IDockviewPanel): void; + getGroupPanel: (id: string) => IDockviewPanel | undefined; + createWatermarkComponent(): IWatermarkRenderer; + // lifecycle + addEmptyGroup(options?: AddGroupOptions): void; + closeAllGroups(): void; + // events + onTabContextMenu: Event; + moveToNext(options?: MovementOptions): void; + moveToPrevious(options?: MovementOptions): void; + setActivePanel(panel: IDockviewPanel): void; + focus(): void; + toJSON(): SerializedDockview; + fromJSON(data: SerializedDockview): void; + // + readonly onDidRemovePanel: Event; + readonly onDidAddPanel: Event; + readonly onDidLayoutFromJSON: Event; + readonly onDidActivePanelChange: Event; +} + +export class DockviewComponent + extends BaseGrid + implements IDockviewComponent +{ + private _deserializer: IPanelDeserializer | undefined; + private _api: DockviewApi; + private _options: Exclude; + + private readonly _onTabContextMenu = new Emitter(); + readonly onTabContextMenu: Event = + this._onTabContextMenu.event; + + private readonly _onDidDrop = new Emitter(); + readonly onDidDrop: Event = this._onDidDrop.event; + + private readonly _onDidRemovePanel = new Emitter(); + readonly onDidRemovePanel: Event = + this._onDidRemovePanel.event; + + private readonly _onDidAddPanel = new Emitter(); + readonly onDidAddPanel: Event = this._onDidAddPanel.event; + + private readonly _onDidLayoutFromJSON = new Emitter(); + readonly onDidLayoutFromJSON: Event = this._onDidLayoutFromJSON.event; + + private readonly _onDidActivePanelChange = new Emitter< + IDockviewPanel | undefined + >(); + readonly onDidActivePanelChange: Event = + this._onDidActivePanelChange.event; + + get totalPanels(): number { + return this.panels.length; + } + + get panels(): IDockviewPanel[] { + return this.groups.flatMap((group) => group.panels); + } + + get deserializer(): IPanelDeserializer | undefined { + return this._deserializer; + } + + set deserializer(value: IPanelDeserializer | undefined) { + this._deserializer = value; + } + + get options(): DockviewComponentOptions { + return this._options; + } + + get activePanel(): IDockviewPanel | undefined { + const activeGroup = this.activeGroup; + + if (!activeGroup) { + return undefined; + } + + return activeGroup.activePanel; + } + + set tabHeight(height: number | undefined) { + this.options.tabHeight = height; + this._groups.forEach((value) => { + value.value.model.header.height = height; + }); + } + + get tabHeight(): number | undefined { + return this.options.tabHeight; + } + + constructor(element: HTMLElement, options: DockviewComponentOptions) { + super(element, { + proportionalLayout: true, + orientation: options.orientation || Orientation.HORIZONTAL, + styles: options.styles, + }); + + this.addDisposables( + this._onTabContextMenu, + this._onDidDrop, + Event.any( + this.onDidAddPanel, + this.onDidRemovePanel, + this.onDidActivePanelChange + )(() => { + this._bufferOnDidLayoutChange.fire(); + }) + ); + + this._options = options; + + if (!this.options.components) { + this.options.components = {}; + } + if (!this.options.frameworkComponents) { + this.options.frameworkComponents = {}; + } + if (!this.options.frameworkTabComponents) { + this.options.frameworkTabComponents = {}; + } + if (!this.options.tabComponents) { + this.options.tabComponents = {}; + } + if ( + !this.options.watermarkComponent && + !this.options.watermarkFrameworkComponent + ) { + this.options.watermarkComponent = Watermark; + } + + this._api = new DockviewApi(this); + } + + updateOptions(options: DockviewComponentUpdateOptions): void { + const hasOrientationChanged = + typeof options.orientation === 'string' && + this.gridview.orientation !== options.orientation; + + this._options = { ...this.options, ...options }; + + if (hasOrientationChanged) { + this.gridview.orientation = options.orientation!; + } + + this.layout(this.gridview.width, this.gridview.height, true); + } + + focus(): void { + this.activeGroup?.focus(); + } + + getGroupPanel(id: string): IDockviewPanel | undefined { + return this.panels.find((panel) => panel.id === id); + } + + setActivePanel(panel: IDockviewPanel): void { + this.doSetGroupActive(panel.group); + panel.group.model.openPanel(panel); + } + + moveToNext(options: MovementOptions = {}): void { + if (!options.group) { + if (!this.activeGroup) { + return; + } + options.group = this.activeGroup; + } + + if (options.includePanel && options.group) { + if ( + options.group.activePanel !== + options.group.panels[ + options.group.panels.length - 1 + ] + ) { + options.group.model.moveToNext({ suppressRoll: true }); + return; + } + } + + const location = getGridLocation(options.group.element); + const next = this.gridview.next(location)?.view + this.doSetGroupActive(next); + } + + moveToPrevious(options: MovementOptions = {}): void { + if (!options.group) { + if (!this.activeGroup) { + return; + } + options.group = this.activeGroup; + } + + if (options.includePanel && options.group) { + if ( + options.group.activePanel !== + options.group.panels[0] + ) { + options.group.model.moveToPrevious({ suppressRoll: true }); + return; + } + } + + const location = getGridLocation(options.group.element); + const next = this.gridview.previous(location)?.view; + if (next) { + this.doSetGroupActive(next as GroupPanel); + } + } + + /** + * Serialize the current state of the layout + * + * @returns A JSON respresentation of the layout + */ + toJSON(): SerializedDockview { + const data = this.gridview.serialize(); + + const panels = this.panels.reduce((collection, panel) => { + collection[panel.id] = panel.toJSON(); + return collection; + }, {} as { [key: string]: GroupviewPanelState }); + + return { + grid: data, + panels, + activeGroup: this.activeGroup?.id, + options: { tabHeight: this.tabHeight }, + }; + } + + fromJSON(data: SerializedDockview): void { + this.clear() + + if (!this.deserializer) { + throw new Error('invalid deserializer'); + } + const { grid, panels, options, activeGroup } = data; + + if (typeof options?.tabHeight === 'number') { + this.tabHeight = options.tabHeight; + } + + if (!this.deserializer) { + throw new Error('no deserializer provided'); + } + + this.gridview.deserialize( + grid, + { + fromJSON:(node: ISerializedLeafNode) => { + const { id, locked, hideHeader, views, activeView } = node.data + + const group = this.createGroup({ + id, + locked: !!locked, + hideHeader: !!hideHeader, + }); + + this._onDidAddGroup.fire(group); + + for (const child of views) { + const panel = this.deserializer!.fromJSON(panels[child], group); + + const isActive = typeof activeView === 'string' && activeView === panel.id; + + group.model.openPanel(panel, { + skipSetPanelActive: !isActive, + skipSetGroupActive:true + }); + } + + if (!group.activePanel && group.panels.length > 0) { + group.model.openPanel(group.panels[group.panels.length - 1],{ + skipSetGroupActive:true + }); + } + + return group; + } + } + ) + + if (typeof activeGroup === 'string') { + const panel = this.getPanel(activeGroup); + if (panel) { + this.doSetGroupActive(panel); + } + } + + this.gridview.layout(this.width, this.height); + + this._onDidLayoutFromJSON.fire(); + } + + clear():void { + const groups = Array.from(this._groups.values()).map((_) => _.value); + + const hasActiveGroup = !!this.activeGroup; + const hasActivePanel = !!this.activePanel + + for (const group of groups) { + // remove the group will automatically remove the panels + this.removeGroup(group, true); + } + + if (hasActiveGroup) { + this.doSetGroupActive(undefined); + } + + if( hasActivePanel) { + this._onDidActivePanelChange.fire(undefined); + } + + this.gridview.clear(); + } + + closeAllGroups(): void { + for (const entry of this._groups.entries()) { + const [_, group] = entry; + + group.value.model.closeAllPanels(); + } + } + + fireMouseEvent(event: LayoutMouseEvent): void { + if (event.kind === MouseEventKind.CONTEXT_MENU) { + if (event.tab && event.panel) { + this._onTabContextMenu.fire({ + event: event.event, + api: this._api, + panel: event.panel, + }); + } + } + } + + addPanel(options: AddPanelOptions): IDockviewPanel { + if (this.panels.find((_) => _.id === options.id)) { + throw new Error(`panel with id ${options.id} already exists`); + } + + let referenceGroup: GroupPanel | undefined; + + if (options.position?.referencePanel) { + const referencePanel = this.getGroupPanel( + options.position.referencePanel + ); + + if (!referencePanel) { + throw new Error( + `referencePanel ${options.position.referencePanel} does not exist` + ); + } + + referenceGroup = this.findGroup(referencePanel); + } else { + referenceGroup = this.activeGroup; + } + + let panel: IDockviewPanel + + if (referenceGroup) { + const target = toTarget(options.position?.direction || 'within'); + if (target === Position.Center) { + panel = this.createPanel(options, referenceGroup) + referenceGroup.model.openPanel(panel); + } else { + const location = getGridLocation(referenceGroup.element); + const relativeLocation = getRelativeLocation( + this.gridview.orientation, + location, + target + ); + const group = this.createGroupAtLocation(relativeLocation); + panel = this.createPanel(options, group) + group.model.openPanel(panel); + } + } else { + const group = this.createGroupAtLocation(); + panel = this.createPanel(options, group); + group.model.openPanel(panel); + } + + return panel; + } + + removePanel( + panel: IDockviewPanel, + options: { removeEmptyGroup: boolean; skipDispose: boolean } = { + removeEmptyGroup: true, + skipDispose: false, + } + ): void { + const group = panel.group; + + if (!group) { + throw new Error( + `cannot remove panel ${panel.id}. it's missing a group.` + ); + } + + group.model.removePanel(panel); + + panel.dispose(); + + const retainGroupForWatermark = this.size === 1; + + if ( + !retainGroupForWatermark && + group.size === 0 && + options.removeEmptyGroup + ) { + this.removeGroup(group); + } + } + + createWatermarkComponent(): IWatermarkRenderer { + return createComponent( + 'watermark-id', + 'watermark-name', + this.options.watermarkComponent + ? { 'watermark-name': this.options.watermarkComponent } + : {}, + this.options.watermarkFrameworkComponent + ? { 'watermark-name': this.options.watermarkFrameworkComponent } + : {}, + this.options.frameworkComponentFactory?.watermark + ); + } + + addEmptyGroup(options: AddGroupOptions): void { + const group = this.createGroup(); + + if (options) { + const referencePanel = this.panels.find( + (panel) => panel.id === options.referencePanel + ); + + if (!referencePanel) { + throw new Error( + `reference panel ${options.referencePanel} does not exist` + ); + } + + const referenceGroup = this.findGroup(referencePanel); + + if (!referenceGroup) { + throw new Error( + `reference group for reference panel ${options.referencePanel} does not exist` + ); + } + + const target = toTarget(options.direction || 'within'); + + const location = getGridLocation(referenceGroup.element); + const relativeLocation = getRelativeLocation( + this.gridview.orientation, + location, + target + ); + this.doAddGroup(group, relativeLocation); + } else { + this.doAddGroup(group); + } + } + + removeGroup(group: GroupPanel, skipActive = false): void { + const panels = [...group.panels]; // reassign since group panels will mutate + + for (const panel of panels) { + this.removePanel(panel, { + removeEmptyGroup: false, + skipDispose: false, + }); + } + + super.doRemoveGroup(group, { skipActive }); + } + + moveGroupOrPanel( + referenceGroup: GroupPanel, + groupId: string, + itemId: string, + target: Position, + index?: number + ): void { + const sourceGroup = groupId + ? this._groups.get(groupId)?.value + : undefined; + + if (!target || target === Position.Center) { + const groupItem: IDockviewPanel | undefined = + sourceGroup?.model.removePanel(itemId) || + this.panels.find((panel) => panel.id === itemId); + + if (!groupItem) { + throw new Error(`No panel with id ${itemId}`); + } + + if (sourceGroup?.model.size === 0) { + this.doRemoveGroup(sourceGroup); + } + + referenceGroup.model.openPanel(groupItem, { index }); + } else { + const referenceLocation = getGridLocation(referenceGroup.element); + const targetLocation = getRelativeLocation( + this.gridview.orientation, + referenceLocation, + target + ); + + if (sourceGroup && sourceGroup.size < 2) { + const [targetParentLocation, to] = tail(targetLocation); + const sourceLocation = getGridLocation(sourceGroup.element); + const [sourceParentLocation, from] = tail(sourceLocation); + + if ( + sequenceEquals(sourceParentLocation, targetParentLocation) + ) { + // special case when 'swapping' two views within same grid location + // if a group has one tab - we are essentially moving the 'group' + // which is equivalent to swapping two views in this case + this.gridview.moveView(sourceParentLocation, from, to); + } else { + // source group will become empty so delete the group + const targetGroup = this.doRemoveGroup(sourceGroup, { + skipActive: true, + skipDispose: true, + }); + + // after deleting the group we need to re-evaulate the ref location + const updatedReferenceLocation = getGridLocation( + referenceGroup.element + ); + const location = getRelativeLocation( + this.gridview.orientation, + updatedReferenceLocation, + target + ); + this.doAddGroup(targetGroup, location); + } + } else { + const groupItem: IDockviewPanel | undefined = + sourceGroup?.model.removePanel(itemId) || + this.panels.find((panel) => panel.id === itemId); + + if (!groupItem) { + throw new Error(`No panel with id ${itemId}`); + } + + const dropLocation = getRelativeLocation( + this.gridview.orientation, + referenceLocation, + target + ); + + const group = this.createGroupAtLocation( dropLocation); + group.model.openPanel(groupItem); + } + } + } + + override doSetGroupActive( + group: GroupPanel | undefined, + skipFocus?: boolean + ): void { + const isGroupAlreadyFocused = this._activeGroup === group; + super.doSetGroupActive(group, skipFocus); + + if (!isGroupAlreadyFocused && this._activeGroup?.activePanel) { + this._onDidActivePanelChange.fire( + this._activeGroup?.activePanel + ); + } + } + + createGroup(options?: GroupOptions): GroupPanel { + if (!options) { + options = { tabHeight: this.tabHeight }; + } + if (typeof options.tabHeight !== 'number') { + options.tabHeight = this.tabHeight; + } + + let id = options?.id; + + if (id && this._groups.has(options.id!)) { + console.warn( + `Duplicate group id ${options?.id}. reassigning group id to avoid errors` + ); + id = undefined; + } + + if (!id) { + id = nextGroupId.next(); + while (this._groups.has(id)) { + id = nextGroupId.next(); + } + } + + const view = new GroupPanel(this, id, options); + view.init({ params: {}, accessor: null }); // required to initialized .part and allow for correct disposal of group + + if (!this._groups.has(view.id)) { + const disposable = new CompositeDisposable( + view.model.onMove((event) => { + const { groupId, itemId, target, index } = event; + this.moveGroupOrPanel(view, groupId, itemId, target, index); + }), + view.model.onDidDrop((event) => { + this._onDidDrop.fire({ ...event, api: this._api, group: view }); + }), + view.model.onDidGroupChange((event) => { + switch (event.kind) { + case GroupChangeKind2.ADD_PANEL: + if (event.panel) { + this._onDidAddPanel.fire(event.panel); + } + break; + case GroupChangeKind2.REMOVE_PANEL: + if (event.panel) { + this._onDidRemovePanel.fire(event.panel); + } + break; + case GroupChangeKind2.PANEL_ACTIVE: + this._onDidActivePanelChange.fire(event.panel); + break; + } + }) + ); + + this._groups.set(view.id, { value: view, disposable }); + } + + // TODO: must be called after the above listeners have been setup, + // not an ideal pattern + view.initialize(); + + if (typeof this.options.tabHeight === 'number') { + view.model.header.height = this.options.tabHeight; + } + + return view; + } + + private createPanel(options: AddPanelOptions, group: GroupPanel): IDockviewPanel { + const view = new DefaultGroupPanelView({ + content: this.createContentComponent(options.id, options.component), + tab: this.createTabComponent(options.id, options.tabComponent), + }); + + const panel = new DockviewGroupPanel(options.id, this, this._api, group); + panel.init({ + view, + title: options.title || options.id, + suppressClosable: options?.suppressClosable, + params: options?.params || {}, + }); + + return panel; + } + + private createContentComponent( + id: string, + componentName: string + ): IContentRenderer { + return createComponent( + id, + componentName, + this.options.components || {}, + this.options.frameworkComponents, + this.options.frameworkComponentFactory?.content + ); + } + + private createTabComponent( + id: string, + componentName?: string + ): ITabRenderer { + return createComponent( + id, + componentName, + this.options.tabComponents || {}, + this.options.frameworkTabComponents, + this.options.frameworkComponentFactory?.tab, + () => new DefaultTab() + ); + } + + private createGroupAtLocation( + location: number[] = [0] + ): GroupPanel { + const group = this.createGroup(); + this.doAddGroup(group, location); + return group + } + + private findGroup(panel: IDockviewPanel): GroupPanel | undefined { + return Array.from(this._groups.values()).find((group) => + group.value.model.containsPanel(panel) + )?.value; + } + + public dispose(): void { + super.dispose(); + + this._onDidActivePanelChange.dispose(); + this._onDidAddPanel.dispose(); + this._onDidRemovePanel.dispose(); + this._onDidLayoutFromJSON.dispose(); + } +} diff --git a/build/packages/dockview/src/dockview/dockviewGroupPanel.ts b/build/packages/dockview/src/dockview/dockviewGroupPanel.ts new file mode 100644 index 000000000..b7d44229e --- /dev/null +++ b/build/packages/dockview/src/dockview/dockviewGroupPanel.ts @@ -0,0 +1,186 @@ +import { DockviewApi } from '../api/component.api'; +import { DockviewPanelApiImpl } from '../api/groupPanelApi'; +import { + GroupPanelUpdateEvent, + GroupviewPanelState, + IDockviewPanel, + IGroupPanelInitParameters, +} from '../groupview/groupPanel'; +import { GroupPanel } from '../groupview/groupviewPanel'; +import { CompositeDisposable, MutableDisposable } from '../lifecycle'; +import { Parameters } from '../panel/types'; +import { IGroupPanelView } from './defaultGroupPanelView'; +import { DockviewComponent } from './dockviewComponent'; + +export class DockviewGroupPanel + extends CompositeDisposable + implements IDockviewPanel +{ + private readonly mutableDisposable = new MutableDisposable(); + + readonly api: DockviewPanelApiImpl; + private _group: GroupPanel; + private _params?: Parameters; + + private _view?: IGroupPanelView; + + private _title: string; + private _suppressClosable: boolean; + + get params() { + return this._params?.params; + } + + get title() { + return this._title; + } + + get suppressClosable() { + return this._suppressClosable; + } + + get group(): GroupPanel { + return this._group; + } + + get view() { + return this._view; + } + + constructor( + public readonly id: string, + accessor: DockviewComponent, + private readonly containerApi: DockviewApi, + group: GroupPanel + ) { + super(); + this._suppressClosable = false; + this._title = ''; + this._group = group; + + this.api = new DockviewPanelApiImpl(this, this._group); + + this.addDisposables( + this.api.onActiveChange(() => { + accessor.setActivePanel(this); + }), + this.api.onDidTitleChange((event) => { + const title = event.title; + this.update({ params: { title } }); + }) + ); + } + + public init(params: IGroupPanelInitParameters): void { + this._params = params.params; + this._view = params.view; + + this.setTitle(params.title); + this.setSuppressClosable(params.suppressClosable || false); + + this.view?.init({ + ...params, + api: this.api, + containerApi: this.containerApi, + }); + } + + focus() { + this.api._onFocusEvent.fire(); + } + + public toJSON(): GroupviewPanelState { + return { + id: this.id, + view: this.view!.toJSON(), + params: + Object.keys(this._params || {}).length > 0 + ? this._params + : undefined, + suppressClosable: this.suppressClosable || undefined, + title: this.title, + }; + } + + setTitle(title: string) { + const didTitleChange = title !== this._params?.title; + + if (didTitleChange) { + this._title = title; + this.api._titleChanged.fire({ title: this.title }); + } + } + + setSuppressClosable(suppressClosable: boolean) { + const didSuppressChangableClose = + suppressClosable !== this._params?.suppressClosable; + + if (didSuppressChangableClose) { + this._suppressClosable = suppressClosable; + this.api._suppressClosableChanged.fire({ + suppressClosable: !!this.suppressClosable, + }); + } + } + + public update(event: GroupPanelUpdateEvent): void { + const params = event.params as IGroupPanelInitParameters; + + this._params = { + ...(this._params || {}), + ...event.params.params, + }; + + if (typeof params.title === 'string') { + this.setTitle(params.title); + } + + if (typeof params.suppressClosable === 'boolean') { + this.setSuppressClosable(params.suppressClosable); + } + + this.view?.update({ + params: { + params: this._params, + title: this.title, + suppressClosable: this.suppressClosable, + }, + }); + } + + public updateParentGroup(group: GroupPanel, isGroupActive: boolean) { + this._group = group; + this.api.group = group; + + const isPanelVisible = this._group.model.isPanelActive(this); + + this.api._onDidActiveChange.fire({ + isActive: isGroupActive && isPanelVisible, + }); + this.api._onDidVisibilityChange.fire({ + isVisible: isPanelVisible, + }); + + this.view?.updateParentGroup( + this._group, + this._group.model.isPanelActive(this) + ); + } + + public layout(width: number, height: number) { + // the obtain the correct dimensions of the content panel we must deduct the tab height + this.api._onDidDimensionChange.fire({ + width, + height: height - (this.group.model.header.height || 0), + }); + + this.view?.layout(width, height); + } + + public dispose() { + this.api.dispose(); + this.mutableDisposable.dispose(); + + this.view?.dispose(); + } +} diff --git a/build/packages/dockview/src/dockview/options.ts b/build/packages/dockview/src/dockview/options.ts new file mode 100644 index 000000000..b53851ad9 --- /dev/null +++ b/build/packages/dockview/src/dockview/options.ts @@ -0,0 +1,99 @@ +import { DockviewApi } from '../api/component.api'; +import { Direction } from '../gridview/baseComponentGridview'; +import { IGridView } from '../gridview/gridview'; +import { IDockviewPanel } from '../groupview/groupPanel'; +import { + IContentRenderer, + ITabRenderer, + WatermarkConstructor, + IWatermarkRenderer, +} from '../groupview/types'; +import { GroupPanel } from '../groupview/groupviewPanel'; +import { ISplitviewStyles, Orientation } from '../splitview/core/splitview'; +import { FrameworkFactory } from '../types'; +import { DockviewDropTargets } from '../groupview/dnd'; + +export interface GroupPanelFrameworkComponentFactory { + content: FrameworkFactory; + tab: FrameworkFactory; + watermark: FrameworkFactory; +} + +export interface TabContextMenuEvent { + event: MouseEvent; + api: DockviewApi; + panel: IDockviewPanel; +} + +export interface DockviewRenderFunctions { + tabComponents?: { + [componentName: string]: { + new (id: string, component: string): ITabRenderer; + }; + }; + components?: { + [componentName: string]: { + new (id: string, component: string): IContentRenderer; + }; + }; + frameworkTabComponents?: { + [componentName: string]: any; + }; + frameworkComponents?: { + [componentName: string]: any; + }; +} + +export interface ViewFactoryData { + content: string; + tab?: string; +} + +export interface DockviewDndOverlayEvent { + nativeEvent: DragEvent; + target: DockviewDropTargets; + group: GroupPanel; +} + +export interface DockviewComponentOptions extends DockviewRenderFunctions { + watermarkComponent?: WatermarkConstructor; + watermarkFrameworkComponent?: any; + frameworkComponentFactory?: GroupPanelFrameworkComponentFactory; + tabHeight?: number; + orientation?: Orientation; + styles?: ISplitviewStyles; + showDndOverlay?: (event: DockviewDndOverlayEvent) => boolean; +} + +export interface PanelOptions { + component: string; + tabComponent?: string; + params?: { [key: string]: any }; + id: string; + title?: string; + suppressClosable?: boolean; +} + +export interface AddPanelOptions + extends Omit { + component: string; + tabComponent?: string; + position?: { + direction?: Direction; + referencePanel?: string; + }; +} + +export interface AddGroupOptions { + direction?: 'left' | 'right' | 'above' | 'below'; + referencePanel: string; +} + +export interface MovementOptions2 { + group?: IGridView; +} + +export interface MovementOptions extends MovementOptions2 { + includePanel?: boolean; + group?: GroupPanel; +} diff --git a/build/packages/dockview/src/dom.ts b/build/packages/dockview/src/dom.ts new file mode 100644 index 000000000..6817add51 --- /dev/null +++ b/build/packages/dockview/src/dom.ts @@ -0,0 +1,166 @@ +import { + Event, + Emitter, + addDisposableListener, + addDisposableWindowListener, +} from './events'; +import { IDisposable, CompositeDisposable } from './lifecycle'; + +export function watchElementResize( + element: HTMLElement, + cb: (entry: ResizeObserverEntry) => void +): IDisposable { + const observer = new ResizeObserver((entires) => { + const firstEntry = entires[0]; + cb(firstEntry); + }); + + observer.observe(element); + + return { + dispose: () => { + observer.unobserve(element); + observer.disconnect(); + }, + }; +} + +export const removeClasses = (element: HTMLElement, ...classes: string[]) => { + for (const classname of classes) { + if (element.classList.contains(classname)) { + element.classList.remove(classname); + } + } +}; + +export const addClasses = (element: HTMLElement, ...classes: string[]) => { + for (const classname of classes) { + if (!element.classList.contains(classname)) { + element.classList.add(classname); + } + } +}; + +export const toggleClass = ( + element: HTMLElement, + className: string, + isToggled: boolean +) => { + const hasClass = element.classList.contains(className); + if (isToggled && !hasClass) { + element.classList.add(className); + } + if (!isToggled && hasClass) { + element.classList.remove(className); + } +}; + +export function isAncestor( + testChild: Node | null, + testAncestor: Node | null +): boolean { + while (testChild) { + if (testChild === testAncestor) { + return true; + } + testChild = testChild.parentNode; + } + + return false; +} + +export function getElementsByTagName(tag: string): HTMLElement[] { + return Array.prototype.slice.call(document.getElementsByTagName(tag), 0); +} + +export interface IFocusTracker extends IDisposable { + onDidFocus: Event; + onDidBlur: Event; + refreshState?(): void; +} + +export function trackFocus(element: HTMLElement | Window): IFocusTracker { + return new FocusTracker(element); +} + +/** + * Track focus on an element. Ensure tabIndex is set when an HTMLElement is not focusable by default + */ +class FocusTracker extends CompositeDisposable implements IFocusTracker { + private readonly _onDidFocus = new Emitter(); + public readonly onDidFocus: Event = this._onDidFocus.event; + + private readonly _onDidBlur = new Emitter(); + public readonly onDidBlur: Event = this._onDidBlur.event; + + private _refreshStateHandler: () => void; + + constructor(element: HTMLElement | Window) { + super(); + + let hasFocus = isAncestor(document.activeElement, element); + let loosingFocus = false; + + const onFocus = () => { + loosingFocus = false; + if (!hasFocus) { + hasFocus = true; + this._onDidFocus.fire(); + } + }; + + const onBlur = () => { + if (hasFocus) { + loosingFocus = true; + window.setTimeout(() => { + if (loosingFocus) { + loosingFocus = false; + hasFocus = false; + this._onDidBlur.fire(); + } + }, 0); + } + }; + + this._refreshStateHandler = () => { + const currentNodeHasFocus = isAncestor( + document.activeElement, + element + ); + if (currentNodeHasFocus !== hasFocus) { + if (hasFocus) { + onBlur(); + } else { + onFocus(); + } + } + }; + + if (element instanceof HTMLElement) { + this.addDisposables( + addDisposableListener(element, 'focus', onFocus, true) + ); + this.addDisposables( + addDisposableListener(element, 'blur', onBlur, true) + ); + } else { + this.addDisposables( + addDisposableWindowListener(element, 'focus', onFocus, true) + ); + this.addDisposables( + addDisposableWindowListener(element, 'blur', onBlur, true) + ); + } + } + + refreshState() { + this._refreshStateHandler(); + } + + public dispose() { + super.dispose(); + + this._onDidBlur.dispose(); + this._onDidFocus.dispose(); + } +} diff --git a/build/packages/dockview/src/events.ts b/build/packages/dockview/src/events.ts new file mode 100644 index 000000000..3308e578d --- /dev/null +++ b/build/packages/dockview/src/events.ts @@ -0,0 +1,122 @@ +import { IDisposable } from './lifecycle'; + +export interface Event { + (listener: (e: T) => any): IDisposable; +} + +export interface EmitterOptions { + replay?: boolean; +} + +export namespace Event { + export const any = (...children: Event[]): Event => { + return (listener: (e: T) => void) => { + const disposables = children.map((child) => child(listener)); + + return { + dispose: () => { + disposables.forEach((d) => { + d.dispose(); + }); + }, + }; + }; + }; +} + +// dumb event emitter with better typings than nodes event emitter +// https://github.com/microsoft/vscode/blob/master/src/vs/base/common/event.ts +export class Emitter implements IDisposable { + private _event?: Event; + + private _last?: T; + private _listeners: Array<(e: T) => any> = []; + private _disposed = false; + + constructor(private readonly options?: EmitterOptions) {} + + get event() { + if (!this._event) { + this._event = (listener: (e: T) => void): IDisposable => { + if (this.options?.replay && this._last !== undefined) { + listener(this._last); + } + + this._listeners.push(listener); + + return { + dispose: () => { + const index = this._listeners.indexOf(listener); + if (index > -1) { + this._listeners.splice(index, 1); + } + }, + }; + }; + } + return this._event; + } + + public fire(e: T) { + this._last = e; + for (const listener of this._listeners) { + listener(e); + } + } + + public dispose() { + this._listeners = []; + this._disposed = true; + } +} + +export function addDisposableWindowListener( + element: Window, + type: K, + listener: (this: Window, ev: WindowEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): IDisposable { + element.addEventListener(type, listener, options); + + return { + dispose: () => { + element.removeEventListener(type, listener); + }, + }; +} + +export function addDisposableListener( + element: HTMLElement, + type: K, + listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, + options?: boolean | AddEventListenerOptions +): IDisposable { + element.addEventListener(type, listener, options); + + return { + dispose: () => { + element.removeEventListener(type, listener); + }, + }; +} + +export class TickDelayedEvent implements IDisposable { + private timer: any; + + private readonly _onFired = new Emitter(); + readonly onEvent = this._onFired.event; + + fire(): void { + if (this.timer) { + clearTimeout(this.timer); + } + this.timer = setTimeout(() => { + this._onFired.fire(); + clearTimeout(this.timer); + }); + } + + dispose(): void { + this._onFired.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/baseComponentGridview.ts b/build/packages/dockview/src/gridview/baseComponentGridview.ts new file mode 100644 index 000000000..58399c1e1 --- /dev/null +++ b/build/packages/dockview/src/gridview/baseComponentGridview.ts @@ -0,0 +1,318 @@ +import { Emitter, Event, TickDelayedEvent } from '../events'; +import { getGridLocation, Gridview, IGridView } from './gridview'; +import { Position } from '../dnd/droptarget'; +import { CompositeDisposable, IValueDisposable } from '../lifecycle'; +import { sequentialNumberGenerator } from '../math'; +import { + ISplitviewStyles, + Orientation, + Sizing, +} from '../splitview/core/splitview'; +import { IPanel } from '../panel/types'; +import { MovementOptions2 } from '../dockview/options'; + +const nextLayoutId = sequentialNumberGenerator(); + +export type Direction = 'left' | 'right' | 'above' | 'below' | 'within'; + +export function toTarget(direction: Direction) { + switch (direction) { + case 'left': + return Position.Left; + case 'right': + return Position.Right; + case 'above': + return Position.Top; + case 'below': + return Position.Bottom; + case 'within': + default: + return Position.Center; + } +} + +export interface BaseGridOptions { + readonly proportionalLayout: boolean; + readonly orientation: Orientation; + readonly styles?: ISplitviewStyles; +} + +export interface IGridPanelView extends IGridView, IPanel { + setActive(isActive: boolean): void; + readonly isActive: boolean; +} + +export interface IBaseGrid { + readonly element: HTMLElement; + readonly id: string; + readonly width: number; + readonly height: number; + readonly minimumHeight: number; + readonly maximumHeight: number; + readonly minimumWidth: number; + readonly maximumWidth: number; + readonly activeGroup: T | undefined; + readonly size: number; + readonly groups: T[]; + readonly onDidLayoutChange: Event; + readonly onDidRemoveGroup: Event; + readonly onDidAddGroup: Event; + readonly onDidActiveGroupChange: Event; + getPanel(id: string): T | undefined; + toJSON(): object; + fromJSON(data: any): void; + clear(): void; + layout(width: number, height: number, force?: boolean): void; + setVisible(panel: T, visible: boolean): void; + isVisible(panel: T): boolean; +} + +export abstract class BaseGrid + extends CompositeDisposable + implements IBaseGrid +{ + private readonly _id = nextLayoutId.next(); + protected readonly _groups = new Map>(); + protected readonly gridview: Gridview; + // + protected _activeGroup: T | undefined; + + private _onDidLayoutChange = new Emitter(); + readonly onDidLayoutChange = this._onDidLayoutChange.event; + + private readonly _onDidRemoveGroup = new Emitter(); + readonly onDidRemoveGroup: Event = this._onDidRemoveGroup.event; + + protected readonly _onDidAddGroup = new Emitter(); + readonly onDidAddGroup: Event = this._onDidAddGroup.event; + + private readonly _onDidActiveGroupChange = new Emitter(); + readonly onDidActiveGroupChange: Event = + this._onDidActiveGroupChange.event; + + protected readonly _bufferOnDidLayoutChange = new TickDelayedEvent(); + + get id() { + return this._id; + } + + get element() { + return this._element; + } + + get size() { + return this._groups.size; + } + + get groups() { + return Array.from(this._groups.values()).map((_) => _.value); + } + + get width() { + return this.gridview.width; + } + + get height() { + return this.gridview.height; + } + + get minimumHeight() { + return this.gridview.minimumHeight; + } + get maximumHeight() { + return this.gridview.maximumHeight; + } + get minimumWidth() { + return this.gridview.minimumWidth; + } + get maximumWidth() { + return this.gridview.maximumWidth; + } + + get activeGroup(): T | undefined { + return this._activeGroup; + } + + constructor( + private readonly _element: HTMLElement, + options: BaseGridOptions + ) { + super(); + + this.gridview = new Gridview( + !!options.proportionalLayout, + options.styles, + options.orientation + ); + + this.element.appendChild(this.gridview.element); + + this.layout(0, 0, true); // set some elements height/widths + + this.addDisposables( + this.gridview.onDidChange(() => { + this._bufferOnDidLayoutChange.fire(); + }) + ); + + this.addDisposables( + Event.any( + this.onDidAddGroup, + this.onDidRemoveGroup, + this.onDidActiveGroupChange + )(() => { + this._bufferOnDidLayoutChange.fire(); + }), + this._bufferOnDidLayoutChange.onEvent(() => { + this._onDidLayoutChange.fire(); + }), + this._bufferOnDidLayoutChange + ); + } + + public abstract toJSON(): object; + + public abstract fromJSON(data: any): void; + + public abstract clear(): void; + + public setVisible(panel: T, visible: boolean) { + this.gridview.setViewVisible(getGridLocation(panel.element), visible); + this._onDidLayoutChange.fire(); + } + + public isVisible(panel: T) { + return this.gridview.isViewVisible(getGridLocation(panel.element)); + } + + protected doAddGroup(group: T, location: number[] = [0], size?: number) { + this.gridview.addView(group, size ?? Sizing.Distribute, location); + + this._onDidAddGroup.fire(group); + + this.doSetGroupActive(group); + } + + protected doRemoveGroup( + group: T, + options?: { skipActive?: boolean; skipDispose?: boolean } + ) { + if (!this._groups.has(group.id)) { + throw new Error('invalid operation'); + } + + const item = this._groups.get(group.id); + + const view = this.gridview.remove(group, Sizing.Distribute); + + if (item && !options?.skipDispose) { + item.disposable.dispose(); + item.value.dispose(); + this._groups.delete(group.id); + } + + this._onDidRemoveGroup.fire(group); + + if (!options?.skipActive && this._activeGroup === group) { + const groups = Array.from(this._groups.values()); + + this.doSetGroupActive( + groups.length > 0 ? groups[0].value : undefined + ); + } + + return view as T; + } + + public getPanel(id: string): T | undefined { + return this._groups.get(id)?.value; + } + + public doSetGroupActive(group: T | undefined, skipFocus?: boolean) { + if (this._activeGroup === group) { + return; + } + if (this._activeGroup) { + this._activeGroup.setActive(false); + if (!skipFocus) { + this._activeGroup.focus(); + } + } + + if (group) { + group.setActive(true); + if (!skipFocus) { + group.focus(); + } + } + + this._activeGroup = group; + + this._onDidActiveGroupChange.fire(group); + } + + public removeGroup(group: T) { + this.doRemoveGroup(group); + } + + public moveToNext(options?: MovementOptions2) { + if (!options) { + options = {}; + } + if (!options.group) { + if (!this.activeGroup) { + return; + } + options.group = this.activeGroup; + } + + const location = getGridLocation(options.group.element); + const next = this.gridview.next(location)?.view; + this.doSetGroupActive(next as T); + } + + public moveToPrevious(options?: MovementOptions2) { + if (!options) { + options = {}; + } + if (!options.group) { + if (!this.activeGroup) { + return; + } + options.group = this.activeGroup; + } + + const location = getGridLocation(options.group.element); + const next = this.gridview.previous(location)?.view; + this.doSetGroupActive(next as T); + } + + public layout(width: number, height: number, forceResize?: boolean): void { + const different = + forceResize || width !== this.width || height !== this.height; + + if (!different) { + return; + } + + this.element.style.height = `${height}px`; + this.element.style.width = `${width}px`; + + this.gridview.layout(width, height); + } + + public dispose(): void { + super.dispose(); + + this._onDidActiveGroupChange.dispose(); + this._onDidAddGroup.dispose(); + this._onDidRemoveGroup.dispose(); + this._onDidLayoutChange.dispose(); + + for (const group of this.groups) { + group.dispose(); + } + + this.gridview.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/basePanelView.ts b/build/packages/dockview/src/gridview/basePanelView.ts new file mode 100644 index 000000000..61445fa21 --- /dev/null +++ b/build/packages/dockview/src/gridview/basePanelView.ts @@ -0,0 +1,134 @@ +import { trackFocus } from '../dom'; +import { CompositeDisposable } from '../lifecycle'; +import { + IFrameworkPart, + PanelUpdateEvent, + PanelInitParameters, + IPanel, +} from '../panel/types'; +import { PanelApiImpl } from '../api/panelApi'; + +export interface BasePanelViewState { + id: string; + component: string; + params?: Record; +} + +export interface BasePanelViewExported { + readonly id: string; + readonly api: T; + readonly width: number; + readonly height: number; + readonly params: Record | undefined; + focus(): void; + toJSON(): object; + update(event: PanelUpdateEvent): void; +} + +export abstract class BasePanelView + extends CompositeDisposable + implements IPanel, BasePanelViewExported +{ + private _height = 0; + private _width = 0; + private _element: HTMLElement; + protected part?: IFrameworkPart; + protected _params?: PanelInitParameters; + + /** + * Provide an IFrameworkPart that will determine the rendered UI of this view piece. + */ + protected abstract getComponent(): IFrameworkPart; + + get element() { + return this._element; + } + + get width() { + return this._width; + } + + get height() { + return this._height; + } + + get params(): Record | undefined { + return this._params?.params; + } + + constructor( + public readonly id: string, + protected readonly component: string, + public readonly api: T + ) { + super(); + + this._element = document.createElement('div'); + this._element.tabIndex = -1; + this._element.style.outline = 'none'; + this._element.style.height = '100%'; + this._element.style.width = '100%'; + this._element.style.overflow = 'hidden'; + + const { onDidFocus, onDidBlur } = trackFocus(this._element); + + this.addDisposables( + this.api, + onDidFocus(() => { + this.api._onDidChangeFocus.fire({ isFocused: true }); + }), + onDidBlur(() => { + this.api._onDidChangeFocus.fire({ isFocused: false }); + }) + ); + } + + focus() { + this.api._onFocusEvent.fire(); + } + + layout(width: number, height: number) { + this._width = width; + this._height = height; + this.api._onDidDimensionChange.fire({ width, height }); + + if (this.part) { + if (this._params) { + this.part.update(this._params.params); + } + } + } + + init(parameters: PanelInitParameters): void { + this._params = parameters; + this.part = this.getComponent(); + } + + update(event: PanelUpdateEvent) { + this._params = { + ...this._params, + params: { + ...this._params?.params, + ...event.params, + }, + }; + this.part?.update({ params: this._params.params }); + } + + toJSON(): BasePanelViewState { + const params = this._params?.params ?? {}; + + return { + id: this.id, + component: this.component, + params: Object.keys(params).length > 0 ? params : undefined, + }; + } + + dispose() { + super.dispose(); + + this.api.dispose(); + this.part?.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/branchNode.ts b/build/packages/dockview/src/gridview/branchNode.ts new file mode 100644 index 000000000..0126fab48 --- /dev/null +++ b/build/packages/dockview/src/gridview/branchNode.ts @@ -0,0 +1,300 @@ +/*--------------------------------------------------------------------------------------------- + * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at: + * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid + *--------------------------------------------------------------------------------------------*/ + +import { + IView, + Splitview, + Orientation, + Sizing, + LayoutPriority, + ISplitviewStyles, +} from '../splitview/core/splitview'; +import { Emitter, Event } from '../events'; +import { INodeDescriptor } from './gridview'; +import { LeafNode } from './leafNode'; +import { Node } from './types'; +import { CompositeDisposable, IDisposable, Disposable } from '../lifecycle'; + +export class BranchNode extends CompositeDisposable implements IView { + readonly element: HTMLElement; + private splitview: Splitview; + private _orthogonalSize: number; + private _size: number; + public readonly children: Node[] = []; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + get width(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.size + : this.orthogonalSize; + } + + get height(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.orthogonalSize + : this.size; + } + + get minimumSize(): number { + return this.children.length === 0 + ? 0 + : Math.max(...this.children.map((c) => c.minimumOrthogonalSize)); + } + + get maximumSize(): number { + return Math.min(...this.children.map((c) => c.maximumOrthogonalSize)); + } + + get minimumOrthogonalSize(): number { + return this.splitview.minimumSize; + } + + get maximumOrthogonalSize(): number { + return this.splitview.maximumSize; + } + + get orthogonalSize() { + return this._orthogonalSize; + } + + get size() { + return this._size; + } + + get minimumWidth(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.minimumOrthogonalSize + : this.minimumSize; + } + + get minimumHeight(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.minimumSize + : this.minimumOrthogonalSize; + } + + get maximumWidth(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.maximumOrthogonalSize + : this.maximumSize; + } + + get maximumHeight(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.maximumSize + : this.maximumOrthogonalSize; + } + + get priority(): LayoutPriority { + if (this.children.length === 0) { + return LayoutPriority.Normal; + } + + const priorities = this.children.map((c) => + typeof c.priority === 'undefined' + ? LayoutPriority.Normal + : c.priority + ); + + if (priorities.some((p) => p === LayoutPriority.High)) { + return LayoutPriority.High; + } else if (priorities.some((p) => p === LayoutPriority.Low)) { + return LayoutPriority.Low; + } + + return LayoutPriority.Normal; + } + + constructor( + readonly orientation: Orientation, + readonly proportionalLayout: boolean, + readonly styles: ISplitviewStyles | undefined, + size: number, + orthogonalSize: number, + childDescriptors?: INodeDescriptor[] + ) { + super(); + this._orthogonalSize = orthogonalSize; + this._size = size; + this.element = document.createElement('div'); + this.element.className = 'branch-node'; + + if (!childDescriptors) { + this.splitview = new Splitview(this.element, { + orientation: this.orientation, + proportionalLayout, + styles, + }); + this.splitview.layout(this.size, this.orthogonalSize); + } else { + const descriptor = { + views: childDescriptors.map((childDescriptor) => { + return { + view: childDescriptor.node, + size: childDescriptor.node.size, + visible: + childDescriptor.node instanceof LeafNode && + childDescriptor.visible !== undefined + ? childDescriptor.visible + : true, + }; + }), + size: this.size, + }; + + this.children = childDescriptors.map((c) => c.node); + this.splitview = new Splitview(this.element, { + orientation: this.orientation, + descriptor, + proportionalLayout, + }); + } + + this.addDisposables( + this._onDidChange, + this.splitview.onDidSashEnd(() => { + this._onDidChange.fire(undefined); + }) + ); + + this.setupChildrenEvents(); + } + + setVisible(visible: boolean) { + for (const child of this.children) { + child.setVisible(visible); + } + } + + isChildVisible(index: number): boolean { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + return this.splitview.isViewVisible(index); + } + + setChildVisible(index: number, visible: boolean): void { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + if (this.splitview.isViewVisible(index) === visible) { + return; + } + + this.splitview.setViewVisible(index, visible); + } + + moveChild(from: number, to: number): void { + if (from === to) { + return; + } + + if (from < 0 || from >= this.children.length) { + throw new Error('Invalid from index'); + } + + if (from < to) { + to--; + } + + this.splitview.moveView(from, to); + + const child = this._removeChild(from); + this._addChild(child, to); + } + + getChildSize(index: number): number { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + return this.splitview.getViewSize(index); + } + + resizeChild(index: number, size: number): void { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + this.splitview.resizeView(index, size); + } + + public layout(size: number, orthogonalSize: number) { + this._size = orthogonalSize; + this._orthogonalSize = size; + + this.splitview.layout(this.size, this.orthogonalSize); + } + + public addChild( + node: Node, + size: number | Sizing, + index: number, + skipLayout?: boolean + ): void { + if (index < 0 || index > this.children.length) { + throw new Error('Invalid index'); + } + + this.splitview.addView(node, size, index, skipLayout); + this._addChild(node, index); + } + + getChildCachedVisibleSize(index: number): number | undefined { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + return this.splitview.getViewCachedVisibleSize(index); + } + + public removeChild(index: number, sizing?: Sizing) { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + this.splitview.removeView(index, sizing); + this._removeChild(index); + } + + private _addChild(node: Node, index: number): void { + this.children.splice(index, 0, node); + this.setupChildrenEvents(); + } + + private _removeChild(index: number): Node { + const [child] = this.children.splice(index, 1); + this.setupChildrenEvents(); + + return child; + } + + private _childrenDisposable: IDisposable = Disposable.NONE; + + private setupChildrenEvents() { + this._childrenDisposable.dispose(); + + this._childrenDisposable = Event.any( + ...this.children.map((c) => c.onDidChange) + )(() => { + /** + * indicate a change has occured to allows any re-rendering but don't bubble + * event because that was specific to this branch + */ + this._onDidChange.fire(undefined); + }); + } + + public dispose() { + super.dispose(); + this._childrenDisposable.dispose(); + this.children.forEach((child) => child.dispose()); + this.splitview.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/gridview.scss b/build/packages/dockview/src/gridview/gridview.scss new file mode 100644 index 000000000..3cc2708b7 --- /dev/null +++ b/build/packages/dockview/src/gridview/gridview.scss @@ -0,0 +1,5 @@ +.grid-view, +.branch-node { + height: 100%; + width: 100%; +} diff --git a/build/packages/dockview/src/gridview/gridview.ts b/build/packages/dockview/src/gridview/gridview.ts new file mode 100644 index 000000000..8f7bfb5a3 --- /dev/null +++ b/build/packages/dockview/src/gridview/gridview.ts @@ -0,0 +1,714 @@ +/*--------------------------------------------------------------------------------------------- + * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at: + * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid + *--------------------------------------------------------------------------------------------*/ + +import { + ISplitviewStyles, + LayoutPriority, + Orientation, + Sizing, +} from '../splitview/core/splitview'; +import { Position } from '../dnd/droptarget'; +import { tail } from '../array'; +import { LeafNode } from './leafNode'; +import { BranchNode } from './branchNode'; +import { Node } from './types'; +import { Emitter, Event } from '../events'; +import { IDisposable, MutableDisposable } from '../lifecycle'; + +function findLeaf(candiateNode: Node, last: boolean): LeafNode { + if (candiateNode instanceof LeafNode) { + return candiateNode; + } + if (candiateNode instanceof BranchNode) { + return findLeaf( + candiateNode.children[last ? candiateNode.children.length - 1 : 0], + last + ); + } + throw new Error('invalid node'); +} + +function flipNode( + node: T, + size: number, + orthogonalSize: number +): T { + if (node instanceof BranchNode) { + const result = new BranchNode( + orthogonal(node.orientation), + node.proportionalLayout, + node.styles, + size, + orthogonalSize + ); + + let totalSize = 0; + + for (let i = node.children.length - 1; i >= 0; i--) { + const child = node.children[i]; + const childSize = + child instanceof BranchNode ? child.orthogonalSize : child.size; + + let newSize = + node.size === 0 + ? 0 + : Math.round((size * childSize) / node.size); + totalSize += newSize; + + // The last view to add should adjust to rounding errors + if (i === 0) { + newSize += size - totalSize; + } + + result.addChild( + flipNode(child, orthogonalSize, newSize), + newSize, + 0, + true + ); + } + + return result as T; + } else { + return new LeafNode( + node.view, + orthogonal(node.orientation), + orthogonalSize + ) as T; + } +} + +export function indexInParent(element: HTMLElement): number { + const parentElement = element.parentElement; + + if (!parentElement) { + throw new Error('Invalid grid element'); + } + + let el = parentElement.firstElementChild; + let index = 0; + + while (el !== element && el !== parentElement.lastElementChild && el) { + el = el.nextElementSibling; + index++; + } + + return index; +} + +/** + * Find the grid location of a specific DOM element by traversing the parent + * chain and finding each child index on the way. + * + * This will break as soon as DOM structures of the Splitview or Gridview change. + */ +export function getGridLocation(element: HTMLElement): number[] { + const parentElement = element.parentElement; + + if (!parentElement) { + throw new Error('Invalid grid element'); + } + + if (/\bgrid-view\b/.test(parentElement.className)) { + return []; + } + + const index = indexInParent(parentElement); + const ancestor = parentElement.parentElement!.parentElement!.parentElement!; + return [...getGridLocation(ancestor), index]; +} + +export function getRelativeLocation( + rootOrientation: Orientation, + location: number[], + direction: Position +): number[] { + const orientation = getLocationOrientation(rootOrientation, location); + const directionOrientation = getDirectionOrientation(direction); + + if (orientation === directionOrientation) { + const [rest, _index] = tail(location); + let index = _index; + + if (direction === Position.Right || direction === Position.Bottom) { + index += 1; + } + + return [...rest, index]; + } else { + const index = + direction === Position.Right || direction === Position.Bottom + ? 1 + : 0; + return [...location, index]; + } +} + +export function getDirectionOrientation(direction: Position): Orientation { + return direction === Position.Top || direction === Position.Bottom + ? Orientation.VERTICAL + : Orientation.HORIZONTAL; +} + +export function getLocationOrientation( + rootOrientation: Orientation, + location: number[] +): Orientation { + return location.length % 2 === 0 + ? orthogonal(rootOrientation) + : rootOrientation; +} + +export interface IViewSize { + width?: number; + height?: number; +} + +export interface IGridView { + readonly onDidChange: Event; + readonly element: HTMLElement; + readonly minimumWidth: number; + readonly maximumWidth: number; + readonly minimumHeight: number; + readonly maximumHeight: number; + priority?: LayoutPriority; + layout(width: number, height: number): void; + toJSON(): object; + fromJSON?(json: object): void; + snap?: boolean; + setVisible?(visible: boolean): void; +} + +export const orthogonal = (orientation: Orientation) => + orientation === Orientation.HORIZONTAL + ? Orientation.VERTICAL + : Orientation.HORIZONTAL; + +export interface GridLeafNode { + readonly view: T; + readonly cachedVisibleSize: number | undefined; + readonly box: { width: number; height: number }; +} + +export interface GridBranchNode { + readonly children: GridNode[]; + readonly box: { width: number; height: number }; +} + +export type GridNode = GridLeafNode | GridBranchNode; + +export function isGridBranchNode( + node: GridNode +): node is GridBranchNode { + return !!(node as any).children; +} + +export interface SerializedGridObject { + type: 'leaf' | 'branch'; + data: T | SerializedGridObject[]; + size?: number; + visible?: boolean; +} + +const serializeBranchNode = ( + node: GridNode, + orientation: Orientation +): SerializedGridObject => { + const size = + orientation === Orientation.VERTICAL ? node.box.width : node.box.height; + + if (!isGridBranchNode(node)) { + if (typeof node.cachedVisibleSize === 'number') { + return { + type: 'leaf', + data: node.view.toJSON(), + size: node.cachedVisibleSize, + visible: false, + }; + } + + return { type: 'leaf', data: node.view.toJSON(), size }; + } + + return { + type: 'branch', + data: node.children.map((c) => + serializeBranchNode(c, orthogonal(orientation)) + ), + size, + }; +}; + +export interface ISerializedLeafNode { + type: 'leaf'; + data: T; + size: number; + visible?: boolean; +} + +export interface ISerializedBranchNode { + type: 'branch'; + data: ISerializedNode[]; + size: number; +} + +export type ISerializedNode = ISerializedLeafNode | ISerializedBranchNode; + +export interface INodeDescriptor { + node: Node; + visible?: boolean; +} + +export interface IViewDeserializer { + fromJSON: (data: ISerializedLeafNode) => IGridView; +} +export class Gridview implements IDisposable { + private _root: BranchNode | undefined; + public readonly element: HTMLElement; + private disposable: MutableDisposable = new MutableDisposable(); + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + public serialize() { + const root = serializeBranchNode(this.getView(), this.orientation); + + return { + root, + width: this.width, + height: this.height, + orientation: this.orientation, + }; + } + + public dispose() { + this.disposable.dispose(); + this._onDidChange.dispose(); + this.root.dispose(); + + this.element.remove(); + } + + public clear() { + const orientation = this.root.orientation; + this.root = new BranchNode( + orientation, + this.proportionalLayout, + this.styles, + this.root.size, + this.root.orthogonalSize + ); + } + + public deserialize(json: any, deserializer: IViewDeserializer) { + const orientation = json.orientation; + const height = + orientation === Orientation.VERTICAL ? json.height : json.width; + this._deserialize( + json.root as ISerializedBranchNode, + orientation, + deserializer, + height + ); + } + + private _deserialize( + root: ISerializedBranchNode, + orientation: Orientation, + deserializer: IViewDeserializer, + orthogonalSize: number + ): void { + this.root = this._deserializeNode( + root, + orientation, + deserializer, + orthogonalSize, + true + ) as BranchNode; + } + + private _deserializeNode( + node: ISerializedNode, + orientation: Orientation, + deserializer: IViewDeserializer, + orthogonalSize: number, + isRoot = false + ): Node { + let result: Node; + if (node.type === 'branch') { + const serializedChildren = node.data; + const children = serializedChildren.map((serializedChild) => { + return { + node: this._deserializeNode( + serializedChild, + orthogonal(orientation), + deserializer, + node.size + ), + visible: (serializedChild as { visible: boolean }).visible, + } as INodeDescriptor; + }); + + // HORIZONTAL => height=orthogonalsize width=size + // VERTICAL => height=size width=orthogonalsize + result = new BranchNode( + orientation, + this.proportionalLayout, + this.styles, + isRoot ? orthogonalSize : node.size, + isRoot ? node.size : orthogonalSize, + children + ); + } else { + result = new LeafNode( + deserializer.fromJSON(node), + orientation, + orthogonalSize, + node.size + ); + } + + return result; + } + + public get orientation() { + return this.root.orientation; + } + + public set orientation(orientation: Orientation) { + if (this.root.orientation === orientation) { + return; + } + + const { size, orthogonalSize } = this.root; + this.root = flipNode(this.root, orthogonalSize, size); + this.root.layout(size, orthogonalSize); + } + + private get root(): BranchNode { + return this._root!; + } + + private set root(root: BranchNode) { + const oldRoot = this._root; + + if (oldRoot) { + oldRoot.dispose(); + this.element.removeChild(oldRoot.element); + } + + this._root = root; + this.element.appendChild(this._root.element); + this.disposable.value = this._root.onDidChange((e) => { + this._onDidChange.fire(e); + }); + } + + public next(location: number[]) { + return this.progmaticSelect(location); + } + + public previous(location: number[]) { + return this.progmaticSelect(location, true); + } + + getView(): GridBranchNode; + getView(location?: number[]): GridNode; + getView(location?: number[]): GridNode { + const node = location ? this.getNode(location)[1] : this.root; + return this._getViews(node, this.orientation); + } + + private _getViews( + node: Node, + orientation: Orientation, + cachedVisibleSize?: number + ): GridNode { + const box = { height: node.height, width: node.width }; + + if (node instanceof LeafNode) { + return { box, view: node.view, cachedVisibleSize }; + } + + const children: GridNode[] = []; + + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + const nodeCachedVisibleSize = node.getChildCachedVisibleSize(i); + + children.push( + this._getViews( + child, + orthogonal(orientation), + nodeCachedVisibleSize + ) + ); + } + + return { box, children }; + } + + private progmaticSelect(location: number[], reverse = false) { + const [path, node] = this.getNode(location); + + if (!(node instanceof LeafNode)) { + throw new Error('invalid location'); + } + + for (let i = path.length - 1; i > -1; i--) { + const n = path[i]; + const l = location[i] || 0; + const canProgressInCurrentLevel = reverse + ? l - 1 > -1 + : l + 1 < n.children.length; + if (canProgressInCurrentLevel) { + return findLeaf(n.children[reverse ? l - 1 : l + 1], reverse); + } + } + + return findLeaf(this.root, reverse); + } + + get width(): number { + return this.root.width; + } + get height(): number { + return this.root.height; + } + + get minimumWidth(): number { + return this.root.minimumWidth; + } + get minimumHeight(): number { + return this.root.minimumHeight; + } + get maximumWidth(): number { + return this.root.maximumHeight; + } + get maximumHeight(): number { + return this.root.maximumHeight; + } + + constructor( + readonly proportionalLayout: boolean, + readonly styles: ISplitviewStyles | undefined, + orientation: Orientation + ) { + this.element = document.createElement('div'); + this.element.className = 'grid-view'; + this.root = new BranchNode( + orientation, + proportionalLayout, + styles, + 0, + 0 + ); + } + + isViewVisible(location: number[]): boolean { + const [rest, index] = tail(location); + const [, parent] = this.getNode(rest); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid from location'); + } + + return parent.isChildVisible(index); + } + + setViewVisible(location: number[], visible: boolean): void { + const [rest, index] = tail(location); + const [, parent] = this.getNode(rest); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid from location'); + } + + parent.setChildVisible(index, visible); + } + + public moveView(parentLocation: number[], from: number, to: number): void { + const [, parent] = this.getNode(parentLocation); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + parent.moveChild(from, to); + } + + public addView(view: IGridView, size: number | Sizing, location: number[]) { + const [rest, index] = tail(location); + + const [pathToParent, parent] = this.getNode(rest); + + if (parent instanceof BranchNode) { + const node = new LeafNode( + view, + orthogonal(parent.orientation), + parent.orthogonalSize + ); + parent.addChild(node, size, index); + } else { + const [grandParent, ..._] = [...pathToParent].reverse(); + const [parentIndex, ...__] = [...rest].reverse(); + + let newSiblingSize: number | Sizing = 0; + + const newSiblingCachedVisibleSize = + grandParent.getChildCachedVisibleSize(parentIndex); + if (typeof newSiblingCachedVisibleSize === 'number') { + newSiblingSize = Sizing.Invisible(newSiblingCachedVisibleSize); + } + + grandParent.removeChild(parentIndex); + + const newParent = new BranchNode( + parent.orientation, + this.proportionalLayout, + this.styles, + parent.size, + parent.orthogonalSize + ); + grandParent.addChild(newParent, parent.size, parentIndex); + + const newSibling = new LeafNode( + parent.view, + grandParent.orientation, + parent.size + ); + newParent.addChild(newSibling, newSiblingSize, 0); + + if (typeof size !== 'number' && size.type === 'split') { + size = { type: 'split', index: 0 }; + } + + const node = new LeafNode( + view, + grandParent.orientation, + parent.size + ); + newParent.addChild(node, size, index); + } + } + + public remove(view: IGridView, sizing?: Sizing) { + const location = getGridLocation(view.element); + return this.removeView(location, sizing); + } + + removeView(location: number[], sizing?: Sizing): IGridView { + const [rest, index] = tail(location); + const [pathToParent, parent] = this.getNode(rest); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + const node = parent.children[index]; + + if (!(node instanceof LeafNode)) { + throw new Error('Invalid location'); + } + + parent.removeChild(index, sizing); + + if (parent.children.length === 0) { + return node.view; + } + + if (parent.children.length > 1) { + return node.view; + } + + const sibling = parent.children[0]; + + if (pathToParent.length === 0) { + // parent is root + + if (sibling instanceof LeafNode) { + return node.view; + } + + // we must promote sibling to be the new root + parent.removeChild(0, sizing); + this.root = sibling; + return node.view; + } + + const [grandParent, ..._] = [...pathToParent].reverse(); + const [parentIndex, ...__] = [...rest].reverse(); + + const isSiblingVisible = parent.isChildVisible(0); + parent.removeChild(0, sizing); + + const sizes = grandParent.children.map((_size, i) => + grandParent.getChildSize(i) + ); + grandParent.removeChild(parentIndex, sizing); + + if (sibling instanceof BranchNode) { + sizes.splice( + parentIndex, + 1, + ...sibling.children.map((c) => c.size) + ); + + for (let i = 0; i < sibling.children.length; i++) { + const child = sibling.children[i]; + grandParent.addChild(child, child.size, parentIndex + i); + } + } else { + const newSibling = new LeafNode( + sibling.view, + orthogonal(sibling.orientation), + sibling.size + ); + const siblingSizing = isSiblingVisible + ? sibling.orthogonalSize + : Sizing.Invisible(sibling.orthogonalSize); + grandParent.addChild(newSibling, siblingSizing, parentIndex); + } + + for (let i = 0; i < sizes.length; i++) { + grandParent.resizeChild(i, sizes[i]); + } + + return node.view; + } + + public layout(width: number, height: number) { + const [size, orthogonalSize] = + this.root.orientation === Orientation.HORIZONTAL + ? [height, width] + : [width, height]; + this.root.layout(size, orthogonalSize); + } + + private getNode( + location: number[], + node: Node = this.root, + path: BranchNode[] = [] + ): [BranchNode[], Node] { + if (location.length === 0) { + return [path, node]; + } + + if (!(node instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + const [index, ...rest] = location; + + if (index < 0 || index >= node.children.length) { + throw new Error('Invalid location'); + } + + const child = node.children[index]; + path.push(node); + + return this.getNode(rest, child, path); + } +} diff --git a/build/packages/dockview/src/gridview/gridviewComponent.ts b/build/packages/dockview/src/gridview/gridviewComponent.ts new file mode 100644 index 000000000..daf7ce013 --- /dev/null +++ b/build/packages/dockview/src/gridview/gridviewComponent.ts @@ -0,0 +1,423 @@ +import { + getRelativeLocation, + SerializedGridObject, + getGridLocation, +} from './gridview'; +import { Position } from '../dnd/droptarget'; +import { tail, sequenceEquals } from '../array'; +import { CompositeDisposable } from '../lifecycle'; +import { IPanelDeserializer } from '../dockview/deserializer'; +import { GridviewComponentOptions } from './options'; +import { + BaseGrid, + Direction, + IBaseGrid, + IGridPanelView, + toTarget, +} from './baseComponentGridview'; +import { + GridviewPanel, + GridviewInitParameters, + GridPanelViewState, + IGridviewPanel, +} from './gridviewPanel'; +import { BaseComponentOptions } from '../panel/types'; +import { Orientation, Sizing } from '../splitview/core/splitview'; +import { createComponent } from '../panel/componentFactory'; +import { Emitter, Event } from '../events'; + +export interface SerializedGridview { + grid: { + height: number; + width: number; + orientation: Orientation; + root: SerializedGridObject; + }; + activePanel?: string; +} + +export interface AddComponentOptions extends BaseComponentOptions { + minimumWidth?: number; + maximumWidth?: number; + minimumHeight?: number; + maximumHeight?: number; + position?: { + direction: Direction; + referencePanel: string; + }; + location?: number[]; +} + +export interface IGridPanelComponentView extends IGridPanelView { + init: (params: GridviewInitParameters) => void; +} + +export type GridviewComponentUpdateOptions = Pick< + GridviewComponentOptions, + 'orientation' | 'components' | 'frameworkComponents' +>; + +export interface IGridviewComponent extends IBaseGrid { + readonly orientation: Orientation; + readonly onDidLayoutFromJSON: Event; + updateOptions(options: Partial): void; + addPanel(options: AddComponentOptions): IGridviewPanel; + removePanel(panel: IGridviewPanel, sizing?: Sizing): void; + focus(): void; + fromJSON(serializedGridview: SerializedGridview): void; + toJSON(): SerializedGridview; + movePanel( + panel: IGridviewPanel, + options: { direction: Direction; reference: string; size?: number } + ): void; + setVisible(panel: IGridviewPanel, visible: boolean): void; + setActive(panel: IGridviewPanel): void; +} + +export class GridviewComponent + extends BaseGrid + implements IGridviewComponent +{ + private _options: Exclude; + private _deserializer: IPanelDeserializer | undefined; + + private readonly _onDidLayoutfromJSON = new Emitter(); + readonly onDidLayoutFromJSON: Event = this._onDidLayoutfromJSON.event; + + get orientation() { + return this.gridview.orientation; + } + + set orientation(value: Orientation) { + this.gridview.orientation = value; + } + + get options() { + return this._options; + } + + get deserializer(): IPanelDeserializer | undefined { + return this._deserializer; + } + + set deserializer(value: IPanelDeserializer | undefined) { + this._deserializer = value; + } + + constructor(element: HTMLElement, options: GridviewComponentOptions) { + super(element, { + proportionalLayout: options.proportionalLayout, + orientation: options.orientation, + styles: options.styles, + }); + + this._options = options; + + if (!this.options.components) { + this.options.components = {}; + } + if (!this.options.frameworkComponents) { + this.options.frameworkComponents = {}; + } + } + + updateOptions(options: Partial): void { + const hasOrientationChanged = + typeof options.orientation === 'string' && + this.gridview.orientation !== options.orientation; + + this._options = { ...this.options, ...options }; + + if (hasOrientationChanged) { + this.gridview.orientation = options.orientation!; + } + + this.layout(this.gridview.width, this.gridview.height, true); + } + + removePanel(panel: GridviewPanel) { + this.removeGroup(panel); + } + + /** + * Serialize the current state of the layout + * + * @returns A JSON respresentation of the layout + */ + public toJSON(): SerializedGridview { + const data = this.gridview.serialize() as { + height: number; + width: number; + orientation: Orientation; + root: SerializedGridObject; + }; + + return { + grid: data, + activePanel: this.activeGroup?.id, + }; + } + + setVisible(panel: GridviewPanel, visible: boolean): void { + this.gridview.setViewVisible(getGridLocation(panel.element), visible); + } + + setActive(panel: GridviewPanel): void { + this._groups.forEach((value, _key) => { + value.value.setActive(panel === value.value); + }); + } + + focus() { + this.activeGroup?.focus(); + } + + public fromJSON(serializedGridview: SerializedGridview) { + this.clear(); + + const { grid, activePanel } = serializedGridview; + + const queue: Function[] = []; + + this.gridview.deserialize(grid, { + fromJSON: (node) => { + const { data } = node; + const view = createComponent( + data.id, + data.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkComponentFactory + ? { + createComponent: + this.options.frameworkComponentFactory + .createComponent, + } + : undefined + ); + + queue.push(() => + view.init({ + params: data.params, + minimumWidth: data.minimumWidth, + maximumWidth: data.maximumWidth, + minimumHeight: data.minimumHeight, + maximumHeight: data.maximumHeight, + priority: data.priority, + snap: !!data.snap, + accessor: this, + isVisible: node.visible, + }) + ); + + this._onDidAddGroup.fire(view); + + this.registerPanel(view); + + return view; + }, + }); + + this.layout(this.width, this.height, true); + + queue.forEach((f) => f()); + + if (typeof activePanel === 'string') { + const panel = this.getPanel(activePanel); + if (panel) { + this.doSetGroupActive(panel); + } + } + + this._onDidLayoutfromJSON.fire(); + } + + clear(): void { + const hasActiveGroup = this.activeGroup; + + const groups = Array.from(this._groups.values()); // reassign since group panels will mutate + for (const group of groups) { + group.disposable.dispose(); + this.doRemoveGroup(group.value, { skipActive: true }); + } + + if (hasActiveGroup) { + this.doSetGroupActive(undefined); + } + + this.gridview.clear(); + } + + movePanel( + panel: GridviewPanel, + options: { direction: Direction; reference: string; size?: number } + ): void { + let relativeLocation: number[]; + + const removedPanel = this.gridview.remove(panel) as GridviewPanel; + + const referenceGroup = this._groups.get(options.reference)?.value; + + if (!referenceGroup) { + throw new Error( + `reference group ${options.reference} does not exist` + ); + } + + const target = toTarget(options.direction); + if (target === Position.Center) { + throw new Error(`${target} not supported as an option`); + } else { + const location = getGridLocation(referenceGroup.element); + relativeLocation = getRelativeLocation( + this.gridview.orientation, + location, + target + ); + } + + this.doAddGroup(removedPanel, relativeLocation, options.size); + } + + public addPanel(options: AddComponentOptions): IGridviewPanel { + let relativeLocation: number[] = options.location || [0]; + + if (options.position?.referencePanel) { + const referenceGroup = this._groups.get( + options.position.referencePanel + )?.value; + + if (!referenceGroup) { + throw new Error( + `reference group ${options.position.referencePanel} does not exist` + ); + } + + const target = toTarget(options.position.direction); + if (target === Position.Center) { + throw new Error(`${target} not supported as an option`); + } else { + const location = getGridLocation(referenceGroup.element); + relativeLocation = getRelativeLocation( + this.gridview.orientation, + location, + target + ); + } + } + + const view = createComponent( + options.id, + options.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkComponentFactory + ? { + createComponent: + this.options.frameworkComponentFactory + .createComponent, + } + : undefined + ); + + view.init({ + params: options.params || {}, + minimumWidth: options.minimumWidth, + maximumWidth: options.maximumWidth, + minimumHeight: options.minimumHeight, + maximumHeight: options.maximumHeight, + priority: options.priority, + snap: !!options.snap, + accessor: this, + isVisible: true, + }); + + this.registerPanel(view); + + this.doAddGroup(view, relativeLocation, options.size); + + return view; + } + + private registerPanel(panel: GridviewPanel) { + const disposable = new CompositeDisposable( + panel.api.onDidFocusChange((event) => { + if (!event.isFocused) { + return; + } + this._groups.forEach((groupItem) => { + const group = groupItem.value; + if (group !== panel) { + group.setActive(false); + } else { + group.setActive(true); + } + }); + }) + ); + + this._groups.set(panel.id, { + value: panel, + disposable, + }); + } + + public moveGroup( + referenceGroup: IGridPanelComponentView, + groupId: string, + target: Position + ) { + const sourceGroup = this.getPanel(groupId); + + if (!sourceGroup) { + throw new Error('invalid operation'); + } + + const referenceLocation = getGridLocation(referenceGroup.element); + const targetLocation = getRelativeLocation( + this.gridview.orientation, + referenceLocation, + target + ); + + const [targetParentLocation, to] = tail(targetLocation); + const sourceLocation = getGridLocation(sourceGroup.element); + const [sourceParentLocation, from] = tail(sourceLocation); + + if (sequenceEquals(sourceParentLocation, targetParentLocation)) { + // special case when 'swapping' two views within same grid location + // if a group has one tab - we are essentially moving the 'group' + // which is equivalent to swapping two views in this case + this.gridview.moveView(sourceParentLocation, from, to); + + return; + } + + // source group will become empty so delete the group + const targetGroup = this.doRemoveGroup(sourceGroup, { + skipActive: true, + skipDispose: true, + }); + + // after deleting the group we need to re-evaulate the ref location + const updatedReferenceLocation = getGridLocation( + referenceGroup.element + ); + const location = getRelativeLocation( + this.gridview.orientation, + updatedReferenceLocation, + target + ); + this.doAddGroup(targetGroup, location); + } + + removeGroup(group: GridviewPanel) { + super.removeGroup(group); + } + + public dispose() { + super.dispose(); + + this._onDidLayoutfromJSON.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/gridviewPanel.ts b/build/packages/dockview/src/gridview/gridviewPanel.ts new file mode 100644 index 000000000..fbdfc6575 --- /dev/null +++ b/build/packages/dockview/src/gridview/gridviewPanel.ts @@ -0,0 +1,245 @@ +import { PanelInitParameters } from '../panel/types'; +import { + GridviewComponent, + IGridPanelComponentView, +} from './gridviewComponent'; +import { FunctionOrValue } from '../types'; +import { + BasePanelView, + BasePanelViewExported, + BasePanelViewState, +} from './basePanelView'; +import { GridviewPanelApiImpl } from '../api/gridviewPanelApi'; +import { LayoutPriority } from '../splitview/core/splitview'; +import { Emitter, Event } from '../events'; +import { IViewSize } from './gridview'; + +export interface GridviewInitParameters extends PanelInitParameters { + minimumWidth?: number; + maximumWidth?: number; + minimumHeight?: number; + maximumHeight?: number; + priority?: LayoutPriority; + snap?: boolean; + accessor: GridviewComponent; + isVisible?: boolean; +} + +export interface IGridviewPanel + extends BasePanelViewExported { + readonly minimumWidth: number; + readonly maximumWidth: number; + readonly minimumHeight: number; + readonly maximumHeight: number; + readonly priority: LayoutPriority | undefined; + readonly snap: boolean; +} + +export abstract class GridviewPanel + extends BasePanelView + implements IGridPanelComponentView, IGridviewPanel +{ + private _evaluatedMinimumWidth = 0; + private _evaluatedMaximumWidth = Number.MAX_SAFE_INTEGER; + private _evaluatedMinimumHeight = 0; + private _evaluatedMaximumHeight = Number.MAX_SAFE_INTEGER; + + private _minimumWidth: FunctionOrValue = 0; + private _minimumHeight: FunctionOrValue = 0; + private _maximumWidth: FunctionOrValue = Number.MAX_SAFE_INTEGER; + private _maximumHeight: FunctionOrValue = Number.MAX_SAFE_INTEGER; + private _priority?: LayoutPriority; + private _snap = false; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = + this._onDidChange.event; + + get priority(): LayoutPriority | undefined { + return this._priority; + } + + get snap() { + return this._snap; + } + + get minimumWidth() { + const width = + typeof this._minimumWidth === 'function' + ? this._minimumWidth() + : this._minimumWidth; + + if (width !== this._evaluatedMinimumWidth) { + this._evaluatedMinimumWidth = width; + this.updateConstraints(); + } + + return width; + } + + get minimumHeight() { + const height = + typeof this._minimumHeight === 'function' + ? this._minimumHeight() + : this._minimumHeight; + + if (height !== this._evaluatedMinimumHeight) { + this._evaluatedMinimumHeight = height; + this.updateConstraints(); + } + + return height; + } + + get maximumHeight() { + const height = + typeof this._maximumHeight === 'function' + ? this._maximumHeight() + : this._maximumHeight; + + if (height !== this._evaluatedMaximumHeight) { + this._evaluatedMaximumHeight = height; + this.updateConstraints(); + } + + return height; + } + + get maximumWidth() { + const width = + typeof this._maximumWidth === 'function' + ? this._maximumWidth() + : this._maximumWidth; + + if (width !== this._evaluatedMaximumWidth) { + this._evaluatedMaximumWidth = width; + this.updateConstraints(); + } + + return width; + } + + get isActive() { + return this.api.isActive; + } + + constructor( + id: string, + component: string, + api = new GridviewPanelApiImpl(id) + ) { + super(id, component, api); + + this.addDisposables( + this._onDidChange, + this.api.onVisibilityChange((event) => { + const { isVisible } = event; + const { accessor } = this._params as GridviewInitParameters; + accessor.setVisible(this, isVisible); + }), + this.api.onActiveChange(() => { + const { accessor } = this._params as GridviewInitParameters; + accessor.setActive(this); + }), + this.api.onDidConstraintsChangeInternal((event) => { + if ( + typeof event.minimumWidth === 'number' || + typeof event.minimumWidth === 'function' + ) { + this._minimumWidth = event.minimumWidth; + } + if ( + typeof event.minimumHeight === 'number' || + typeof event.minimumHeight === 'function' + ) { + this._minimumHeight = event.minimumHeight; + } + if ( + typeof event.maximumWidth === 'number' || + typeof event.maximumWidth === 'function' + ) { + this._maximumWidth = event.maximumWidth; + } + if ( + typeof event.maximumHeight === 'number' || + typeof event.maximumHeight === 'function' + ) { + this._maximumHeight = event.maximumHeight; + } + }), + this.api.onDidSizeChange((event) => { + this._onDidChange.fire({ + height: event.height, + width: event.width, + }); + }) + ); + } + + setVisible(isVisible: boolean) { + this.api._onDidVisibilityChange.fire({ isVisible }); + } + + setActive(isActive: boolean) { + this.api._onDidActiveChange.fire({ isActive }); + } + + init(parameters: GridviewInitParameters): void { + if (parameters.maximumHeight) { + this._maximumHeight = parameters.maximumHeight; + } + if (parameters.minimumHeight) { + this._minimumHeight = parameters.minimumHeight; + } + if (parameters.maximumWidth) { + this._maximumWidth = parameters.maximumWidth; + } + if (parameters.minimumWidth) { + this._minimumWidth = parameters.minimumWidth; + } + + this._priority = parameters.priority; + this._snap = !!parameters.snap; + + super.init(parameters); + + if (typeof parameters.isVisible === 'boolean') { + this.setVisible(parameters.isVisible); + } + } + + private updateConstraints() { + this.api._onDidConstraintsChange.fire({ + minimumWidth: this._evaluatedMinimumWidth, + maximumWidth: this._evaluatedMaximumWidth, + minimumHeight: this._evaluatedMinimumHeight, + maximumHeight: this._evaluatedMaximumHeight, + }); + } + + toJSON(): GridPanelViewState { + const state = super.toJSON(); + const maximum = (value: number) => + value === Number.MAX_SAFE_INTEGER ? undefined : value; + const minimum = (value: number) => (value <= 0 ? undefined : value); + + return { + ...state, + minimumHeight: minimum(this.minimumHeight), + maximumHeight: maximum(this.maximumHeight), + minimumWidth: minimum(this.minimumWidth), + maximumWidth: maximum(this.maximumWidth), + snap: this.snap, + priority: this.priority, + }; + } +} + +export interface GridPanelViewState extends BasePanelViewState { + minimumHeight?: number; + maximumHeight?: number; + minimumWidth?: number; + maximumWidth?: number; + snap?: boolean; + priority?: LayoutPriority; +} diff --git a/build/packages/dockview/src/gridview/leafNode.ts b/build/packages/dockview/src/gridview/leafNode.ts new file mode 100644 index 000000000..5da71ad7f --- /dev/null +++ b/build/packages/dockview/src/gridview/leafNode.ts @@ -0,0 +1,134 @@ +/*--------------------------------------------------------------------------------------------- + * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at: + * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/grid + *--------------------------------------------------------------------------------------------*/ + +import { + IView, + LayoutPriority, + Orientation, +} from '../splitview/core/splitview'; +import { Emitter, Event } from '../events'; +import { IGridView } from './gridview'; +import { IDisposable } from '../lifecycle'; + +export class LeafNode implements IView { + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + private _size: number; + private _orthogonalSize: number; + private _disposable: IDisposable; + + private get minimumWidth(): number { + return this.view.minimumWidth; + } + + private get maximumWidth(): number { + return this.view.maximumWidth; + } + + private get minimumHeight(): number { + return this.view.minimumHeight; + } + + private get maximumHeight(): number { + return this.view.maximumHeight; + } + + get priority(): LayoutPriority | undefined { + return this.view.priority; + } + + get snap() { + return this.view.snap; + } + + get minimumSize(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.minimumHeight + : this.minimumWidth; + } + + get maximumSize(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.maximumHeight + : this.maximumWidth; + } + + get minimumOrthogonalSize(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.minimumWidth + : this.minimumHeight; + } + + get maximumOrthogonalSize(): number { + return this.orientation === Orientation.HORIZONTAL + ? this.maximumWidth + : this.maximumHeight; + } + + get orthogonalSize() { + return this._orthogonalSize; + } + + get size() { + return this._size; + } + + get element() { + return this.view.element; + } + + get width() { + return this.orientation === Orientation.HORIZONTAL + ? this.orthogonalSize + : this.size; + } + + get height() { + return this.orientation === Orientation.HORIZONTAL + ? this.size + : this.orthogonalSize; + } + + constructor( + public readonly view: IGridView, + readonly orientation: Orientation, + orthogonalSize: number, + size = 0 + ) { + this._orthogonalSize = orthogonalSize; + this._size = size; + + this._disposable = this.view.onDidChange((event) => { + if (event) { + this._onDidChange.fire( + this.orientation === Orientation.VERTICAL + ? event.width + : event.height + ); + } else { + this._onDidChange.fire(undefined); + } + }); + } + + public setVisible(visible: boolean) { + if (this.view.setVisible) { + this.view.setVisible(visible); + this._onDidChange.fire(undefined); + } + } + + public layout(size: number, orthogonalSize: number) { + this._size = size; + this._orthogonalSize = orthogonalSize; + + this.view.layout(this.width, this.height); + } + + public dispose() { + this._onDidChange.dispose(); + this._disposable.dispose(); + } +} diff --git a/build/packages/dockview/src/gridview/options.ts b/build/packages/dockview/src/gridview/options.ts new file mode 100644 index 000000000..86530f0f7 --- /dev/null +++ b/build/packages/dockview/src/gridview/options.ts @@ -0,0 +1,19 @@ +import { GridviewPanel } from './gridviewPanel'; +import { ISplitviewStyles, Orientation } from '../splitview/core/splitview'; +import { FrameworkFactory } from '../types'; + +export interface GridviewComponentOptions { + proportionalLayout: boolean; + orientation: Orientation; + components?: { + [componentName: string]: { + new (id: string, componentName: string): GridviewPanel; + }; + }; + frameworkComponents?: { + [componentName: string]: any; + }; + frameworkComponentFactory?: FrameworkFactory; + tabHeight?: number; + styles?: ISplitviewStyles; +} diff --git a/build/packages/dockview/src/gridview/types.ts b/build/packages/dockview/src/gridview/types.ts new file mode 100644 index 000000000..2af426f17 --- /dev/null +++ b/build/packages/dockview/src/gridview/types.ts @@ -0,0 +1,4 @@ +import { BranchNode } from './branchNode'; +import { LeafNode } from './leafNode'; + +export type Node = BranchNode | LeafNode; diff --git a/build/packages/dockview/src/groupview/dnd.ts b/build/packages/dockview/src/groupview/dnd.ts new file mode 100644 index 000000000..bba4250d4 --- /dev/null +++ b/build/packages/dockview/src/groupview/dnd.ts @@ -0,0 +1,5 @@ +export enum DockviewDropTargets { + Tab, + Panel, + TabContainer, +} diff --git a/build/packages/dockview/src/groupview/groupPanel.ts b/build/packages/dockview/src/groupview/groupPanel.ts new file mode 100644 index 000000000..8b99f184e --- /dev/null +++ b/build/packages/dockview/src/groupview/groupPanel.ts @@ -0,0 +1,44 @@ +import { DockviewPanelApi } from '../api/groupPanelApi'; +import { IDisposable } from '../lifecycle'; +import { HeaderPartInitParameters } from './types'; +import { + IPanel, + PanelInitParameters, + PanelUpdateEvent, + Parameters, +} from '../panel/types'; +import { GroupPanel } from './groupviewPanel'; +import { IGroupPanelView } from '../dockview/defaultGroupPanelView'; + +export interface IGroupPanelInitParameters + extends PanelInitParameters, + HeaderPartInitParameters { + view: IGroupPanelView; +} + +export type GroupPanelUpdateEvent = PanelUpdateEvent<{ + params?: Parameters; + title?: string; + suppressClosable?: boolean; +}>; + +export interface IDockviewPanel extends IDisposable, IPanel { + readonly view?: IGroupPanelView; + readonly group: GroupPanel; + readonly api: DockviewPanelApi; + readonly title: string; + readonly suppressClosable: boolean; + readonly params: Record | undefined; + updateParentGroup(group: GroupPanel, isGroupActive: boolean): void; + init(params: IGroupPanelInitParameters): void; + toJSON(): GroupviewPanelState; + update(event: GroupPanelUpdateEvent): void; +} + +export interface GroupviewPanelState { + id: string; + view?: any; + title: string; + params?: { [key: string]: any }; + suppressClosable?: boolean; +} diff --git a/build/packages/dockview/src/groupview/groupview.scss b/build/packages/dockview/src/groupview/groupview.scss new file mode 100644 index 000000000..d1c10568a --- /dev/null +++ b/build/packages/dockview/src/groupview/groupview.scss @@ -0,0 +1,23 @@ +.groupview { + display: flex; + flex-direction: column; + height: 100%; + background-color: var(--dv-group-view-background-color); + overflow: hidden; + + &:focus { + outline: none; + } + + &.empty { + > .tabs-and-actions-container { + display: none; + } + } + + > .content-container { + flex-grow: 1; + overflow: hidden; + outline: none; + } +} diff --git a/build/packages/dockview/src/groupview/groupview.ts b/build/packages/dockview/src/groupview/groupview.ts new file mode 100644 index 000000000..4a7e09028 --- /dev/null +++ b/build/packages/dockview/src/groupview/groupview.ts @@ -0,0 +1,731 @@ +import { DockviewApi } from '../api/component.api'; +import { getPanelData, PanelTransfer } from '../dnd/dataTransfer'; +import { Droptarget, Position } from '../dnd/droptarget'; +import { DockviewComponent } from '../dockview/dockviewComponent'; +import { isAncestor, toggleClass } from '../dom'; +import { addDisposableListener, Emitter, Event } from '../events'; +import { IGridPanelView } from '../gridview/baseComponentGridview'; +import { IViewSize } from '../gridview/gridview'; +import { CompositeDisposable, IDisposable } from '../lifecycle'; +import { PanelInitParameters, PanelUpdateEvent } from '../panel/types'; +import { IDockviewPanel } from './groupPanel'; +import { ContentContainer, IContentContainer } from './panel/content'; +import { ITabsContainer, TabsContainer } from './titlebar/tabsContainer'; +import { IWatermarkRenderer } from './types'; +import { GroupPanel } from './groupviewPanel'; +import { DockviewDropTargets } from './dnd'; + +export enum GroupChangeKind2 { + ADD_PANEL = 'ADD_PANEL', + REMOVE_PANEL = 'REMOVE_PANEL', + PANEL_ACTIVE = 'PANEL_ACTIVE', +} + +export interface DndService { + canDisplayOverlay( + group: IGroupview, + event: DragEvent, + target: DockviewDropTargets + ): boolean; + onDrop( + group: IGroupview, + event: DragEvent, + position: Position, + index?: number + ): void; +} + +export interface IGroupItem { + id: string; + header: { element: HTMLElement }; + body: { element: HTMLElement }; +} + +interface GroupMoveEvent { + groupId: string; + itemId: string; + target: Position; + index?: number; +} + +interface CoreGroupOptions { + locked?: boolean; + hideHeader?: boolean; +} + +export interface GroupOptions extends CoreGroupOptions { + readonly panels?: IDockviewPanel[]; + readonly activePanel?: IDockviewPanel; + readonly id?: string; + tabHeight?: number; +} + +export interface GroupPanelViewState extends CoreGroupOptions { + views: string[]; + activeView?: string; + id: string; +} + +export interface GroupviewChangeEvent { + readonly kind: GroupChangeKind2; + readonly panel?: IDockviewPanel; +} + +export interface GroupviewDropEvent { + nativeEvent: DragEvent; + position: Position; + getData(): PanelTransfer | undefined; + index?: number; +} + +export interface IHeader { + hidden: boolean; + height: number | undefined; +} + +export interface IGroupview extends IDisposable, IGridPanelView { + readonly isActive: boolean; + readonly size: number; + readonly panels: IDockviewPanel[]; + readonly activePanel: IDockviewPanel | undefined; + readonly header: IHeader; + readonly isContentFocused: boolean; + readonly onDidDrop: Event; + readonly onDidGroupChange: Event; + readonly onMove: Event; + locked: boolean; + // state + isPanelActive: (panel: IDockviewPanel) => boolean; + indexOf(panel: IDockviewPanel): number; + // panel lifecycle + openPanel( + panel: IDockviewPanel, + options?: { index?: number; skipFocus?: boolean } + ): void; + closePanel(panel: IDockviewPanel): void; + closeAllPanels(): void; + containsPanel(panel: IDockviewPanel): boolean; + removePanel: (panelOrId: IDockviewPanel | string) => IDockviewPanel; + moveToNext(options?: { + panel?: IDockviewPanel; + suppressRoll?: boolean; + }): void; + moveToPrevious(options?: { + panel?: IDockviewPanel; + suppressRoll?: boolean; + }): void; + canDisplayOverlay(event: DragEvent, target: DockviewDropTargets): boolean; +} + +export class Groupview extends CompositeDisposable implements IGroupview { + private readonly tabsContainer: ITabsContainer; + private readonly contentContainer: IContentContainer; + private readonly dropTarget: Droptarget; + private _activePanel?: IDockviewPanel; + private watermark?: IWatermarkRenderer; + private _isGroupActive = false; + private _locked = false; + + private mostRecentlyUsed: IDockviewPanel[] = []; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = + this._onDidChange.event; + + private _width = 0; + private _height = 0; + + private _panels: IDockviewPanel[] = []; + + private readonly _onMove = new Emitter(); + readonly onMove: Event = this._onMove.event; + + private readonly _onDidGroupChange = new Emitter(); + readonly onDidGroupChange: Event = + this._onDidGroupChange.event; + + private readonly _onDidDrop = new Emitter(); + readonly onDidDrop: Event = this._onDidDrop.event; + + get element(): HTMLElement { + throw new Error('not supported'); + } + + get activePanel(): IDockviewPanel | undefined { + return this._activePanel; + } + + get locked(): boolean { + return this._locked; + } + + set locked(value: boolean) { + this._locked = value; + } + + get isActive(): boolean { + return this._isGroupActive; + } + + get panels(): IDockviewPanel[] { + return this._panels; + } + + get size(): number { + return this._panels.length; + } + + get isEmpty(): boolean { + return this._panels.length === 0; + } + + get minimumHeight(): number { + return 100; + } + + get maximumHeight(): number { + return Number.MAX_SAFE_INTEGER; + } + + get minimumWidth(): number { + return 100; + } + + get maximumWidth(): number { + return Number.MAX_SAFE_INTEGER; + } + + get hasWatermark(): boolean { + return !!( + this.watermark && this.container.contains(this.watermark.element) + ); + } + + get header(): IHeader { + return this.tabsContainer; + } + + get isContentFocused(): boolean { + if (!document.activeElement) { + return false; + } + return isAncestor( + document.activeElement, + this.contentContainer.element + ); + } + + constructor( + private readonly container: HTMLElement, + private accessor: DockviewComponent, + public id: string, + private readonly options: GroupOptions, + private readonly parent: GroupPanel + ) { + super(); + + this.container.classList.add('groupview'); + + this.addDisposables( + this._onMove, + this._onDidGroupChange, + this._onDidChange, + this._onDidDrop + ); + + this.tabsContainer = new TabsContainer(this.accessor, this.parent, { + tabHeight: options.tabHeight, + }); + this.contentContainer = new ContentContainer(); + + this.dropTarget = new Droptarget(this.contentContainer.element, { + validOverlays: 'all', + canDisplayOverlay: (event, quadrant) => { + if (this.locked && !quadrant) { + return false; + } + + const data = getPanelData(); + + if (data) { + const groupHasOnePanelAndIsActiveDragElement = + this._panels.length === 1 && data.groupId === this.id; + + return !groupHasOnePanelAndIsActiveDragElement; + } + + return this.canDisplayOverlay(event, DockviewDropTargets.Panel); + }, + }); + + container.append( + this.tabsContainer.element, + this.contentContainer.element + ); + + this.header.hidden = !!options.hideHeader; + this.locked = !!options.locked; + + this.addDisposables( + this._onMove, + this._onDidGroupChange, + this.tabsContainer.onDrop((event) => { + this.handleDropEvent(event.event, Position.Center, event.index); + }), + this.contentContainer.onDidFocus(() => { + this.accessor.doSetGroupActive(this.parent, true); + }), + this.contentContainer.onDidBlur(() => { + // noop + }), + this.dropTarget.onDrop((event) => { + this.handleDropEvent(event.nativeEvent, event.position); + }) + ); + } + + initialize() { + if (this.options?.panels) { + this.options.panels.forEach((panel) => { + this.doAddPanel(panel); + }); + } + + if (this.options?.activePanel) { + this.openPanel(this.options.activePanel); + } + + // must be run after the constructor otherwise this.parent may not be + // correctly initialized + this.setActive(this.isActive, true, true); + this.updateContainer(); + } + + public indexOf(panel: IDockviewPanel) { + return this.tabsContainer.indexOf(panel.id); + } + + public toJSON(): GroupPanelViewState { + const result: GroupPanelViewState = { + views: this.tabsContainer.panels, + activeView: this._activePanel?.id, + id: this.id, + }; + + if (this.locked) { + result.locked = true; + } + + if (this.header.hidden) { + result.hideHeader = true; + } + + return result; + } + + public moveToNext(options?: { + panel?: IDockviewPanel; + suppressRoll?: boolean; + }) { + if (!options) { + options = {}; + } + if (!options.panel) { + options.panel = this.activePanel; + } + + const index = options.panel ? this.panels.indexOf(options.panel) : -1; + + let normalizedIndex: number; + + if (index < this.panels.length - 1) { + normalizedIndex = index + 1; + } else if (!options.suppressRoll) { + normalizedIndex = 0; + } else { + return; + } + + this.openPanel(this.panels[normalizedIndex]); + } + + public moveToPrevious(options?: { + panel?: IDockviewPanel; + suppressRoll?: boolean; + }) { + if (!options) { + options = {}; + } + if (!options.panel) { + options.panel = this.activePanel; + } + + if (!options.panel) { + return; + } + + const index = this.panels.indexOf(options.panel); + + let normalizedIndex: number; + + if (index > 0) { + normalizedIndex = index - 1; + } else if (!options.suppressRoll) { + normalizedIndex = this.panels.length - 1; + } else { + return; + } + + this.openPanel(this.panels[normalizedIndex]); + } + + public containsPanel(panel: IDockviewPanel) { + return this.panels.includes(panel); + } + + init(_params: PanelInitParameters) { + //noop + } + + update(_params: PanelUpdateEvent) { + //noop + } + + focus() { + this._activePanel?.focus(); + } + + public openPanel( + panel: IDockviewPanel, + options: { + index?: number; + skipFocus?: boolean; + skipSetPanelActive?: boolean; + skipSetGroupActive?: boolean; + } = {} + ) { + if ( + typeof options.index !== 'number' || + options.index > this.panels.length + ) { + options.index = this.panels.length; + } + + const skipSetPanelActive = !!options.skipSetPanelActive; + const skipSetGroupActive = !!options.skipSetGroupActive; + + // ensure the group is updated before we fire any events + panel.updateParentGroup(this.parent, true); + + if (this._activePanel === panel) { + if (!skipSetGroupActive) { + this.accessor.doSetGroupActive(this.parent); + } + return; + } + + this.doAddPanel(panel, options.index, skipSetPanelActive); + + if (!skipSetPanelActive) { + this.doSetActivePanel(panel); + } + + if (!skipSetGroupActive) { + this.accessor.doSetGroupActive(this.parent, !!options.skipFocus); + } + + this.updateContainer(); + } + + public removePanel(groupItemOrId: IDockviewPanel | string): IDockviewPanel { + const id = + typeof groupItemOrId === 'string' + ? groupItemOrId + : groupItemOrId.id; + + const panelToRemove = this._panels.find((panel) => panel.id === id); + + if (!panelToRemove) { + throw new Error('invalid operation'); + } + + return this._removePanel(panelToRemove); + } + + public closeAllPanels() { + if (this.panels.length > 0) { + // take a copy since we will be edting the array as we iterate through + const arrPanelCpy = [...this.panels]; + for (const panel of arrPanelCpy) { + this.doClose(panel); + } + } else { + this.accessor.removeGroup(this.parent); + } + } + + public closePanel(panel: IDockviewPanel): void { + this.doClose(panel); + } + + private doClose(panel: IDockviewPanel) { + this.accessor.removePanel(panel); + } + + public isPanelActive(panel: IDockviewPanel) { + return this._activePanel === panel; + } + + updateActions() { + if (this.isActive && this._activePanel?.view?.actions) { + this.tabsContainer.setActionElement( + this._activePanel.view.actions.element + ); + } else { + this.tabsContainer.setActionElement(undefined); + } + } + + public setActive(isGroupActive: boolean, skipFocus = false, force = false) { + if (!force && this.isActive === isGroupActive) { + if (!skipFocus) { + this._activePanel?.focus(); + } + return; + } + + this._isGroupActive = isGroupActive; + + toggleClass(this.container, 'active-group', isGroupActive); + toggleClass(this.container, 'inactive-group', !isGroupActive); + + this.tabsContainer.setActive(this.isActive); + + if (!this._activePanel && this.panels.length > 0) { + this.doSetActivePanel(this.panels[0]); + } + + this.updateContainer(); + + if (isGroupActive) { + if (!skipFocus) { + this._activePanel?.focus(); + } + } + } + + public layout(width: number, height: number) { + this._width = width; + this._height = height; + + this.contentContainer.layout(this._width, this._height); + + if (this._activePanel?.layout) { + this._activePanel.layout(this._width, this._height); + } + } + + private _removePanel(panel: IDockviewPanel) { + const isActivePanel = this._activePanel === panel; + + this.doRemovePanel(panel); + + if (isActivePanel && this.panels.length > 0) { + const nextPanel = this.mostRecentlyUsed[0]; + this.openPanel(nextPanel); + } + + if (this._activePanel && this.panels.length === 0) { + this.doSetActivePanel(undefined); + } + + this.updateContainer(); + return panel; + } + + private doRemovePanel(panel: IDockviewPanel) { + const index = this.panels.indexOf(panel); + + if (this._activePanel === panel) { + this.contentContainer.closePanel(); + } + + this.tabsContainer.delete(panel.id); + this._panels.splice(index, 1); + + if (this.mostRecentlyUsed.includes(panel)) { + this.mostRecentlyUsed.splice( + this.mostRecentlyUsed.indexOf(panel), + 1 + ); + } + + this._onDidGroupChange.fire({ + kind: GroupChangeKind2.REMOVE_PANEL, + panel, + }); + } + + private doAddPanel( + panel: IDockviewPanel, + index: number = this.panels.length, + skipSetActive = false + ) { + const existingPanel = this._panels.indexOf(panel); + const hasExistingPanel = existingPanel > -1; + + this.tabsContainer.openPanel(panel, index); + + if (!skipSetActive) { + this.contentContainer.openPanel(panel); + } + + this.tabsContainer.show(); + this.contentContainer.show(); + + if (hasExistingPanel) { + // TODO - need to ensure ordering hasn't changed and if it has need to re-order this.panels + return; + } + + this.updateMru(panel); + this.panels.splice(index, 0, panel); + + this._onDidGroupChange.fire({ + kind: GroupChangeKind2.ADD_PANEL, + panel, + }); + } + + private doSetActivePanel(panel: IDockviewPanel | undefined) { + this._activePanel = panel; + + if (panel) { + this.tabsContainer.setActivePanel(panel); + + panel.layout(this._width, this._height); + + this.updateMru(panel); + + this._onDidGroupChange.fire({ + kind: GroupChangeKind2.PANEL_ACTIVE, + panel, + }); + } + } + + private updateMru(panel: IDockviewPanel) { + if (this.mostRecentlyUsed.includes(panel)) { + this.mostRecentlyUsed.splice( + this.mostRecentlyUsed.indexOf(panel), + 1 + ); + } + this.mostRecentlyUsed = [panel, ...this.mostRecentlyUsed]; + } + + private updateContainer() { + this.updateActions(); + toggleClass(this.container, 'empty', this.isEmpty); + + this.panels.forEach((panel) => + panel.updateParentGroup(this.parent, this.isActive) + ); + + if (this.isEmpty && !this.watermark) { + const watermark = this.accessor.createWatermarkComponent(); + watermark.init({ + containerApi: new DockviewApi(this.accessor), + params: {}, + title: '', + api: null as any, + }); + this.watermark = watermark; + + addDisposableListener(this.watermark.element, 'click', () => { + if (!this.isActive) { + this.accessor.doSetGroupActive(this.parent); + } + }); + + this.contentContainer.hide(); + this.tabsContainer.hide(); + this.container.appendChild(this.watermark.element); + + this.watermark.updateParentGroup(this.parent, true); + } + if (!this.isEmpty && this.watermark) { + this.watermark.element.remove(); + this.watermark.dispose(); + this.watermark = undefined; + this.contentContainer.show(); + this.tabsContainer.show(); + } + } + + canDisplayOverlay(event: DragEvent, target: DockviewDropTargets): boolean { + // custom overlay handler + if (this.accessor.options.showDndOverlay) { + return this.accessor.options.showDndOverlay({ + nativeEvent: event, + target, + group: this.accessor.getPanel(this.id)!, + }); + } + return false; + } + + private handleDropEvent( + event: DragEvent, + position: Position, + index?: number + ) { + const data = getPanelData(); + + if (data) { + const fromSameGroup = + this.tabsContainer.indexOf(data.panelId) !== -1; + + if (fromSameGroup && this.tabsContainer.size === 1) { + return; + } + + const { groupId, panelId } = data; + const isSameGroup = this.id === groupId; + if (isSameGroup && !position) { + const oldIndex = this.tabsContainer.indexOf(panelId); + if (oldIndex === index) { + return; + } + } + + this._onMove.fire({ + target: position, + groupId: data.groupId, + itemId: data.panelId, + index, + }); + } else { + this._onDidDrop.fire({ + nativeEvent: event, + position, + index, + getData: () => getPanelData(), + }); + } + } + + public dispose() { + super.dispose(); + + this.watermark?.dispose(); + + for (const panel of this.panels) { + panel.dispose(); + } + + this.dropTarget.dispose(); + this.tabsContainer.dispose(); + this.contentContainer.dispose(); + } +} diff --git a/build/packages/dockview/src/groupview/groupviewPanel.ts b/build/packages/dockview/src/groupview/groupviewPanel.ts new file mode 100644 index 000000000..0866e9fd5 --- /dev/null +++ b/build/packages/dockview/src/groupview/groupviewPanel.ts @@ -0,0 +1,103 @@ +import { IFrameworkPart } from '../panel/types'; +import { DockviewComponent } from '../dockview/dockviewComponent'; +import { + GridviewPanelApi, + GridviewPanelApiImpl, +} from '../api/gridviewPanelApi'; +import { Groupview, GroupOptions, IHeader } from './groupview'; +import { GridviewPanel, IGridviewPanel } from '../gridview/gridviewPanel'; +import { IDockviewPanel } from './groupPanel'; + +export interface IGroupviewPanel extends IGridviewPanel { + model: Groupview; + locked: boolean; + readonly size: number; + readonly panels: IDockviewPanel[]; + readonly activePanel: IDockviewPanel | undefined; +} + +export type IGroupviewPanelPublic = IGroupviewPanel; + +export type GroupviewPanelApi = GridviewPanelApi; + +class GroupviewApi extends GridviewPanelApiImpl implements GroupviewPanelApi {} + +export class GroupPanel extends GridviewPanel implements IGroupviewPanel { + private readonly _model: Groupview; + + get panels(): IDockviewPanel[] { + return this._model.panels; + } + + get activePanel(): IDockviewPanel | undefined { + return this._model.activePanel; + } + + get size(): number { + return this._model.size; + } + + get model(): Groupview { + return this._model; + } + + get minimumHeight(): number { + return this._model.minimumHeight; + } + + get maximumHeight(): number { + return this._model.maximumHeight; + } + + get minimumWidth(): number { + return this._model.minimumWidth; + } + + get maximumWidth(): number { + return this._model.maximumWidth; + } + + get locked(): boolean { + return this._model.locked; + } + + set locked(value: boolean) { + this._model.locked = value; + } + + get header(): IHeader { + return this._model.header; + } + + constructor( + accessor: DockviewComponent, + id: string, + options: GroupOptions + ) { + super(id, 'groupview_default', new GroupviewApi(id)); + + this._model = new Groupview(this.element, accessor, id, options, this); + } + + initialize() { + this._model.initialize(); + } + + setActive(isActive: boolean): void { + super.setActive(isActive); + this.model.setActive(isActive); + } + + layout(width: number, height: number) { + super.layout(width, height); + this.model.layout(width, height); + } + + getComponent(): IFrameworkPart { + return this._model; + } + + toJSON(): any { + return this.model.toJSON(); + } +} diff --git a/build/packages/dockview/src/groupview/panel/content.ts b/build/packages/dockview/src/groupview/panel/content.ts new file mode 100644 index 000000000..68c73a646 --- /dev/null +++ b/build/packages/dockview/src/groupview/panel/content.ts @@ -0,0 +1,120 @@ +import { + CompositeDisposable, + IDisposable, + MutableDisposable, +} from '../../lifecycle'; +import { Emitter, Event } from '../../events'; +import { trackFocus } from '../../dom'; +import { IDockviewPanel } from '../groupPanel'; + +export interface IContentContainer extends IDisposable { + onDidFocus: Event; + onDidBlur: Event; + element: HTMLElement; + layout(width: number, height: number): void; + openPanel: (panel: IDockviewPanel) => void; + closePanel: () => void; + show(): void; + hide(): void; +} + +export class ContentContainer + extends CompositeDisposable + implements IContentContainer +{ + private _element: HTMLElement; + private panel: IDockviewPanel | undefined; + private disposable = new MutableDisposable(); + + private readonly _onDidFocus = new Emitter(); + readonly onDidFocus: Event = this._onDidFocus.event; + + private readonly _onDidBlur = new Emitter(); + readonly onDidBlur: Event = this._onDidBlur.event; + + get element() { + return this._element; + } + + constructor() { + super(); + this._element = document.createElement('div'); + this._element.className = 'content-container'; + this._element.tabIndex = -1; + + this.addDisposables(this._onDidFocus, this._onDidBlur); + + // for hosted containers + // 1) register a drop target on the host + // 2) register window dragStart events to disable pointer events + // 3) register dragEnd events + // 4) register mouseMove events (if no buttons are present we take this as a dragEnd event) + } + + show() { + this.element.style.display = ''; + } + + hide() { + this.element.style.display = 'none'; + } + + public openPanel(panel: IDockviewPanel) { + if (this.panel === panel) { + return; + } + if (this.panel) { + if (this.panel.view?.content) { + this._element.removeChild(this.panel.view.content.element); + } + this.panel = undefined; + } + this.panel = panel; + + const disposable = new CompositeDisposable(); + + if (this.panel.view) { + const _onDidFocus: Event = + this.panel.view.content.onDidFocus!; + const _onDidBlur: Event = this.panel.view.content.onDidBlur!; + + const { onDidFocus, onDidBlur } = trackFocus(this._element); + + disposable.addDisposables( + onDidFocus(() => this._onDidFocus.fire()), + onDidBlur(() => this._onDidBlur.fire()) + ); + + if (_onDidFocus) { + disposable.addDisposables( + _onDidFocus(() => this._onDidFocus.fire()) + ); + } + if (_onDidBlur) { + disposable.addDisposables( + _onDidBlur(() => this._onDidBlur.fire()) + ); + } + + this._element.appendChild(this.panel.view.content.element); + } + + this.disposable.value = disposable; + } + + public layout(_width: number, _height: number): void { + // noop + } + + public closePanel() { + if (this.panel?.view?.content?.element) { + this._element.removeChild(this.panel.view.content.element); + this.panel = undefined; + } + } + + public dispose() { + this.disposable.dispose(); + super.dispose(); + } +} diff --git a/build/packages/dockview/src/groupview/tab.ts b/build/packages/dockview/src/groupview/tab.ts new file mode 100644 index 000000000..62bfa3085 --- /dev/null +++ b/build/packages/dockview/src/groupview/tab.ts @@ -0,0 +1,157 @@ +import { addDisposableListener, Emitter, Event } from '../events'; +import { CompositeDisposable, IDisposable } from '../lifecycle'; +import { + getPanelData, + LocalSelectionTransfer, + PanelTransfer, +} from '../dnd/dataTransfer'; +import { toggleClass } from '../dom'; +import { IDockviewComponent } from '../dockview/dockviewComponent'; +import { ITabRenderer } from './types'; +import { IDockviewPanel } from './groupPanel'; +import { GroupPanel } from './groupviewPanel'; +import { DroptargetEvent, Droptarget } from '../dnd/droptarget'; +import { DockviewDropTargets } from './dnd'; +import { DragHandler } from '../dnd/abstractDragHandler'; + +export enum MouseEventKind { + CLICK = 'CLICK', + CONTEXT_MENU = 'CONTEXT_MENU', +} + +export interface LayoutMouseEvent { + readonly kind: MouseEventKind; + readonly event: MouseEvent; + readonly panel?: IDockviewPanel; + readonly tab?: boolean; +} + +export interface ITab { + readonly panelId: string; + readonly element: HTMLElement; + setContent: (element: ITabRenderer) => void; + onChanged: Event; + onDrop: Event; + setActive(isActive: boolean): void; +} + +export class Tab extends CompositeDisposable implements ITab { + private readonly _element: HTMLElement; + private readonly droptarget: Droptarget; + private content?: ITabRenderer; + + private readonly _onChanged = new Emitter(); + readonly onChanged: Event = this._onChanged.event; + + private readonly _onDropped = new Emitter(); + readonly onDrop: Event = this._onDropped.event; + + public get element() { + return this._element; + } + + constructor( + public readonly panelId: string, + accessor: IDockviewComponent, + private readonly group: GroupPanel + ) { + super(); + + this.addDisposables(this._onChanged, this._onDropped); + + this._element = document.createElement('div'); + this._element.className = 'tab'; + this._element.tabIndex = 0; + this._element.draggable = true; + + toggleClass(this.element, 'inactive-tab', true); + + this.addDisposables( + new (class Handler extends DragHandler { + private readonly panelTransfer = + LocalSelectionTransfer.getInstance(); + + getData(): IDisposable { + this.panelTransfer.setData( + [new PanelTransfer(accessor.id, group.id, panelId)], + PanelTransfer.prototype + ); + + return { + dispose: () => { + this.panelTransfer.clearData( + PanelTransfer.prototype + ); + }, + }; + } + + public dispose(): void { + // + } + })(this._element) + ); + + this.addDisposables( + addDisposableListener(this._element, 'mousedown', (event) => { + if (event.defaultPrevented) { + return; + } + /** + * TODO: alternative to stopPropagation + * + * I need to stop the event propagation here since otherwise it'll be intercepted by event handlers + * on the tabs-container. I cannot use event.preventDefault() since I need the on DragStart event to occur + */ + event.stopPropagation(); + + this._onChanged.fire({ kind: MouseEventKind.CLICK, event }); + }), + addDisposableListener(this._element, 'contextmenu', (event) => { + this._onChanged.fire({ + kind: MouseEventKind.CONTEXT_MENU, + event, + }); + }) + ); + + this.droptarget = new Droptarget(this._element, { + validOverlays: 'none', + canDisplayOverlay: (event) => { + const data = getPanelData(); + if (data) { + return this.panelId !== data.panelId; + } + + return this.group.model.canDisplayOverlay( + event, + DockviewDropTargets.Tab + ); + }, + }); + + this.addDisposables( + this.droptarget.onDrop((event) => { + this._onDropped.fire(event); + }) + ); + } + + public setActive(isActive: boolean) { + toggleClass(this.element, 'active-tab', isActive); + toggleClass(this.element, 'inactive-tab', !isActive); + } + + public setContent(part: ITabRenderer) { + if (this.content) { + this._element.removeChild(this.content.element); + } + this.content = part; + this._element.appendChild(this.content.element); + } + + public dispose() { + super.dispose(); + this.droptarget.dispose(); + } +} diff --git a/build/packages/dockview/src/groupview/titlebar/tabsContainer.scss b/build/packages/dockview/src/groupview/titlebar/tabsContainer.scss new file mode 100644 index 000000000..595af871c --- /dev/null +++ b/build/packages/dockview/src/groupview/titlebar/tabsContainer.scss @@ -0,0 +1,60 @@ +.tabs-and-actions-container { + display: flex; + background-color: var(--dv-tabs-and-actions-container-background-color); + flex-shrink: 0; + box-sizing: border-box; + height: var(--dv-tabs-and-actions-container-height); + font-size: var(--dv-tabs-and-actions-container-font-size); + + &.hidden { + display: none; + } + + .void-container { + display: flex; + flex-grow: 1; + } + + .tabs-container { + display: flex; + overflow-x: overlay; + overflow-y: hidden; + + scrollbar-width: thin; // firefox + + &::-webkit-scrollbar { + height: 3px; + } + + /* Track */ + &::-webkit-scrollbar-track { + background: transparent; + } + + /* Handle */ + &::-webkit-scrollbar-thumb { + background: var(--dv-tabs-container-scrollbar-color); + } + + .tab { + -webkit-user-drag: element; + outline: none; + min-width: 75px; + cursor: pointer; + position: relative; + box-sizing: border-box; + + &:not(:first-child)::before { + content: ' '; + position: absolute; + top: 0; + left: 0; + z-index: 5; + pointer-events: none; + background-color: var(--dv-tab-divider-color); + width: 1px; + height: 100%; + } + } + } +} diff --git a/build/packages/dockview/src/groupview/titlebar/tabsContainer.ts b/build/packages/dockview/src/groupview/titlebar/tabsContainer.ts new file mode 100644 index 000000000..19428d36d --- /dev/null +++ b/build/packages/dockview/src/groupview/titlebar/tabsContainer.ts @@ -0,0 +1,306 @@ +import { + IDisposable, + CompositeDisposable, + IValueDisposable, +} from '../../lifecycle'; +import { addDisposableListener, Emitter, Event } from '../../events'; +import { ITab, MouseEventKind, Tab } from '../tab'; +import { last } from '../../array'; +import { IDockviewPanel } from '../groupPanel'; +import { DockviewComponent } from '../../dockview/dockviewComponent'; +import { getPanelData } from '../../dnd/dataTransfer'; +import { GroupPanel } from '../groupviewPanel'; +import { Droptarget } from '../../dnd/droptarget'; +import { DockviewDropTargets } from '../dnd'; + +export interface TabDropIndexEvent { + event: DragEvent; + readonly index: number; +} + +export interface ITabsContainer extends IDisposable { + readonly element: HTMLElement; + readonly panels: string[]; + readonly size: number; + height: number | undefined; + delete: (id: string) => void; + indexOf: (id: string) => number; + at: (index: number) => ITab; + onDrop: Event; + setActive: (isGroupActive: boolean) => void; + setActivePanel: (panel: IDockviewPanel) => void; + isActive: (tab: ITab) => boolean; + closePanel: (panel: IDockviewPanel) => void; + openPanel: (panel: IDockviewPanel, index?: number) => void; + setActionElement(element: HTMLElement | undefined): void; + hidden: boolean; + show(): void; + hide(): void; +} + +export class TabsContainer + extends CompositeDisposable + implements ITabsContainer +{ + private readonly _element: HTMLElement; + private readonly tabContainer: HTMLElement; + private readonly voidContainer: HTMLElement; + private readonly actionContainer: HTMLElement; + + private readonly voidDropTarget: Droptarget; + + private tabs: IValueDisposable[] = []; + private selectedIndex = -1; + private actions: HTMLElement | undefined; + + private _height: number | undefined; + private _hidden = false; + + private readonly _onDrop = new Emitter(); + readonly onDrop: Event = this._onDrop.event; + + get panels() { + return this.tabs.map((_) => _.value.panelId); + } + + get size() { + return this.tabs.length; + } + + get height(): number | undefined { + return this._height; + } + + set height(value: number | undefined) { + this._height = value; + if (typeof value !== 'number') { + this.element.style.removeProperty( + '--dv-tabs-and-actions-container-height' + ); + } else { + this.element.style.setProperty( + '--dv-tabs-and-actions-container-height', + `${value}px` + ); + } + } + + get hidden(): boolean { + return this._hidden; + } + + set hidden(value: boolean) { + this._hidden = value; + this.element.style.display = value ? 'none' : ''; + } + + show(): void { + if (!this.hidden) { + this.element.style.display = ''; + } + } + + hide(): void { + this._element.style.display = 'none'; + } + + setActionElement(element: HTMLElement | undefined): void { + if (this.actions === element) { + return; + } + if (this.actions) { + this.actions.remove(); + this.actions = undefined; + } + if (element) { + this.actionContainer.appendChild(element); + this.actions = element; + } + } + + public get element() { + return this._element; + } + + public isActive(tab: ITab) { + return ( + this.selectedIndex > -1 && + this.tabs[this.selectedIndex].value === tab + ); + } + + public at(index: number) { + return this.tabs[index]?.value; + } + + public indexOf(id: string): number { + return this.tabs.findIndex((tab) => tab.value.panelId === id); + } + + constructor( + private accessor: DockviewComponent, + private group: GroupPanel, + options: { tabHeight?: number } + ) { + super(); + + this.addDisposables(this._onDrop); + + this._element = document.createElement('div'); + this._element.className = 'tabs-and-actions-container'; + + this.height = options.tabHeight; + + this.actionContainer = document.createElement('div'); + this.actionContainer.className = 'action-container'; + + this.tabContainer = document.createElement('div'); + this.tabContainer.className = 'tabs-container'; + + this.voidContainer = document.createElement('div'); + this.voidContainer.className = 'void-container'; + + this._element.appendChild(this.tabContainer); + this._element.appendChild(this.voidContainer); + this._element.appendChild(this.actionContainer); + + this.voidDropTarget = new Droptarget(this.voidContainer, { + validOverlays: 'none', + canDisplayOverlay: (event) => { + const data = getPanelData(); + + if (data) { + // don't show the overlay if the tab being dragged is the last panel of this group + return last(this.tabs)?.value.panelId !== data.panelId; + } + + return group.model.canDisplayOverlay( + event, + DockviewDropTargets.Panel + ); + }, + }); + + this.addDisposables( + this.voidDropTarget.onDrop((event) => { + this._onDrop.fire({ + event: event.nativeEvent, + index: this.tabs.length, + }); + }), + this.voidDropTarget, + addDisposableListener(this.tabContainer, 'mousedown', (event) => { + if (event.defaultPrevented) { + return; + } + + const isLeftClick = event.button === 0; + + if (isLeftClick) { + this.accessor.doSetGroupActive(this.group); + } + }) + ); + } + + public setActive(_isGroupActive: boolean) { + // noop + } + + private addTab( + tab: IValueDisposable, + index: number = this.tabs.length + ) { + if (index < 0 || index > this.tabs.length) { + throw new Error('invalid location'); + } + + this.tabContainer.insertBefore( + tab.value.element, + this.tabContainer.children[index] + ); + + this.tabs = [ + ...this.tabs.slice(0, index), + tab, + ...this.tabs.slice(index), + ]; + + if (this.selectedIndex < 0) { + this.selectedIndex = index; + } + } + + public delete(id: string) { + const index = this.tabs.findIndex((tab) => tab.value.panelId === id); + + const tabToRemove = this.tabs.splice(index, 1)[0]; + + const { value, disposable } = tabToRemove; + + disposable.dispose(); + value.element.remove(); + } + + public setActivePanel(panel: IDockviewPanel) { + this.tabs.forEach((tab) => { + const isActivePanel = panel.id === tab.value.panelId; + tab.value.setActive(isActivePanel); + }); + } + + public openPanel(panel: IDockviewPanel, index: number = this.tabs.length) { + if (this.tabs.find((tab) => tab.value.panelId === panel.id)) { + return; + } + const tabToAdd = new Tab(panel.id, this.accessor, this.group); + if (!panel.view?.tab) { + throw new Error('invalid header component'); + } + tabToAdd.setContent(panel.view.tab); + + const disposable = CompositeDisposable.from( + tabToAdd.onChanged((event) => { + const alreadyFocused = + panel.id === this.group.model.activePanel?.id && + this.group.model.isContentFocused; + this.accessor.fireMouseEvent({ ...event, panel, tab: true }); + + const isLeftClick = event.event.button === 0; + + if (!isLeftClick || event.event.defaultPrevented) { + return; + } + + if (event.kind === MouseEventKind.CLICK) { + this.group.model.openPanel(panel, { + skipFocus: alreadyFocused, + }); + } + }), + tabToAdd.onDrop((event) => { + this._onDrop.fire({ + event: event.nativeEvent, + index: this.tabs.findIndex((x) => x.value === tabToAdd), + }); + }) + ); + + const value: IValueDisposable = { value: tabToAdd, disposable }; + + this.addTab(value, index); + } + + public closePanel(panel: IDockviewPanel) { + this.delete(panel.id); + } + + public dispose() { + super.dispose(); + + this.tabs.forEach((tab) => { + tab.disposable.dispose(); + }); + this.tabs = []; + } +} diff --git a/build/packages/dockview/src/groupview/types.ts b/build/packages/dockview/src/groupview/types.ts new file mode 100644 index 000000000..4c50bfc72 --- /dev/null +++ b/build/packages/dockview/src/groupview/types.ts @@ -0,0 +1,75 @@ +import { IDisposable } from '../lifecycle'; +import { IDockviewComponent } from '../dockview/dockviewComponent'; +import { DockviewPanelApi } from '../api/groupPanelApi'; +import { PanelInitParameters, IPanel } from '../panel/types'; +import { DockviewApi } from '../api/component.api'; +import { GroupPanel } from './groupviewPanel'; +import { Event } from '../events'; + +export interface IRenderable { + id: string; + element: HTMLElement; + onDidFocus?: Event; + onDidBlur?: Event; +} + +export interface HeaderPartInitParameters { + title: string; + suppressClosable?: boolean; +} + +export interface GroupPanelPartInitParameters + extends PanelInitParameters, + HeaderPartInitParameters { + api: DockviewPanelApi; + containerApi: DockviewApi; +} + +export interface GroupPanelContentPartInitParameters + extends GroupPanelPartInitParameters { + tab: ITabRenderer; +} + +export interface IWatermarkRenderer extends IPanel { + readonly element: HTMLElement; + init: (params: GroupPanelPartInitParameters) => void; + updateParentGroup(group: GroupPanel, visible: boolean): void; +} + +export interface ITabRenderer extends IPanel { + readonly element: HTMLElement; + init(parameters: GroupPanelPartInitParameters): void; + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void; +} + +export interface IActionsRenderer extends IDisposable { + readonly element: HTMLElement; +} + +export interface IContentRenderer extends IPanel { + readonly element: HTMLElement; + readonly actions?: HTMLElement; + readonly onDidFocus?: Event; + readonly onDidBlur?: Event; + updateParentGroup(group: GroupPanel, isPanelVisible: boolean): void; + init(parameters: GroupPanelContentPartInitParameters): void; +} + +// watermark component + +export interface WatermarkPartInitParameters { + accessor: IDockviewComponent; +} + +// constructors + +export interface PanelHeaderPartConstructor { + new (): ITabRenderer; +} +export interface PanelContentPartConstructor { + new (): IContentRenderer; +} + +export interface WatermarkConstructor { + new (): IWatermarkRenderer; +} diff --git a/build/packages/dockview/src/hostedContainer.ts b/build/packages/dockview/src/hostedContainer.ts new file mode 100644 index 000000000..774b12d34 --- /dev/null +++ b/build/packages/dockview/src/hostedContainer.ts @@ -0,0 +1,92 @@ +import { trackFocus } from './dom'; +import { Emitter, Event } from './events'; +import { IDisposable } from './lifecycle'; + +export interface HostedContainerOptions { + id: string; + parent?: HTMLElement; +} + +export class HostedContainer implements IDisposable { + private readonly _element: HTMLElement; + + private readonly _onDidFocus = new Emitter(); + readonly onDidFocus: Event = this._onDidFocus.event; + + private readonly _onDidBlur = new Emitter(); + readonly onDidBlur: Event = this._onDidBlur.event; + + get element() { + return this._element; + } + + constructor(private readonly options: HostedContainerOptions) { + if (!options.parent) { + options.parent = document.getElementById('app') as HTMLElement; + options.parent.style.position = 'relative'; + } + + this._element = document.createElement('div'); + this._element.style.visibility = 'hidden'; + this._element.style.overflow = 'hidden'; + // this._element.style.pointerEvents = 'none'; + this._element.id = `webview-${options.id}`; + this._element.tabIndex = -1; + + const { onDidFocus, onDidBlur } = trackFocus(this._element); + + onDidFocus(() => this._onDidFocus.fire()); + onDidBlur(() => this._onDidBlur.fire()); + + /** + * When dragging somebody + */ + + window.addEventListener('dragstart', () => { + this.element.style.pointerEvents = 'none'; + }); + window.addEventListener('dragend', () => { + this.element.style.pointerEvents = ''; + }); + window.addEventListener('mousemove', (ev) => { + if (ev.buttons === 0) { + this.element.style.pointerEvents = ''; + } + }); + + options.parent.appendChild(this._element); + } + + hide() { + this._element.style.visibility = 'hidden'; + } + + show() { + this._element.style.visibility = 'visible'; + } + + layout( + element: HTMLElement, + dimension?: { width: number; height: number } + ) { + if (!this.element || !this.element.parentElement) { + return; + } + const frameRect = element.getBoundingClientRect(); + const containerRect = + this.element.parentElement.getBoundingClientRect(); + this.element.style.position = 'absolute'; + this.element.style.top = `${frameRect.top - containerRect.top}px`; + this.element.style.left = `${frameRect.left - containerRect.left}px`; + this.element.style.width = `${ + dimension ? dimension.width : frameRect.width + }px`; + this.element.style.height = `${ + dimension ? dimension.height : frameRect.height + }px`; + } + + dispose() { + this._element.remove(); + } +} diff --git a/build/packages/dockview/src/index.ts b/build/packages/dockview/src/index.ts new file mode 100644 index 000000000..ce1b14f44 --- /dev/null +++ b/build/packages/dockview/src/index.ts @@ -0,0 +1,59 @@ +export * from './dnd/dataTransfer'; + +export * from './splitview/core/splitview'; +export * from './paneview/paneview'; +export * from './gridview/gridview'; +export * from './groupview/groupview'; +export * from './gridview/baseComponentGridview'; + +export * from './groupview/panel/content'; +export * from './groupview/tab'; +export * from './groupview/dnd'; +export * from './groupview/types'; +export * from './dockview/options'; + +export * from './dockview/dockviewComponent'; +export * from './gridview/gridviewComponent'; +export * from './splitview/splitviewComponent'; +export * from './paneview/paneviewComponent'; + +export * from './gridview/gridviewPanel'; +export * from './splitview/splitviewPanel'; +export * from './paneview/paneviewPanel'; +export * from './groupview/groupPanel'; + +export * from './react'; // TODO: should be conditional on whether user wants the React wrappers + +export { Event } from './events'; +export { IDisposable } from './lifecycle'; +export { Position } from './dnd/droptarget'; +export { + FocusEvent, + PanelDimensionChangeEvent, + VisibilityEvent, + ActiveEvent, + PanelApi, +} from './api/panelApi'; +export { + SizeEvent, + GridviewPanelApi, + GridConstraintChangeEvent, +} from './api/gridviewPanelApi'; +export { + TitleEvent, + SuppressClosableEvent, + DockviewPanelApi, +} from './api/groupPanelApi'; +export { + PanelSizeEvent, + PanelConstraintChangeEvent, + SplitviewPanelApi, +} from './api/splitviewPanelApi'; +export { ExpansionEvent, PaneviewPanelApi } from './api/paneviewPanelApi'; +export { + CommonApi, + SplitviewApi, + PaneviewApi, + GridviewApi, + DockviewApi, +} from './api/component.api'; diff --git a/build/packages/dockview/src/lifecycle.ts b/build/packages/dockview/src/lifecycle.ts new file mode 100644 index 000000000..0486cedff --- /dev/null +++ b/build/packages/dockview/src/lifecycle.ts @@ -0,0 +1,54 @@ +export interface IDisposable { + dispose: () => void; +} + +export interface IValueDisposable { + value: T; + disposable: IDisposable; +} + +export namespace Disposable { + export const NONE: IDisposable = { + dispose: () => { + // noop + }, + }; +} + +export class CompositeDisposable { + private readonly disposables: IDisposable[]; + + public static from(...args: IDisposable[]) { + return new CompositeDisposable(...args); + } + + constructor(...args: IDisposable[]) { + this.disposables = args; + } + + public addDisposables(...args: IDisposable[]) { + args.forEach((arg) => this.disposables.push(arg)); + } + + public dispose() { + this.disposables.forEach((arg) => arg.dispose()); + } +} + +export class MutableDisposable implements IDisposable { + private _disposable = Disposable.NONE; + + set value(disposable: IDisposable) { + if (this._disposable) { + this._disposable.dispose(); + } + this._disposable = disposable; + } + + public dispose() { + if (this._disposable) { + this._disposable.dispose(); + this._disposable = Disposable.NONE; + } + } +} diff --git a/build/packages/dockview/src/math.ts b/build/packages/dockview/src/math.ts new file mode 100644 index 000000000..dea86579a --- /dev/null +++ b/build/packages/dockview/src/math.ts @@ -0,0 +1,11 @@ +export const clamp = (value: number, min: number, max: number) => { + if (min > max) { + throw new Error(`${min} > ${max} is an invalid condition`); + } + return Math.min(max, Math.max(value, min)); +}; + +export const sequentialNumberGenerator = () => { + let value = 1; + return { next: () => (value++).toString() }; +}; diff --git a/build/packages/dockview/src/panel/componentFactory.ts b/build/packages/dockview/src/panel/componentFactory.ts new file mode 100644 index 000000000..58ae86356 --- /dev/null +++ b/build/packages/dockview/src/panel/componentFactory.ts @@ -0,0 +1,52 @@ +import { FrameworkFactory } from '../types'; + +export function createComponent( + id: string, + componentName?: string, + components: { + [componentName: string]: { new (id: string, component: string): T }; + } = {}, + frameworkComponents: { + [componentName: string]: any; + } = {}, + createFrameworkComponent?: FrameworkFactory, + fallback?: () => T +): T { + const Component = + typeof componentName === 'string' + ? components[componentName] + : undefined; + const FrameworkComponent = + typeof componentName === 'string' + ? frameworkComponents[componentName] + : undefined; + + if (Component && FrameworkComponent) { + throw new Error( + `Cannot create '${id}'. component '${componentName}' registered as both a component and frameworkComponent` + ); + } + if (FrameworkComponent) { + if (!createFrameworkComponent) { + throw new Error( + `Cannot create '${id}' for framework component '${componentName}'. you must register a frameworkPanelWrapper to use framework components` + ); + } + return createFrameworkComponent.createComponent( + id, + componentName!, + FrameworkComponent + ); + } + + if (!Component) { + if (fallback) { + return fallback(); + } + throw new Error( + `Cannot create '${id}', no component '${componentName}' provided` + ); + } + + return new Component(id, componentName!); +} diff --git a/build/packages/dockview/src/panel/types.ts b/build/packages/dockview/src/panel/types.ts new file mode 100644 index 000000000..7519da20a --- /dev/null +++ b/build/packages/dockview/src/panel/types.ts @@ -0,0 +1,39 @@ +import { IDisposable } from '../lifecycle'; +import { LayoutPriority } from '../splitview/core/splitview'; + +/** + * A key-value object of anything that is a valid JavaScript Object. + */ +export interface Parameters { + [key: string]: any; +} + +export interface PanelInitParameters { + params: Parameters; +} + +export interface PanelUpdateEvent { + params: Partial; +} + +export interface IPanel extends IDisposable { + readonly id: string; + init(params: PanelInitParameters): void; + layout(width: number, height: number): void; + update(event: PanelUpdateEvent): void; + toJSON(): object; + focus(): void; +} + +export interface IFrameworkPart extends IDisposable { + update(params: Parameters): void; +} + +export interface BaseComponentOptions { + id: string; + component: string; + params?: Parameters; + snap?: boolean; + priority?: LayoutPriority; + size?: number; +} diff --git a/build/packages/dockview/src/paneview/defaultPaneviewHeader.ts b/build/packages/dockview/src/paneview/defaultPaneviewHeader.ts new file mode 100644 index 000000000..6f42b7db1 --- /dev/null +++ b/build/packages/dockview/src/paneview/defaultPaneviewHeader.ts @@ -0,0 +1,61 @@ +import { addDisposableListener } from '../events'; +import { PaneviewPanelApiImpl } from '../api/paneviewPanelApi'; +import { CompositeDisposable, MutableDisposable } from '../lifecycle'; +import { PanelUpdateEvent } from '../panel/types'; +import { IPaneHeaderPart, PanePanelInitParameter } from './paneviewPanel'; +import { toggleClass } from '../dom'; + +export class DefaultHeader + extends CompositeDisposable + implements IPaneHeaderPart +{ + private readonly disposable = new MutableDisposable(); + private readonly _element: HTMLElement; + private readonly _content: HTMLElement; + private readonly _expander: HTMLElement; + private apiRef: { api: PaneviewPanelApiImpl | null } = { api: null }; + + get element() { + return this._element; + } + + constructor() { + super(); + this._element = document.createElement('div'); + this.element.className = 'default-header'; + + this._content = document.createElement('span'); + this._expander = document.createElement('a'); + + this.element.appendChild(this._expander); + this.element.appendChild(this._content); + + this.addDisposables( + addDisposableListener(this._element, 'click', () => { + this.apiRef.api?.setExpanded(!this.apiRef.api.isExpanded); + }) + ); + } + + init(params: PanePanelInitParameter & { api: PaneviewPanelApiImpl }) { + this.apiRef.api = params.api; + + this._content.textContent = params.title; + this._expander.textContent = 'β–Ό'; + + toggleClass(this._expander, 'collapsed', !params.api.isExpanded); + + this.disposable.value = params.api.onDidExpansionChange((e) => { + toggleClass(this._expander, 'collapsed', !e.isExpanded); + }); + } + + update(_params: PanelUpdateEvent) { + // + } + + dispose() { + this.disposable.dispose(); + super.dispose(); + } +} diff --git a/build/packages/dockview/src/paneview/draggablePaneviewPanel.ts b/build/packages/dockview/src/paneview/draggablePaneviewPanel.ts new file mode 100644 index 000000000..ff3309eec --- /dev/null +++ b/build/packages/dockview/src/paneview/draggablePaneviewPanel.ts @@ -0,0 +1,141 @@ +import { DragHandler } from '../dnd/abstractDragHandler'; +import { + getPaneData, + LocalSelectionTransfer, + PaneTransfer, +} from '../dnd/dataTransfer'; +import { Droptarget, DroptargetEvent, Position } from '../dnd/droptarget'; +import { Emitter } from '../events'; +import { IDisposable } from '../lifecycle'; +import { Orientation } from '../splitview/core/splitview'; +import { + IPaneviewPanel, + PanePanelInitParameter, + PaneviewPanel, +} from './paneviewPanel'; + +export interface PaneviewDropEvent2 extends DroptargetEvent { + panel: IPaneviewPanel; + getData: () => PaneTransfer | undefined; +} + +export abstract class DraggablePaneviewPanel extends PaneviewPanel { + private handler: DragHandler | undefined; + private target: Droptarget | undefined; + + private readonly _onDidDrop = new Emitter(); + readonly onDidDrop = this._onDidDrop.event; + + constructor( + id: string, + component: string, + headerComponent: string | undefined, + orientation: Orientation, + isExpanded: boolean, + disableDnd: boolean + ) { + super(id, component, headerComponent, orientation, isExpanded, true); + + if (!disableDnd) { + this.initDragFeatures(); + } + } + + private initDragFeatures() { + if (!this.header) { + return; + } + + const id = this.id; + this.header.draggable = true; + + this.handler = new (class PaneDragHandler extends DragHandler { + getData(): IDisposable { + LocalSelectionTransfer.getInstance().setData( + [new PaneTransfer('paneview', id)], + PaneTransfer.prototype + ); + + return { + dispose: () => { + LocalSelectionTransfer.getInstance().clearData( + PaneTransfer.prototype + ); + }, + }; + } + })(this.header); + + this.target = new Droptarget(this.element, { + validOverlays: 'vertical', + canDisplayOverlay: () => { + const data = getPaneData(); + + if (!data) { + return true; + } + + return data.paneId !== this.id; + }, + }); + + this.addDisposables( + this._onDidDrop, + this.handler, + this.target, + this.target.onDrop((event) => { + this.onDrop(event); + }) + ); + } + + private onDrop(event: DroptargetEvent) { + const data = getPaneData(); + + if (!data) { + this._onDidDrop.fire({ + ...event, + panel: this, + getData: () => getPaneData(), + }); + return; + } + + const containerApi = (this._params! as PanePanelInitParameter) + .containerApi; + const panelId = data.paneId; + + const existingPanel = containerApi.getPanel(panelId); + if (!existingPanel) { + this._onDidDrop.fire({ + ...event, + panel: this, + getData: () => getPaneData(), + }); + return; + } + + const allPanels = containerApi.panels; + + const fromIndex = allPanels.indexOf(existingPanel); + let toIndex = containerApi.panels.indexOf(this); + + if ( + event.position === Position.Left || + event.position === Position.Top + ) { + toIndex = Math.max(0, toIndex - 1); + } + if ( + event.position === Position.Right || + event.position === Position.Bottom + ) { + if (fromIndex > toIndex) { + toIndex++; + } + toIndex = Math.min(allPanels.length - 1, toIndex); + } + + containerApi.movePanel(fromIndex, toIndex); + } +} diff --git a/build/packages/dockview/src/paneview/options.ts b/build/packages/dockview/src/paneview/options.ts new file mode 100644 index 000000000..285cc58fa --- /dev/null +++ b/build/packages/dockview/src/paneview/options.ts @@ -0,0 +1,26 @@ +import { FrameworkFactory } from '../types'; +import { IPaneBodyPart, IPaneHeaderPart, PaneviewPanel } from './paneviewPanel'; + +export interface PaneviewComponentOptions { + components?: { + [componentName: string]: { + new (id: string, componentName: string): PaneviewPanel; + }; + }; + frameworkComponents?: { + [componentName: string]: any; + }; + headerComponents?: { + [componentName: string]: { + new (id: string, componentName: string): PaneviewPanel; + }; + }; + headerframeworkComponents?: { + [componentName: string]: any; + }; + frameworkWrapper?: { + header: FrameworkFactory; + body: FrameworkFactory; + }; + disableDnd?: boolean; +} diff --git a/build/packages/dockview/src/paneview/paneview.scss b/build/packages/dockview/src/paneview/paneview.scss new file mode 100644 index 000000000..77ab3a40c --- /dev/null +++ b/build/packages/dockview/src/paneview/paneview.scss @@ -0,0 +1,116 @@ +.pane-container { + height: 100%; + width: 100%; + + &.animated { + .view { + transition-duration: 0.15s; + transition-timing-function: ease-out; + } + } + .view { + overflow: hidden; + display: flex; + flex-direction: column; + padding: 0px !important; + + &:not(:first-child)::before { + background-color: transparent !important; + } + + &:not(:first-child) { + .pane > .pane-header { + border-top: 1px solid var(--dv-paneview-header-border-color); + } + } + + .default-header { + background-color: var(--dv-group-view-background-color); + color: var(--dv-activegroup-visiblepanel-tab-color); + display: flex; + padding: 0px 8px; + cursor: pointer; + + .collapsed { + transform: rotate(-90deg); + } + + > span { + padding-left: 8px; + flex-grow: 1; + } + } + } + + &:first-of-type > .pane > .pane-header { + border-top: none !important; + } + + .pane { + display: flex; + flex-direction: column; + overflow: hidden; + height: 100%; + + .pane-header { + box-sizing: border-box; + user-select: none; + position: relative; + outline: none; + + &.pane-draggable { + cursor: pointer; + } + + &:focus, + &:focus-within { + &:before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 5; + content: ''; + pointer-events: none; + outline: 1px solid; + outline-width: -1px; + outline-style: solid; + outline-offset: -1px; + outline-color: var(--dv-paneview-active-outline-color); + } + } + } + .pane-body { + overflow-y: auto; + overflow-x: hidden; + flex-grow: 1; + position: relative; + outline: none; + + &:focus, + &:focus-within { + &:before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 5; + content: ''; + pointer-events: none; + outline: 1px solid; + outline-width: -1px; + outline-style: solid; + outline-offset: -1px; + outline-color: var(--dv-paneview-active-outline-color); + } + // outline-width: 1px; + // outline-style: solid; + // outline-offset: -1px; + // opacity: 1 !important; + // outline-color: dodgerblue; + } + } + } +} diff --git a/build/packages/dockview/src/paneview/paneview.ts b/build/packages/dockview/src/paneview/paneview.ts new file mode 100644 index 000000000..6f9bf4631 --- /dev/null +++ b/build/packages/dockview/src/paneview/paneview.ts @@ -0,0 +1,214 @@ +import { + Splitview, + Orientation, + ISplitViewDescriptor, + Sizing, +} from '../splitview/core/splitview'; +import { CompositeDisposable, IDisposable } from '../lifecycle'; +import { Emitter, Event } from '../events'; +import { addClasses, removeClasses } from '../dom'; +import { PaneviewPanel } from './paneviewPanel'; + +interface PaneItem { + pane: PaneviewPanel; + disposable: IDisposable; +} + +export class Paneview extends CompositeDisposable implements IDisposable { + private element: HTMLElement; + private splitview: Splitview; + private paneItems: PaneItem[] = []; + private _orientation: Orientation; + private animationTimer: any | undefined; + private skipAnimation = false; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + get onDidAddView() { + return >this.splitview.onDidAddView; + } + get onDidRemoveView() { + return >this.splitview.onDidRemoveView; + } + + get minimumSize() { + return this.splitview.minimumSize; + } + + get maximumSize() { + return this.splitview.maximumSize; + } + + get orientation() { + return this.splitview.orientation; + } + + get size() { + return this.splitview.size; + } + + get orthogonalSize() { + return this.splitview.orthogonalSize; + } + + constructor( + container: HTMLElement, + options: { orientation: Orientation; descriptor?: ISplitViewDescriptor } + ) { + super(); + + this._orientation = options.orientation ?? Orientation.VERTICAL; + + this.element = document.createElement('div'); + this.element.className = 'pane-container'; + + container.appendChild(this.element); + + this.splitview = new Splitview(this.element, { + orientation: this._orientation, + proportionalLayout: false, + descriptor: options.descriptor, + }); + + // if we've added views from the descriptor we need to + // add the panes to our Pane array and setup animation + this.getPanes().forEach((pane) => { + const disposable = new CompositeDisposable( + pane.onDidChangeExpansionState(() => { + this.setupAnimation(); + this._onDidChange.fire(undefined); + }) + ); + + const paneItem: PaneItem = { + pane, + disposable: { + dispose: () => { + disposable.dispose(); + }, + }, + }; + + this.paneItems.push(paneItem); + pane.orthogonalSize = this.splitview.orthogonalSize; + }); + + this.addDisposables( + this._onDidChange, + this.splitview.onDidSashEnd(() => { + this._onDidChange.fire(undefined); + }), + this.splitview.onDidAddView(() => { + this._onDidChange.fire(); + }), + this.splitview.onDidRemoveView(() => { + this._onDidChange.fire(); + }) + ); + } + + public addPane( + pane: PaneviewPanel, + size?: number | Sizing, + index = this.splitview.length, + skipLayout = false + ) { + const disposable = pane.onDidChangeExpansionState(() => { + this.setupAnimation(); + this._onDidChange.fire(undefined); + }); + + const paneItem: PaneItem = { + pane, + disposable: { + dispose: () => { + disposable.dispose(); + }, + }, + }; + + this.paneItems.splice(index, 0, paneItem); + + pane.orthogonalSize = this.splitview.orthogonalSize; + this.splitview.addView(pane, size, index, skipLayout); + } + + getViewSize(index: number) { + return this.splitview.getViewSize(index); + } + + public getPanes(): PaneviewPanel[] { + return this.splitview.getViews(); + } + + public removePane( + index: number, + options: { skipDispose: boolean } = { skipDispose: false } + ) { + const paneItem = this.paneItems.splice(index, 1)[0]; + this.splitview.removeView(index); + + if (!options.skipDispose) { + paneItem.disposable.dispose(); + paneItem.pane.dispose(); + } + + return paneItem; + } + + public moveView(from: number, to: number) { + if (from === to) { + return; + } + + const view = this.removePane(from, { skipDispose: true }); + + this.skipAnimation = true; + try { + this.addPane(view.pane, view.pane.size, to, false); + } finally { + this.skipAnimation = false; + } + } + + public layout(size: number, orthogonalSize: number): void { + this.splitview.layout(size, orthogonalSize); + } + + private setupAnimation() { + if (this.skipAnimation) { + return; + } + + if (this.animationTimer) { + clearTimeout(this.animationTimer); + this.animationTimer = undefined; + } + + addClasses(this.element, 'animated'); + + this.animationTimer = setTimeout(() => { + this.animationTimer = undefined; + removeClasses(this.element, 'animated'); + }, 200); + } + + public dispose() { + super.dispose(); + + if (this.animationTimer) { + clearTimeout(this.animationTimer); + this.animationTimer = undefined; + } + + this.paneItems.forEach((paneItem) => { + paneItem.disposable.dispose(); + paneItem.pane.dispose(); + }); + this.paneItems = []; + + this.splitview.dispose(); + this.element.remove(); + } +} diff --git a/build/packages/dockview/src/paneview/paneviewComponent.ts b/build/packages/dockview/src/paneview/paneviewComponent.ts new file mode 100644 index 000000000..9e9eafcd4 --- /dev/null +++ b/build/packages/dockview/src/paneview/paneviewComponent.ts @@ -0,0 +1,472 @@ +import { PaneviewApi } from '../api/component.api'; +import { createComponent } from '../panel/componentFactory'; +import { Emitter, Event } from '../events'; +import { + CompositeDisposable, + IDisposable, + MutableDisposable, +} from '../lifecycle'; +import { + LayoutPriority, + Orientation, + Sizing, +} from '../splitview/core/splitview'; +import { PaneviewComponentOptions } from './options'; +import { Paneview } from './paneview'; +import { + IPaneBodyPart, + IPaneHeaderPart, + PaneviewPanel, + IPaneviewPanel, +} from './paneviewPanel'; +import { + DraggablePaneviewPanel, + PaneviewDropEvent2, +} from './draggablePaneviewPanel'; +import { DefaultHeader } from './defaultPaneviewHeader'; + +export interface SerializedPaneviewPanel { + snap?: boolean; + priority?: LayoutPriority; + minimumSize?: number; + maximumSize?: number; + data: { + id: string; + component: string; + title: string; + headerComponent?: string; + params?: { [index: string]: any }; + }; + size: number; + expanded?: boolean; +} + +export interface SerializedPaneview { + size: number; + views: SerializedPaneviewPanel[]; +} + +export class PaneFramework extends DraggablePaneviewPanel { + constructor( + private readonly options: { + id: string; + component: string; + headerComponent: string | undefined; + body: IPaneBodyPart; + header: IPaneHeaderPart; + orientation: Orientation; + isExpanded: boolean; + disableDnd: boolean; + } + ) { + super( + options.id, + options.component, + options.headerComponent, + options.orientation, + options.isExpanded, + options.disableDnd + ); + } + + getBodyComponent() { + return this.options.body; + } + + getHeaderComponent() { + return this.options.header; + } +} + +export interface AddPaneviewComponentOptions { + id: string; + component: string; + headerComponent?: string; + params?: { + [key: string]: any; + }; + minimumBodySize?: number; + maximumBodySize?: number; + isExpanded?: boolean; + title: string; + index?: number; + size?: number; +} + +export interface IPaneviewComponent extends IDisposable { + readonly width: number; + readonly height: number; + readonly minimumSize: number; + readonly maximumSize: number; + readonly panels: IPaneviewPanel[]; + readonly onDidAddView: Event; + readonly onDidRemoveView: Event; + readonly onDidDrop: Event; + readonly onDidLayoutChange: Event; + readonly onDidLayoutFromJSON: Event; + addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel; + layout(width: number, height: number): void; + toJSON(): SerializedPaneview; + fromJSON(serializedPaneview: SerializedPaneview): void; + focus(): void; + removePanel(panel: IPaneviewPanel): void; + getPanel(id: string): IPaneviewPanel | undefined; + movePanel(from: number, to: number): void; + updateOptions(options: Partial): void; + clear(): void; +} + +export class PaneviewComponent + extends CompositeDisposable + implements IPaneviewComponent +{ + private _disposable = new MutableDisposable(); + private _viewDisposables = new Map(); + private _paneview!: Paneview; + + private readonly _onDidLayoutfromJSON = new Emitter(); + readonly onDidLayoutFromJSON: Event = this._onDidLayoutfromJSON.event; + + private readonly _onDidLayoutChange = new Emitter(); + readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; + + private readonly _onDidDrop = new Emitter(); + readonly onDidDrop: Event = this._onDidDrop.event; + + private readonly _onDidAddView = new Emitter(); + readonly onDidAddView = this._onDidAddView.event; + + private readonly _onDidRemoveView = new Emitter(); + readonly onDidRemoveView = this._onDidRemoveView.event; + + get panels(): PaneviewPanel[] { + return this.paneview.getPanes(); + } + + set paneview(value: Paneview) { + this._paneview = value; + + this._disposable.value = new CompositeDisposable( + this._paneview.onDidChange(() => { + this._onDidLayoutChange.fire(undefined); + }), + this._paneview.onDidAddView((e) => this._onDidAddView.fire(e)), + this._paneview.onDidRemoveView((e) => this._onDidRemoveView.fire(e)) + ); + } + + get paneview() { + return this._paneview; + } + + get minimumSize() { + return this.paneview.minimumSize; + } + + get maximumSize() { + return this.paneview.maximumSize; + } + + get height() { + return this.paneview.orientation === Orientation.HORIZONTAL + ? this.paneview.orthogonalSize + : this.paneview.size; + } + + get width() { + return this.paneview.orientation === Orientation.HORIZONTAL + ? this.paneview.size + : this.paneview.orthogonalSize; + } + + private _options: PaneviewComponentOptions; + + get options() { + return this._options; + } + + constructor( + private element: HTMLElement, + options: PaneviewComponentOptions + ) { + super(); + + this.addDisposables( + this._onDidLayoutChange, + this._onDidLayoutfromJSON, + this._onDidDrop, + this._onDidAddView, + this._onDidRemoveView + ); + + this._options = options; + + if (!options.components) { + options.components = {}; + } + if (!options.frameworkComponents) { + options.frameworkComponents = {}; + } + + this.paneview = new Paneview(this.element, { + // only allow paneview in the vertical orientation for now + orientation: Orientation.VERTICAL, + }); + + this.addDisposables(this._disposable); + } + + focus() { + // + } + + updateOptions(options: Partial): void { + this._options = { ...this.options, ...options }; + } + + addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel { + const body = createComponent( + options.id, + options.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper.body.createComponent, + } + : undefined + ); + + let header: IPaneHeaderPart; + + if (options.headerComponent) { + header = createComponent( + options.id, + options.headerComponent, + this.options.headerComponents || {}, + this.options.headerframeworkComponents, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper.header + .createComponent, + } + : undefined + ); + } else { + header = new DefaultHeader(); + } + + const view = new PaneFramework({ + id: options.id, + component: options.component, + headerComponent: options.headerComponent, + header, + body, + orientation: Orientation.VERTICAL, + isExpanded: !!options.isExpanded, + disableDnd: !!this.options.disableDnd, + }); + + this.doAddPanel(view); + + const size: Sizing | number = + typeof options.size === 'number' ? options.size : Sizing.Distribute; + const index = + typeof options.index === 'number' ? options.index : undefined; + + view.init({ + params: options.params || {}, + minimumBodySize: options.minimumBodySize, + maximumBodySize: options.maximumBodySize, + isExpanded: options.isExpanded, + title: options.title, + containerApi: new PaneviewApi(this), + }); + + this.paneview.addPane(view, size, index); + + view.orientation = this.paneview.orientation; + + return view; + } + + removePanel(panel: PaneviewPanel) { + const views = this.panels; + const index = views.findIndex((_) => _ === panel); + this.paneview.removePane(index); + + this.doRemovePanel(panel); + } + + movePanel(from: number, to: number): void { + this.paneview.moveView(from, to); + } + + getPanel(id: string): PaneviewPanel | undefined { + return this.panels.find((view) => view.id === id); + } + + layout(width: number, height: number): void { + const [size, orthogonalSize] = + this.paneview.orientation === Orientation.HORIZONTAL + ? [width, height] + : [height, width]; + this.paneview.layout(size, orthogonalSize); + } + + toJSON(): SerializedPaneview { + const maximum = (value: number) => + value === Number.MAX_SAFE_INTEGER || + value === Number.POSITIVE_INFINITY + ? undefined + : value; + const minimum = (value: number) => (value <= 0 ? undefined : value); + + const views: SerializedPaneviewPanel[] = this.paneview + .getPanes() + .map((view, i) => { + const size = this.paneview.getViewSize(i); + return { + size, + data: view.toJSON(), + minimumSize: minimum(view.minimumBodySize), + maximumSize: maximum(view.maximumBodySize), + expanded: view.isExpanded(), + }; + }); + + return { + views, + size: this.paneview.size, + }; + } + + fromJSON(serializedPaneview: SerializedPaneview): void { + this.clear(); + + const { views, size } = serializedPaneview; + + const queue: Function[] = []; + + this.paneview = new Paneview(this.element, { + orientation: Orientation.VERTICAL, + descriptor: { + size, + views: views.map((view) => { + const data = view.data; + + const body = createComponent( + data.id, + data.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper.body + .createComponent, + } + : undefined + ); + + let header: IPaneHeaderPart; + + if (data.headerComponent) { + header = createComponent( + data.id, + data.headerComponent, + this.options.headerComponents || {}, + this.options.headerframeworkComponents || {}, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper.header + .createComponent, + } + : undefined + ); + } else { + header = new DefaultHeader(); + } + + const panel = new PaneFramework({ + id: data.id, + component: data.component, + headerComponent: data.headerComponent, + header, + body, + orientation: Orientation.VERTICAL, + isExpanded: !!view.expanded, + disableDnd: !!this.options.disableDnd, + }); + + this.doAddPanel(panel); + + queue.push(() => { + panel.init({ + params: data.params || {}, + minimumBodySize: view.minimumSize, + maximumBodySize: view.maximumSize, + title: data.title, + isExpanded: !!view.expanded, + containerApi: new PaneviewApi(this), + }); + panel.orientation = this.paneview.orientation; + }); + + setTimeout(() => { + // the original onDidAddView events are missed since they are fired before we can subcribe to them + this._onDidAddView.fire(panel); + }, 0); + + return { size: view.size, view: panel }; + }), + }, + }); + + this.layout(this.width, this.height); + + queue.forEach((f) => f()); + + this._onDidLayoutfromJSON.fire(); + } + + clear(): void { + for (const [_, value] of this._viewDisposables.entries()) { + value.dispose(); + } + this._viewDisposables.clear(); + + this.paneview.dispose(); + } + + private doAddPanel(panel: PaneFramework) { + const disposable = panel.onDidDrop((event) => { + this._onDidDrop.fire(event); + }); + + this._viewDisposables.set(panel.id, disposable); + } + + private doRemovePanel(panel: PaneviewPanel) { + const disposable = this._viewDisposables.get(panel.id); + + if (disposable) { + disposable.dispose(); + this._viewDisposables.delete(panel.id); + } + } + + public dispose(): void { + super.dispose(); + + for (const [_, value] of this._viewDisposables.entries()) { + value.dispose(); + } + this._viewDisposables.clear(); + + this.paneview.dispose(); + } +} diff --git a/build/packages/dockview/src/paneview/paneviewPanel.ts b/build/packages/dockview/src/paneview/paneviewPanel.ts new file mode 100644 index 000000000..84039b5d4 --- /dev/null +++ b/build/packages/dockview/src/paneview/paneviewPanel.ts @@ -0,0 +1,331 @@ +import { PaneviewApi } from '../api/component.api'; +import { PaneviewPanelApiImpl } from '../api/paneviewPanelApi'; +import { addClasses, removeClasses } from '../dom'; +import { addDisposableListener, Emitter, Event } from '../events'; +import { + BasePanelView, + BasePanelViewExported, + BasePanelViewState, +} from '../gridview/basePanelView'; +import { IDisposable } from '../lifecycle'; +import { + IFrameworkPart, + PanelInitParameters, + PanelUpdateEvent, + Parameters, +} from '../panel/types'; +import { IView, Orientation } from '../splitview/core/splitview'; + +export interface PanePanelViewState extends BasePanelViewState { + headerComponent?: string; + title: string; +} + +export interface PanePanelInitParameter extends PanelInitParameters { + minimumBodySize?: number; + maximumBodySize?: number; + isExpanded?: boolean; + title: string; + containerApi: PaneviewApi; +} + +export interface PanePanelComponentInitParameter + extends PanePanelInitParameter { + api: PaneviewPanelApiImpl; +} + +export interface IPaneBodyPart extends IDisposable { + readonly element: HTMLElement; + update(params: PanelUpdateEvent): void; + init(parameters: PanePanelComponentInitParameter): void; +} + +export interface IPaneHeaderPart extends IDisposable { + readonly element: HTMLElement; + update(params: PanelUpdateEvent): void; + init(parameters: PanePanelComponentInitParameter): void; +} + +export interface IPaneview extends IView { + onDidChangeExpansionState: Event; +} + +export interface IPaneviewPanel + extends BasePanelViewExported { + readonly minimumSize: number; + readonly maximumSize: number; + readonly minimumBodySize: number; + readonly maximumBodySize: number; + isExpanded(): boolean; + setExpanded(isExpanded: boolean): void; + headerVisible: boolean; +} + +export abstract class PaneviewPanel + extends BasePanelView + implements IPaneview, IPaneviewPanel +{ + private _onDidChangeExpansionState: Emitter = new Emitter( + { replay: true } + ); + onDidChangeExpansionState = this._onDidChangeExpansionState.event; + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private headerSize = 22; + private _orthogonalSize = 0; + private _size = 0; + private _minimumBodySize = 100; + private _maximumBodySize: number = Number.POSITIVE_INFINITY; + private _isExpanded = false; + protected header?: HTMLElement; + protected body?: HTMLElement; + private bodyPart?: IPaneHeaderPart; + private headerPart?: IPaneBodyPart; + private expandedSize = 0; + private animationTimer: any | undefined; + private _orientation: Orientation; + + private _headerVisible: boolean; + + set orientation(value: Orientation) { + this._orientation = value; + } + + get orientation() { + return this._orientation; + } + + get minimumSize(): number { + const headerSize = this.headerSize; + const expanded = this.isExpanded(); + const minimumBodySize = expanded ? this._minimumBodySize : 0; + + return headerSize + minimumBodySize; + } + + get maximumSize(): number { + const headerSize = this.headerSize; + const expanded = this.isExpanded(); + const maximumBodySize = expanded ? this._maximumBodySize : 0; + + return headerSize + maximumBodySize; + } + + get size() { + return this._size; + } + + get orthogonalSize() { + return this._orthogonalSize; + } + + set orthogonalSize(size: number) { + this._orthogonalSize = size; + } + + get minimumBodySize() { + return this._minimumBodySize; + } + + set minimumBodySize(value: number) { + this._minimumBodySize = typeof value === 'number' ? value : 0; + } + + get maximumBodySize() { + return this._maximumBodySize; + } + + set maximumBodySize(value: number) { + this._maximumBodySize = + typeof value === 'number' ? value : Number.POSITIVE_INFINITY; + } + + get headerVisible(): boolean { + return this._headerVisible; + } + + set headerVisible(value: boolean) { + this._headerVisible = value; + this.header!.style.display = value ? '' : 'none'; + } + + constructor( + id: string, + component: string, + private readonly headerComponent: string | undefined, + orientation: Orientation, + isExpanded: boolean, + isHeaderVisible: boolean + ) { + super(id, component, new PaneviewPanelApiImpl(id)); + this.api.pane = this; // TODO cannot use 'this' before 'super' + this._isExpanded = isExpanded; + this._headerVisible = isHeaderVisible; + + this._onDidChangeExpansionState.fire(this.isExpanded()); // initialize value + + this._orientation = orientation; + + this.element.classList.add('pane'); + + this.addDisposables( + this.api.onDidSizeChange((event) => { + this._onDidChange.fire(event.size); + }), + addDisposableListener( + this.element, + 'mouseenter', + (ev: MouseEvent) => { + this.api._onMouseEnter.fire(ev); + } + ), + addDisposableListener( + this.element, + 'mouseleave', + (ev: MouseEvent) => { + this.api._onMouseLeave.fire(ev); + } + ) + ); + + this.addDisposables( + this._onDidChangeExpansionState, + this.onDidChangeExpansionState((isPanelExpanded) => { + this.api._onDidExpansionChange.fire({ + isExpanded: isPanelExpanded, + }); + }), + this.api.onDidFocusChange((e) => { + if (!this.header) { + return; + } + if (e.isFocused) { + addClasses(this.header, 'focused'); + } else { + removeClasses(this.header, 'focused'); + } + }) + ); + + this.renderOnce(); + } + + setVisible(isVisible: boolean) { + this.api._onDidVisibilityChange.fire({ isVisible }); + } + + setActive(isActive: boolean) { + this.api._onDidActiveChange.fire({ isActive }); + } + + isExpanded(): boolean { + return this._isExpanded; + } + + setExpanded(expanded: boolean): void { + if (this._isExpanded === expanded) { + return; + } + + this._isExpanded = expanded; + + if (expanded) { + if (this.animationTimer) { + clearTimeout(this.animationTimer); + } + if (this.body) { + this.element.appendChild(this.body); + } + } else { + this.animationTimer = setTimeout(() => { + this.body?.remove(); + }, 200); + } + + this._onDidChange.fire(expanded ? this.width : undefined); + this._onDidChangeExpansionState.fire(expanded); + } + + layout(size: number, orthogonalSize: number) { + this._size = size; + this._orthogonalSize = orthogonalSize; + const [width, height] = + this.orientation === Orientation.HORIZONTAL + ? [size, orthogonalSize] + : [orthogonalSize, size]; + if (this.isExpanded()) { + this.expandedSize = width; + } + super.layout(width, height); + } + + init(parameters: PanePanelInitParameter): void { + super.init(parameters); + + if (typeof parameters.minimumBodySize === 'number') { + this.minimumBodySize = parameters.minimumBodySize; + } + if (typeof parameters.maximumBodySize === 'number') { + this.maximumBodySize = parameters.maximumBodySize; + } + + this.bodyPart = this.getBodyComponent(); + this.headerPart = this.getHeaderComponent(); + + this.bodyPart.init({ ...parameters, api: this.api }); + this.headerPart.init({ ...parameters, api: this.api }); + + this.body?.append(this.bodyPart.element); + this.header?.append(this.headerPart.element); + + if (typeof parameters.isExpanded === 'boolean') { + this.setExpanded(parameters.isExpanded); + } + } + + toJSON(): PanePanelViewState { + const params = this._params as PanePanelInitParameter; + return { + ...super.toJSON(), + headerComponent: this.headerComponent, + title: params.title, + }; + } + + private renderOnce() { + this.header = document.createElement('div'); + this.header.tabIndex = 0; + + this.header.className = 'pane-header'; + this.header.style.height = `${this.headerSize}px`; + this.header.style.lineHeight = `${this.headerSize}px`; + this.header.style.minHeight = `${this.headerSize}px`; + this.header.style.maxHeight = `${this.headerSize}px`; + + this.element.appendChild(this.header); + + this.body = document.createElement('div'); + + this.body.className = 'pane-body'; + + this.element.appendChild(this.body); + } + + // TODO slightly hacky by-pass of the component to create a body and header component + getComponent(): IFrameworkPart { + return { + update: (params: Parameters) => { + this.bodyPart?.update({ params }); + this.headerPart?.update({ params }); + }, + dispose: () => { + this.bodyPart?.dispose(); + this.headerPart?.dispose(); + }, + }; + } + + protected abstract getBodyComponent(): IPaneBodyPart; + protected abstract getHeaderComponent(): IPaneHeaderPart; +} diff --git a/build/packages/dockview/src/react/deserializer.ts b/build/packages/dockview/src/react/deserializer.ts new file mode 100644 index 000000000..f8117c456 --- /dev/null +++ b/build/packages/dockview/src/react/deserializer.ts @@ -0,0 +1,59 @@ +import { DockviewComponent } from '../dockview/dockviewComponent'; +import { GroupviewPanelState, IDockviewPanel } from '../groupview/groupPanel'; +import { DockviewGroupPanel } from '../dockview/dockviewGroupPanel'; +import { IPanelDeserializer } from '../dockview/deserializer'; +import { createComponent } from '../panel/componentFactory'; +import { DockviewApi } from '../api/component.api'; +import { DefaultTab } from '../dockview/components/tab/defaultTab'; +import { DefaultGroupPanelView } from '../dockview/defaultGroupPanelView'; +import { GroupPanel } from '../groupview/groupviewPanel'; + +export class ReactPanelDeserialzier implements IPanelDeserializer { + constructor(private readonly layout: DockviewComponent) {} + + public fromJSON( + panelData: GroupviewPanelState, + group: GroupPanel + ): IDockviewPanel { + const panelId = panelData.id; + const params = panelData.params; + const title = panelData.title; + const suppressClosable = panelData.suppressClosable; + const viewData = panelData.view; + + const view = new DefaultGroupPanelView({ + content: createComponent( + viewData.content.id, + viewData.content.id, + this.layout.options.components, + this.layout.options.frameworkComponents, + this.layout.options.frameworkComponentFactory?.content + ), + tab: viewData.tab?.id + ? createComponent( + viewData.tab.id, + viewData.tab.id, + this.layout.options.tabComponents, + this.layout.options.frameworkTabComponents, + this.layout.options.frameworkComponentFactory?.tab + ) + : new DefaultTab(), + }); + + const panel = new DockviewGroupPanel( + panelId, + this.layout, + new DockviewApi(this.layout), + group + ); + + panel.init({ + view, + title, + suppressClosable, + params: params || {}, + }); + + return panel; + } +} diff --git a/build/packages/dockview/src/react/dockview/dockview.scss b/build/packages/dockview/src/react/dockview/dockview.scss new file mode 100644 index 000000000..d9a7a9485 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/dockview.scss @@ -0,0 +1,4 @@ +.dockview-react-part { + height: 100%; + width: 100%; +} diff --git a/build/packages/dockview/src/react/dockview/dockview.tsx b/build/packages/dockview/src/react/dockview/dockview.tsx new file mode 100644 index 000000000..c5a74ad93 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/dockview.tsx @@ -0,0 +1,236 @@ +import * as React from 'react'; +import { + DockviewComponent, + DockviewDropEvent, +} from '../../dockview/dockviewComponent'; +import { ReactPanelContentPart } from './reactContentPart'; +import { ReactPanelHeaderPart } from './reactHeaderPart'; +import { ReactPanelDeserialzier } from '../deserializer'; +import { + DockviewDndOverlayEvent, + GroupPanelFrameworkComponentFactory, + TabContextMenuEvent, +} from '../../dockview/options'; +import { DockviewPanelApi } from '../../api/groupPanelApi'; +import { usePortalsLifecycle } from '../react'; +import { DockviewApi } from '../../api/component.api'; +import { IWatermarkPanelProps, ReactWatermarkPart } from './reactWatermarkPart'; +import { PanelCollection, PanelParameters } from '../types'; +import { watchElementResize } from '../../dom'; +import { IContentRenderer, ITabRenderer } from '../../groupview/types'; + +export interface IGroupPanelBaseProps> + extends PanelParameters { + api: DockviewPanelApi; + containerApi: DockviewApi; +} + +export type IDockviewPanelHeaderProps> = + IGroupPanelBaseProps; + +export type IDockviewPanelProps = + IGroupPanelBaseProps; + +export interface DockviewReadyEvent { + api: DockviewApi; +} + +export interface IDockviewReactProps { + components: PanelCollection; + tabComponents?: PanelCollection; + watermarkComponent?: React.FunctionComponent; + onReady: (event: DockviewReadyEvent) => void; + tabHeight?: number; + onTabContextMenu?: (event: TabContextMenuEvent) => void; + onDidDrop?: (event: DockviewDropEvent) => void; + showDndOverlay?: (event: DockviewDndOverlayEvent) => boolean; + hideBorders?: boolean; + className?: string; + disableAutoResizing?: boolean; +} + +export const DockviewReact = React.forwardRef( + (props: IDockviewReactProps, ref: React.ForwardedRef) => { + const domRef = React.useRef(null); + const dockviewRef = React.useRef(); + const [portals, addPortal] = usePortalsLifecycle(); + + React.useImperativeHandle(ref, () => domRef.current!, []); + + React.useEffect(() => { + if (props.disableAutoResizing) { + return () => { + // + }; + } + + const watcher = watchElementResize(domRef.current!, (entry) => { + const { width, height } = entry.contentRect; + dockviewRef.current?.layout(width, height); + }); + + return () => { + watcher.dispose(); + }; + }, [props.disableAutoResizing]); + + React.useEffect(() => { + const factory: GroupPanelFrameworkComponentFactory = { + content: { + createComponent: ( + _id: string, + componentId: string, + component: React.FunctionComponent + ): IContentRenderer => { + return new ReactPanelContentPart( + componentId, + component, + { + addPortal, + } + ); + }, + }, + tab: { + createComponent: ( + _id: string, + componentId: string, + component: React.FunctionComponent + ): ITabRenderer => { + return new ReactPanelHeaderPart( + componentId, + component, + { + addPortal, + } + ); + }, + }, + watermark: { + createComponent: ( + _id: string, + componentId: string, + component: React.FunctionComponent<{}> + ) => { + return new ReactWatermarkPart(componentId, component, { + addPortal, + }); + }, + }, + }; + + const element = document.createElement('div'); + + const dockview = new DockviewComponent(element, { + frameworkComponentFactory: factory, + frameworkComponents: props.components, + frameworkTabComponents: props.tabComponents, + tabHeight: props.tabHeight, + watermarkFrameworkComponent: props.watermarkComponent, + styles: props.hideBorders + ? { separatorBorder: 'transparent' } + : undefined, + }); + + domRef.current?.appendChild(dockview.element); + dockview.deserializer = new ReactPanelDeserialzier(dockview); + + const { clientWidth, clientHeight } = domRef.current!; + dockview.layout(clientWidth, clientHeight); + + if (props.onReady) { + props.onReady({ api: new DockviewApi(dockview) }); + } + + dockviewRef.current = dockview; + + return () => { + dockview.dispose(); + element.remove(); + }; + }, []); + + React.useEffect(() => { + if (!dockviewRef.current) { + return () => { + // noop + }; + } + + const disposable = dockviewRef.current.onDidDrop((event) => { + if (props.onDidDrop) { + props.onDidDrop(event); + } + }); + + return () => { + disposable.dispose(); + }; + }, [props.onDidDrop]); + + React.useEffect(() => { + if (!dockviewRef.current) { + return; + } + dockviewRef.current.updateOptions({ + frameworkComponents: props.components, + }); + }, [props.components]); + + React.useEffect(() => { + if (!dockviewRef.current) { + return; + } + dockviewRef.current.updateOptions({ + watermarkFrameworkComponent: props.watermarkComponent, + }); + }, [props.watermarkComponent]); + + React.useEffect(() => { + if (!dockviewRef.current) { + return; + } + dockviewRef.current.updateOptions({ + showDndOverlay: props.showDndOverlay, + }); + }, [props.showDndOverlay]); + + React.useEffect(() => { + if (!dockviewRef.current) { + return; + } + dockviewRef.current.updateOptions({ + frameworkTabComponents: props.tabComponents, + }); + }, [props.tabComponents]); + + React.useEffect(() => { + if (!props.onTabContextMenu || !dockviewRef.current) { + return () => { + //noop + }; + } + + const disposable = dockviewRef.current.onTabContextMenu((event) => { + if (props.onTabContextMenu) { + props.onTabContextMenu(event); + } + }); + + return () => { + disposable.dispose(); + }; + }, [props.onTabContextMenu]); + + return ( +
+ {portals} +
+ ); + } +); +DockviewReact.displayName = 'DockviewComponent'; diff --git a/build/packages/dockview/src/react/dockview/reactContentPart.ts b/build/packages/dockview/src/react/dockview/reactContentPart.ts new file mode 100644 index 000000000..07d4036cb --- /dev/null +++ b/build/packages/dockview/src/react/dockview/reactContentPart.ts @@ -0,0 +1,113 @@ +import * as React from 'react'; +import { + IContentRenderer, + GroupPanelContentPartInitParameters, + ITabRenderer, +} from '../../groupview/types'; +import { ReactPart, ReactPortalStore } from '../react'; +import { IDockviewPanelProps } from '../dockview/dockview'; +import { PanelUpdateEvent } from '../../panel/types'; +import { DockviewPanelApi } from '../../api/groupPanelApi'; +import { DockviewApi } from '../../api/component.api'; +import { GroupPanel } from '../../groupview/groupviewPanel'; +import { Emitter, Event } from '../../events'; + +export interface IGroupPanelActionbarProps { + api: DockviewPanelApi; + containerApi: DockviewApi; +} + +export interface ReactContentPartContext { + api: DockviewPanelApi; + containerApi: DockviewApi; + actionsPortalElement: HTMLElement; + tabPortalElement: ITabRenderer; +} + +export class ReactPanelContentPart implements IContentRenderer { + private _element: HTMLElement; + private part?: ReactPart; + // + private _actionsElement: HTMLElement; + private actionsPart?: ReactPart; + private _group: GroupPanel | undefined; + + private readonly _onDidFocus = new Emitter(); + readonly onDidFocus: Event = this._onDidFocus.event; + + private readonly _onDidBlur = new Emitter(); + readonly onDidBlur: Event = this._onDidBlur.event; + + get element(): HTMLElement { + return this._element; + } + + get actions(): HTMLElement { + return this._actionsElement; + } + + constructor( + public readonly id: string, + private readonly component: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + this._element = document.createElement('div'); + this._element.className = 'dockview-react-part'; + + this._actionsElement = document.createElement('div'); + this._actionsElement.className = 'dockview-react-part'; + } + + focus() { + // TODO + } + + public init(parameters: GroupPanelContentPartInitParameters): void { + const context: ReactContentPartContext = { + api: parameters.api, + containerApi: parameters.containerApi, + actionsPortalElement: this._actionsElement, + tabPortalElement: parameters.tab, + }; + + this.part = new ReactPart( + this.element, + this.reactPortalStore, + this.component, + { + params: parameters.params, + api: parameters.api, + containerApi: parameters.containerApi, + }, + context + ); + } + + public toJSON() { + return { + id: this.id, + }; + } + + public update(event: PanelUpdateEvent) { + this.part?.update(event.params); + } + + public updateParentGroup( + group: GroupPanel, + _isPanelVisible: boolean + ): void { + this._group = group; + } + + public layout(_width: number, _height: number): void { + // noop + } + + public dispose() { + this._onDidFocus.dispose(); + this._onDidBlur.dispose(); + this.part?.dispose(); + this.actionsPart?.dispose(); + } +} diff --git a/build/packages/dockview/src/react/dockview/reactHeaderPart.ts b/build/packages/dockview/src/react/dockview/reactHeaderPart.ts new file mode 100644 index 000000000..69d9313c3 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/reactHeaderPart.ts @@ -0,0 +1,69 @@ +import * as React from 'react'; +import { + ITabRenderer, + GroupPanelPartInitParameters, +} from '../../groupview/types'; +import { GroupPanel } from '../../groupview/groupviewPanel'; +import { PanelUpdateEvent } from '../../panel/types'; +import { ReactPart, ReactPortalStore } from '../react'; +import { IGroupPanelBaseProps } from './dockview'; + +export class ReactPanelHeaderPart implements ITabRenderer { + private _element: HTMLElement; + private part?: ReactPart; + + get element() { + return this._element; + } + + constructor( + public readonly id: string, + private readonly component: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + this._element = document.createElement('div'); + this._element.className = 'dockview-react-part'; + } + + focus() { + //noop + } + + public init(parameters: GroupPanelPartInitParameters): void { + this.part = new ReactPart( + this.element, + this.reactPortalStore, + this.component, + { + params: parameters.params, + api: parameters.api, + containerApi: parameters.containerApi, + } + ); + } + + public update(event: PanelUpdateEvent) { + this.part?.update(event.params); + } + + public toJSON() { + return { + id: this.id, + }; + } + + public layout(_width: number, _height: number) { + // noop - retrieval from api + } + + public updateParentGroup( + _group: GroupPanel, + _isPanelVisible: boolean + ): void { + // noop - retrieval from api + } + + public dispose() { + this.part?.dispose(); + } +} diff --git a/build/packages/dockview/src/react/dockview/reactWatermarkPart.ts b/build/packages/dockview/src/react/dockview/reactWatermarkPart.ts new file mode 100644 index 000000000..7fa44d505 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/reactWatermarkPart.ts @@ -0,0 +1,88 @@ +import * as React from 'react'; +import { + GroupPanelPartInitParameters, + IWatermarkRenderer, +} from '../../groupview/types'; +import { GroupPanel } from '../../groupview/groupviewPanel'; +import { ReactPart, ReactPortalStore } from '../react'; +import { IGroupPanelBaseProps } from './dockview'; +import { PanelUpdateEvent } from '../../panel/types'; + +export interface IWatermarkPanelProps extends IGroupPanelBaseProps { + close: () => void; +} + +export class ReactWatermarkPart implements IWatermarkRenderer { + private _element: HTMLElement; + private part?: ReactPart; + private _groupRef: { value: GroupPanel | undefined } = { + value: undefined, + }; + private parameters: GroupPanelPartInitParameters | undefined; + + get element() { + return this._element; + } + + constructor( + public readonly id: string, + private readonly component: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + this._element = document.createElement('div'); + this._element.className = 'dockview-react-part'; + } + + init(parameters: GroupPanelPartInitParameters): void { + this.parameters = parameters; + + this.part = new ReactPart( + this.element, + this.reactPortalStore, + this.component, + { + params: parameters.params, + api: parameters.api, + containerApi: parameters.containerApi, + close: () => { + if (this._groupRef.value) { + parameters.containerApi.removeGroup( + this._groupRef.value + ); + } + }, + } + ); + } + + focus() { + // noop + } + + update(params: PanelUpdateEvent) { + if (this.parameters) { + this.parameters.params = params.params; + } + + this.part?.update({ params: this.parameters?.params || {} }); + } + + toJSON() { + return { + id: this.id, + }; + } + + layout(_width: number, _height: number) { + // noop - retrieval from api + } + + updateParentGroup(group: GroupPanel, _isPanelVisible: boolean): void { + // noop - retrieval from api + this._groupRef.value = group; + } + + dispose() { + this.part?.dispose(); + } +} diff --git a/build/packages/dockview/src/react/dockview/v2/reactContentRenderer.ts b/build/packages/dockview/src/react/dockview/v2/reactContentRenderer.ts new file mode 100644 index 000000000..83f693b80 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/v2/reactContentRenderer.ts @@ -0,0 +1,105 @@ +import { + GroupPanelPartInitParameters, + IContentRenderer, +} from '../../../groupview/types'; +import { GroupPanel } from '../../../groupview/groupviewPanel'; +import { HostedContainer } from '../../../hostedContainer'; +import { PanelUpdateEvent } from '../../../panel/types'; +import { ReactPart, ReactPortalStore } from '../../react'; +import { IDockviewPanelProps } from '../dockview'; + +export class ReactContentRenderer implements IContentRenderer { + private _hostedContainer: HostedContainer; + + private _element: HTMLElement; + private part?: ReactPart; + private _group: GroupPanel | undefined; + + private parameters: GroupPanelPartInitParameters | undefined; + + get element(): HTMLElement { + return this._element; + } + + get onDidBlur() { + return this._hostedContainer.onDidBlur; + } + + get onDidFocus() { + return this._hostedContainer.onDidFocus; + } + + constructor( + public readonly id: string, + private readonly component: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + this._hostedContainer = new HostedContainer({ + id, + parent: document + .getElementsByClassName('dockview') + .item(0) as HTMLElement, + }); + + this._element = document.createElement('div'); + this._element.style.height = '100%'; + this._element.style.width = '100%'; + } + + focus() { + // noop + } + + public init(parameters: GroupPanelPartInitParameters): void { + this.parameters = parameters; + + parameters.api.onDidVisibilityChange((event) => { + if (event.isVisible) { + this._hostedContainer.show(); + this._hostedContainer.layout(this.element); + } else { + this._hostedContainer.hide(); + } + }); + + this.part = new ReactPart( + this._hostedContainer.element, + this.reactPortalStore, + this.component, + { + params: parameters.params, + api: parameters.api, + containerApi: parameters.containerApi, + } + ); + } + + public toJSON() { + return { + id: this.id, + }; + } + + public update(params: PanelUpdateEvent) { + if (this.parameters) { + this.parameters.params = params.params; + } + + this.part?.update(params.params); + } + + public updateParentGroup( + group: GroupPanel, + _isPanelVisible: boolean + ): void { + this._group = group; + } + + public layout(_width: number, _height: number): void { + this._hostedContainer.layout(this.element); + } + + public dispose() { + this.part?.dispose(); + } +} diff --git a/build/packages/dockview/src/react/dockview/v2/reactGroupPanelView.ts b/build/packages/dockview/src/react/dockview/v2/reactGroupPanelView.ts new file mode 100644 index 000000000..b9925790a --- /dev/null +++ b/build/packages/dockview/src/react/dockview/v2/reactGroupPanelView.ts @@ -0,0 +1,30 @@ +import { DefaultTab } from '../../../dockview/components/tab/defaultTab'; +import { + DockviewRenderFunctions, + ViewFactoryData, +} from '../../../dockview/options'; +import { ReactPortalStore } from '../../react'; +import { DefaultGroupPanelView } from '../../../dockview/defaultGroupPanelView'; +import { ReactContentRenderer } from './reactContentRenderer'; + +export class ReactGroupPanelView extends DefaultGroupPanelView { + constructor( + id: string, + options: DockviewRenderFunctions, + private readonly data: ViewFactoryData, + reactPortalStore: ReactPortalStore + ) { + super({ + content: new ReactContentRenderer( + id, + options.frameworkComponents![data.content], + reactPortalStore + ), + tab: new DefaultTab(), + }); + } + + // toJSON() { + // return { ...this.data }; + // } +} diff --git a/build/packages/dockview/src/react/dockview/v2/webviewContentRenderer.ts b/build/packages/dockview/src/react/dockview/v2/webviewContentRenderer.ts new file mode 100644 index 000000000..71c5beb31 --- /dev/null +++ b/build/packages/dockview/src/react/dockview/v2/webviewContentRenderer.ts @@ -0,0 +1,59 @@ +import { + GroupPanelPartInitParameters, + IContentRenderer, +} from '../../../groupview/types'; +import { GroupPanel } from '../../../groupview/groupviewPanel'; +import { HostedContainer } from '../../../hostedContainer'; +import { PanelUpdateEvent } from '../../../panel/types'; + +export class WebviewContentRenderer implements IContentRenderer { + private _hostedContainer: HostedContainer; + private _element: HTMLElement; + + private parameters: GroupPanelPartInitParameters | undefined; + + get element(): HTMLElement { + return this._element; + } + + constructor(public readonly id: string) { + this._hostedContainer = new HostedContainer({ id }); + + this._element = document.createElement('div'); + this._element.style.height = '100%'; + this._element.style.width = '100%'; + } + + focus() { + // noop + } + + public init(parameters: GroupPanelPartInitParameters): void { + this.parameters = parameters; + } + + public toJSON() { + return {}; + } + + public update(params: PanelUpdateEvent) { + if (this.parameters) { + this.parameters.params = params.params; + } + } + + public updateParentGroup( + _group: GroupPanel, + _isPanelVisible: boolean + ): void { + // + } + + public layout(_width: number, _height: number): void { + this._hostedContainer.layout(this._element); + } + + public dispose() { + // + } +} diff --git a/build/packages/dockview/src/react/gridview/gridview.tsx b/build/packages/dockview/src/react/gridview/gridview.tsx new file mode 100644 index 000000000..d13db6eb2 --- /dev/null +++ b/build/packages/dockview/src/react/gridview/gridview.tsx @@ -0,0 +1,123 @@ +import * as React from 'react'; +import { + GridviewComponent, + IGridviewComponent, +} from '../../gridview/gridviewComponent'; +import { GridviewPanelApi } from '../../api/gridviewPanelApi'; +import { Orientation } from '../../splitview/core/splitview'; +import { ReactGridPanelView } from './view'; +import { usePortalsLifecycle } from '../react'; +import { GridviewApi } from '../../api/component.api'; +import { PanelCollection, PanelParameters } from '../types'; +import { watchElementResize } from '../../dom'; + +export interface GridviewReadyEvent { + api: GridviewApi; +} + +export interface IGridviewPanelProps + extends PanelParameters { + api: GridviewPanelApi; + containerApi: GridviewApi; +} + +export interface IGridviewReactProps { + orientation?: Orientation; + onReady: (event: GridviewReadyEvent) => void; + components: PanelCollection; + hideBorders?: boolean; + className?: string; + proportionalLayout?: boolean; + disableAutoResizing?: boolean; +} + +export const GridviewReact = React.forwardRef( + (props: IGridviewReactProps, ref: React.ForwardedRef) => { + const domRef = React.useRef(null); + const gridviewRef = React.useRef(); + const [portals, addPortal] = usePortalsLifecycle(); + + React.useImperativeHandle(ref, () => domRef.current!, []); + + React.useEffect(() => { + if (props.disableAutoResizing) { + return () => { + // + }; + } + + const watcher = watchElementResize(domRef.current!, (entry) => { + const { width, height } = entry.contentRect; + gridviewRef.current?.layout(width, height); + }); + + return () => { + watcher.dispose(); + }; + }, [props.disableAutoResizing]); + + React.useEffect(() => { + const element = document.createElement('div'); + + const gridview = new GridviewComponent(element, { + proportionalLayout: + typeof props.proportionalLayout === 'boolean' + ? props.proportionalLayout + : true, + orientation: props.orientation || Orientation.HORIZONTAL, + frameworkComponents: props.components, + frameworkComponentFactory: { + createComponent: (id: string, componentId, component) => { + return new ReactGridPanelView( + id, + componentId, + component, + { + addPortal, + } + ); + }, + }, + styles: props.hideBorders + ? { separatorBorder: 'transparent' } + : undefined, + }); + + domRef.current?.appendChild(gridview.element); + + const { clientWidth, clientHeight } = domRef.current!; + gridview.layout(clientWidth, clientHeight); + + if (props.onReady) { + props.onReady({ api: new GridviewApi(gridview) }); + } + + gridviewRef.current = gridview; + + return () => { + gridview.dispose(); + element.remove(); + }; + }, []); + + React.useEffect(() => { + if (!gridviewRef.current) { + return; + } + gridviewRef.current.updateOptions({ + frameworkComponents: props.components, + }); + }, [props.components]); + + return ( +
+ {portals} +
+ ); + } +); +GridviewReact.displayName = 'GridviewComponent'; diff --git a/build/packages/dockview/src/react/gridview/view.ts b/build/packages/dockview/src/react/gridview/view.ts new file mode 100644 index 000000000..417734f33 --- /dev/null +++ b/build/packages/dockview/src/react/gridview/view.ts @@ -0,0 +1,34 @@ +import { GridviewApi } from '../../api/component.api'; +import { + GridviewPanel, + GridviewInitParameters, +} from '../../gridview/gridviewPanel'; +import { IFrameworkPart } from '../../panel/types'; +import { ReactPart, ReactPortalStore } from '../react'; +import { IGridviewPanelProps } from './gridview'; + +export class ReactGridPanelView extends GridviewPanel { + constructor( + id: string, + component: string, + private readonly reactComponent: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + super(id, component); + } + + getComponent(): IFrameworkPart { + return new ReactPart( + this.element, + this.reactPortalStore, + this.reactComponent, + { + params: this._params?.params || {}, + api: this.api, + containerApi: new GridviewApi( + (this._params as GridviewInitParameters).accessor + ), + } + ); + } +} diff --git a/build/packages/dockview/src/react/index.ts b/build/packages/dockview/src/react/index.ts new file mode 100644 index 000000000..023167a96 --- /dev/null +++ b/build/packages/dockview/src/react/index.ts @@ -0,0 +1,9 @@ +export * from './dockview/dockview'; +export * from './splitview/splitview'; +export * from './gridview/gridview'; +export * from './dockview/reactContentPart'; +export * from './dockview/reactHeaderPart'; +export { IWatermarkPanelProps } from './dockview/reactWatermarkPart'; +export * from './paneview/paneview'; +export * from './types'; +export * from './react'; diff --git a/build/packages/dockview/src/react/paneview/paneview.tsx b/build/packages/dockview/src/react/paneview/paneview.tsx new file mode 100644 index 000000000..f57809a77 --- /dev/null +++ b/build/packages/dockview/src/react/paneview/paneview.tsx @@ -0,0 +1,158 @@ +import * as React from 'react'; +import { PaneviewPanelApi } from '../../api/paneviewPanelApi'; +import { + PaneviewComponent, + IPaneviewComponent, +} from '../../paneview/paneviewComponent'; +import { usePortalsLifecycle } from '../react'; +import { PaneviewApi } from '../../api/component.api'; +import { PanePanelSection } from './view'; +import { PanelCollection, PanelParameters } from '../types'; +import { watchElementResize } from '../../dom'; +import { PaneviewDropEvent2 } from '../../paneview/draggablePaneviewPanel'; + +export interface PaneviewReadyEvent { + api: PaneviewApi; +} + +export interface IPaneviewPanelProps + extends PanelParameters { + api: PaneviewPanelApi; + containerApi: PaneviewApi; + title: string; +} + +export interface PaneviewDropEvent extends PaneviewDropEvent2 { + api: PaneviewApi; +} + +export interface IPaneviewReactProps { + onReady: (event: PaneviewReadyEvent) => void; + components: PanelCollection; + headerComponents?: PanelCollection; + className?: string; + disableAutoResizing?: boolean; + disableDnd?: boolean; + onDidDrop?(event: PaneviewDropEvent): void; +} + +export const PaneviewReact = React.forwardRef( + (props: IPaneviewReactProps, ref: React.ForwardedRef) => { + const domRef = React.useRef(null); + const paneviewRef = React.useRef(); + const [portals, addPortal] = usePortalsLifecycle(); + + React.useImperativeHandle(ref, () => domRef.current!, []); + + React.useEffect(() => { + if (props.disableAutoResizing) { + return () => { + // + }; + } + + const watcher = watchElementResize(domRef.current!, (entry) => { + const { width, height } = entry.contentRect; + paneviewRef.current?.layout(width, height); + }); + + return () => { + watcher.dispose(); + }; + }, [props.disableAutoResizing]); + + React.useEffect(() => { + const createComponent = ( + id: string, + _componentId: string, + component: any + ) => + new PanePanelSection(id, component, { + addPortal, + }); + + const paneview = new PaneviewComponent(domRef.current!, { + frameworkComponents: props.components, + components: {}, + headerComponents: {}, + disableDnd: props.disableDnd, + headerframeworkComponents: props.headerComponents, + frameworkWrapper: { + header: { + createComponent, + }, + body: { + createComponent, + }, + }, + }); + + const api = new PaneviewApi(paneview); + + const { clientWidth, clientHeight } = domRef.current!; + paneview.layout(clientWidth, clientHeight); + + if (props.onReady) { + props.onReady({ api }); + } + + paneviewRef.current = paneview; + + return () => { + paneview.dispose(); + }; + }, []); + + React.useEffect(() => { + if (!paneviewRef.current) { + return; + } + paneviewRef.current.updateOptions({ + frameworkComponents: props.components, + }); + }, [props.components]); + + React.useEffect(() => { + if (!paneviewRef.current) { + return; + } + paneviewRef.current.updateOptions({ + headerframeworkComponents: props.headerComponents, + }); + }, [props.headerComponents]); + + React.useEffect(() => { + if (!paneviewRef.current) { + return () => { + // + }; + } + + const paneview = paneviewRef.current; + + const disposable = paneview.onDidDrop((event) => { + if (props.onDidDrop) { + props.onDidDrop({ + ...event, + api: new PaneviewApi(paneview), + }); + } + }); + + return () => { + disposable.dispose(); + }; + }, [props.onDidDrop]); + + return ( +
+ {portals} +
+ ); + } +); +PaneviewReact.displayName = 'PaneviewComponent'; diff --git a/build/packages/dockview/src/react/paneview/view.tsx b/build/packages/dockview/src/react/paneview/view.tsx new file mode 100644 index 000000000..06624a873 --- /dev/null +++ b/build/packages/dockview/src/react/paneview/view.tsx @@ -0,0 +1,55 @@ +import * as React from 'react'; +import { PanelUpdateEvent } from '../../panel/types'; +import { + IPaneBodyPart, + PanePanelComponentInitParameter, +} from '../../paneview/paneviewPanel'; +import { ReactPart, ReactPortalStore } from '../react'; +import { IPaneviewPanelProps } from './paneview'; + +export class PanePanelSection implements IPaneBodyPart { + private _element: HTMLElement; + private part?: ReactPart; + + get element() { + return this._element; + } + + constructor( + public readonly id: string, + private readonly component: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + this._element = document.createElement('div'); + this._element.style.height = '100%'; + this._element.style.width = '100%'; + } + + public init(parameters: PanePanelComponentInitParameter): void { + this.part = new ReactPart( + this.element, + this.reactPortalStore, + this.component, + { + params: parameters.params, + api: parameters.api, + title: parameters.title, + containerApi: parameters.containerApi, + } + ); + } + + public toJSON() { + return { + id: this.id, + }; + } + + public update(params: PanelUpdateEvent) { + this.part?.update(params.params); + } + + public dispose() { + this.part?.dispose(); + } +} diff --git a/build/packages/dockview/src/react/react.ts b/build/packages/dockview/src/react/react.ts new file mode 100644 index 000000000..886499260 --- /dev/null +++ b/build/packages/dockview/src/react/react.ts @@ -0,0 +1,185 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import { IDisposable } from '../lifecycle'; +import { sequentialNumberGenerator } from '../math'; +import { IFrameworkPart } from '../panel/types'; + +export interface ReactPortalStore { + addPortal: (portal: React.ReactPortal) => IDisposable; +} + +interface IPanelWrapperProps { + component: React.FunctionComponent<{ [key: string]: any }>; + componentProps: { [key: string]: any }; +} + +interface IPanelWrapperRef { + update: (props: { [key: string]: any }) => void; +} + +/** + * This component is intended to interface between vanilla-js and React hence we need to be + * creative in how we update props. + * A ref of the component is exposed with an update method; which when called stores the props + * as a ref within this component and forcefully triggers a re-render of the component using + * the ref of props we just set on the renderered component as the props passed to the inner + * component + */ +const ReactComponentBridge: React.ForwardRefRenderFunction< + IPanelWrapperRef, + IPanelWrapperProps +> = (props, ref) => { + const [_, triggerRender] = React.useState(); + const _props = React.useRef(props.componentProps); + + React.useImperativeHandle( + ref, + () => ({ + update: (componentProps: object) => { + _props.current = { ..._props.current, ...componentProps }; + /** + * setting a arbitrary piece of state within this component will + * trigger a re-render. + * we use this rather than updating through a prop since we can + * pass a ref into the vanilla-js world. + */ + triggerRender(Date.now()); + }, + }), + [] + ); + + return React.createElement(props.component, _props.current); +}; +ReactComponentBridge.displayName = 'DockviewReactJsBridge'; + +/** + * Since we are storing the React.Portal references in a rendered array they + * require a key property like any other React element rendered in an array + * to prevent excessive re-rendering + */ +const uniquePortalKeyGenerator = sequentialNumberGenerator(); + +export const ReactPartContext = React.createContext<{}>({}); + +export class ReactPart

+ implements IFrameworkPart +{ + private componentInstance?: IPanelWrapperRef; + private ref?: { portal: React.ReactPortal; disposable: IDisposable }; + private disposed = false; + + constructor( + private readonly parent: HTMLElement, + private readonly portalStore: ReactPortalStore, + private readonly component: React.FunctionComponent

, + private readonly parameters: P, + private readonly context?: C + ) { + this.createPortal(); + } + + public update(props: { [index: string]: any }) { + if (this.disposed) { + throw new Error('invalid operation: resource is already disposed'); + } + + this.componentInstance?.update(props); + } + + private createPortal() { + if (this.disposed) { + throw new Error('invalid operation: resource is already disposed'); + } + + if (typeof this.component !== 'function') { + /** + * we know this isn't a React.FunctionComponent so throw an error here. + * if we do not intercept this the React library will throw a very obsure error + * for the same reason, at least at this point we will emit a sensible stacktrace. + */ + throw new Error( + 'Invalid Operation. dockview only supports React Functional Components.' + ); + } + + const bridgeComponent = React.createElement( + React.forwardRef(ReactComponentBridge), + { + component: this + .component as unknown as React.FunctionComponent<{}>, + componentProps: this.parameters as unknown as {}, + ref: (element: IPanelWrapperRef) => { + this.componentInstance = element; + }, + } + ); + + const node = this.context + ? React.createElement( + ReactPartContext.Provider, + { value: this.context }, + bridgeComponent + ) + : bridgeComponent; + + const portal = ReactDOM.createPortal( + node, + this.parent, + uniquePortalKeyGenerator.next() + ); + + this.ref = { + portal, + disposable: this.portalStore.addPortal(portal), + }; + } + + public dispose() { + this.ref?.disposable.dispose(); + this.disposed = true; + } +} + +type PortalLifecycleHook = () => [ + React.ReactPortal[], + (portal: React.ReactPortal) => IDisposable +]; + +/** + * A React Hook that returns an array of portals to be rendered by the user of this hook + * and a disposable function to add a portal. Calling dispose removes this portal from the + * portal array + */ +export const usePortalsLifecycle: PortalLifecycleHook = () => { + const [portals, setPortals] = React.useState([]); + + React.useDebugValue(`Portal count: ${portals.length}`); + + const addPortal = React.useCallback((portal: React.ReactPortal) => { + setPortals((existingPortals) => [...existingPortals, portal]); + let disposed = false; + return { + dispose: () => { + if (disposed) { + throw new Error( + 'invalid operation: resource already disposed' + ); + } + disposed = true; + setPortals((existingPortals) => + existingPortals.filter((p) => p !== portal) + ); + }, + }; + }, []); + + return [portals, addPortal]; +}; + +// it does the job... +export function isReactElement( + element: any | React.ReactElement +): element is React.ReactElement { + return element?.type; +} diff --git a/build/packages/dockview/src/react/splitview/splitview.tsx b/build/packages/dockview/src/react/splitview/splitview.tsx new file mode 100644 index 000000000..7fe6877c8 --- /dev/null +++ b/build/packages/dockview/src/react/splitview/splitview.tsx @@ -0,0 +1,117 @@ +import * as React from 'react'; +import { SplitviewApi } from '../../api/component.api'; +import { SplitviewPanelApi } from '../../api/splitviewPanelApi'; +import { + ISplitviewComponent, + SplitviewComponent, +} from '../../splitview/splitviewComponent'; +import { Orientation } from '../../splitview/core/splitview'; +import { usePortalsLifecycle } from '../react'; +import { PanelCollection, PanelParameters } from '../types'; +import { ReactPanelView } from './view'; +import { watchElementResize } from '../../dom'; + +export interface SplitviewReadyEvent { + api: SplitviewApi; +} + +export interface ISplitviewPanelProps + extends PanelParameters { + api: SplitviewPanelApi; + containerApi: SplitviewApi; +} + +export interface ISplitviewReactProps { + orientation?: Orientation; + onReady: (event: SplitviewReadyEvent) => void; + components: PanelCollection; + proportionalLayout?: boolean; + hideBorders?: boolean; + className?: string; + disableAutoResizing?: boolean; +} + +export const SplitviewReact = React.forwardRef( + (props: ISplitviewReactProps, ref: React.ForwardedRef) => { + const domRef = React.useRef(null); + const splitviewRef = React.useRef(); + const [portals, addPortal] = usePortalsLifecycle(); + + React.useImperativeHandle(ref, () => domRef.current!, []); + + React.useEffect(() => { + if (props.disableAutoResizing) { + return () => { + // + }; + } + + const watcher = watchElementResize(domRef.current!, (entry) => { + const { width, height } = entry.contentRect; + splitviewRef.current?.layout(width, height); + }); + + return () => { + watcher.dispose(); + }; + }, [props.disableAutoResizing]); + + React.useEffect(() => { + const splitview = new SplitviewComponent(domRef.current!, { + orientation: props.orientation || Orientation.HORIZONTAL, + frameworkComponents: props.components, + frameworkWrapper: { + createComponent: ( + id: string, + componentId, + component: any + ) => { + return new ReactPanelView(id, componentId, component, { + addPortal, + }); + }, + }, + proportionalLayout: + typeof props.proportionalLayout === 'boolean' + ? props.proportionalLayout + : true, + styles: props.hideBorders + ? { separatorBorder: 'transparent' } + : undefined, + }); + + const { clientWidth, clientHeight } = domRef.current!; + splitview.layout(clientWidth, clientHeight); + + if (props.onReady) { + props.onReady({ api: new SplitviewApi(splitview) }); + } + + splitviewRef.current = splitview; + + return () => { + splitview.dispose(); + }; + }, []); + + React.useEffect(() => { + if (!splitviewRef.current) { + return; + } + splitviewRef.current.updateOptions({ + frameworkComponents: props.components, + }); + }, [props.components]); + + return ( +

+ {portals} +
+ ); + } +); +SplitviewReact.displayName = 'SplitviewComponent'; diff --git a/build/packages/dockview/src/react/splitview/view.ts b/build/packages/dockview/src/react/splitview/view.ts new file mode 100644 index 000000000..9c7c66450 --- /dev/null +++ b/build/packages/dockview/src/react/splitview/view.ts @@ -0,0 +1,31 @@ +import { SplitviewApi } from '../../api/component.api'; +import { PanelViewInitParameters } from '../../splitview/core/options'; +import { SplitviewPanel } from '../../splitview/splitviewPanel'; +import { ReactPart, ReactPortalStore } from '../react'; +import { ISplitviewPanelProps } from './splitview'; + +export class ReactPanelView extends SplitviewPanel { + constructor( + id: string, + component: string, + private readonly reactComponent: React.FunctionComponent, + private readonly reactPortalStore: ReactPortalStore + ) { + super(id, component); + } + + getComponent() { + return new ReactPart( + this.element, + this.reactPortalStore, + this.reactComponent, + { + params: this._params?.params || {}, + api: this.api, + containerApi: new SplitviewApi( + (this._params as PanelViewInitParameters).accessor + ), + } + ); + } +} diff --git a/build/packages/dockview/src/react/types.ts b/build/packages/dockview/src/react/types.ts new file mode 100644 index 000000000..d5b7b07a3 --- /dev/null +++ b/build/packages/dockview/src/react/types.ts @@ -0,0 +1,9 @@ +import * as React from 'react'; + +export interface PanelCollection { + [name: string]: React.FunctionComponent; +} + +export interface PanelParameters> { + params: T; +} diff --git a/build/packages/dockview/src/splitview/core/options.ts b/build/packages/dockview/src/splitview/core/options.ts new file mode 100644 index 000000000..05d01864f --- /dev/null +++ b/build/packages/dockview/src/splitview/core/options.ts @@ -0,0 +1,29 @@ +import { IPanel, PanelInitParameters } from '../../panel/types'; +import { IView, SplitViewOptions, LayoutPriority } from './splitview'; +import { FrameworkFactory } from '../../types'; +import { SplitviewPanel } from '../splitviewPanel'; +import { SplitviewComponent } from '../splitviewComponent'; + +export interface PanelViewInitParameters extends PanelInitParameters { + minimumSize?: number; + maximumSize?: number; + snap?: boolean; + priority?: LayoutPriority; + accessor: SplitviewComponent; +} + +export interface ISerializableView extends IView, IPanel { + init: (params: PanelViewInitParameters) => void; +} + +export interface SplitviewComponentOptions extends SplitViewOptions { + components?: { + [componentName: string]: { + new (id: string, componentName: string): SplitviewPanel; + }; + }; + frameworkComponents?: { + [componentName: string]: any; + }; + frameworkWrapper?: FrameworkFactory; +} diff --git a/build/packages/dockview/src/splitview/core/splitview.scss b/build/packages/dockview/src/splitview/core/splitview.scss new file mode 100644 index 000000000..7d329cf12 --- /dev/null +++ b/build/packages/dockview/src/splitview/core/splitview.scss @@ -0,0 +1,143 @@ +.split-view-container { + position: relative; + overflow: hidden; + height: 100%; + width: 100%; + + &.animation { + .view, + .sash { + transition-duration: 0.15s; + transition-timing-function: ease-out; + } + } + + // debug + // .sash { + // &.enabled { + // background-color: black; + // } + // &.disabled { + // background-color: orange; + // } + // &.maximum { + // background-color: green; + // } + // &.minimum { + // background-color: red; + // } + // } + + &.horizontal { + height: 100%; + + & > .sash-container > .sash { + height: 100%; + width: 4px; + &.enabled { + cursor: ew-resize; + } + &.disabled { + cursor: default; + } + &.maximum { + cursor: w-resize; + } + &.minimum { + cursor: e-resize; + } + } + + & > .view-container > .view { + &:not(:first-child) { + // padding-left: 1px; + &::before { + height: 100%; + width: 1px; + } + } + } + } + + &.vertical { + width: 100%; + + & > .sash-container > .sash { + width: 100%; + height: 4px; + + &.enabled { + cursor: ns-resize; + } + &.disabled { + cursor: default; + } + &.maximum { + cursor: n-resize; + } + &.minimum { + cursor: s-resize; + } + } + + & > .view-container > .view { + width: 100%; + + &:not(:first-child) { + // padding-top: 1px; + &::before { + height: 1px; + width: 100%; + } + } + } + } + + .sash-container { + height: 100%; + width: 100%; + position: absolute; + + .sash { + position: absolute; + z-index: 99; + outline: none; + + &:active { + transition: background-color 0.1s ease-in-out; + background-color: var(--dv-active-sash-color, transparent); + } + + &:hover { + background-color: var(--dv-active-sash-color, transparent); + transition: background-color 0.1s ease-in-out; + transition-delay: 0.5s; + } + } + } + + .view-container { + position: relative; + height: 100%; + width: 100%; + + .view { + height: 100%; + box-sizing: border-box; + overflow: auto; + position: absolute; + } + } + + &.separator-border { + .view:not(:first-child)::before { + content: ' '; + position: absolute; + top: 0; + left: 0; + z-index: 5; + pointer-events: none; + background-color: var(--dv-separator-border); + } + } +} diff --git a/build/packages/dockview/src/splitview/core/splitview.ts b/build/packages/dockview/src/splitview/core/splitview.ts new file mode 100644 index 000000000..47fcfe0ff --- /dev/null +++ b/build/packages/dockview/src/splitview/core/splitview.ts @@ -0,0 +1,1050 @@ +/*--------------------------------------------------------------------------------------------- + * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at: + * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview + *--------------------------------------------------------------------------------------------*/ + +import { + removeClasses, + addClasses, + toggleClass, + getElementsByTagName, +} from '../../dom'; +import { clamp } from '../../math'; +import { Event, Emitter } from '../../events'; +import { pushToStart, pushToEnd, range, firstIndex } from '../../array'; +import { ViewItem } from './viewItem'; + +export enum Orientation { + HORIZONTAL = 'HORIZONTAL', + VERTICAL = 'VERTICAL', +} + +export enum SashState { + MAXIMUM, + MINIMUM, + DISABLED, + ENABLED, +} + +export interface ISplitviewStyles { + separatorBorder: string; +} + +export interface SplitViewOptions { + readonly orientation: Orientation; + readonly descriptor?: ISplitViewDescriptor; + readonly proportionalLayout?: boolean; + readonly styles?: ISplitviewStyles; +} +export enum LayoutPriority { + Low = 'low', + High = 'high', + Normal = 'normal', +} + +export interface IBaseView { + minimumSize: number; + maximumSize: number; + snap?: boolean; + priority?: LayoutPriority; +} + +export interface IView extends IBaseView { + readonly element: HTMLElement | DocumentFragment; + readonly onDidChange: Event; + layout(size: number, orthogonalSize: number): void; + setVisible(visible: boolean): void; +} + +interface ISashItem { + container: HTMLElement; + disposable: () => void; +} + +interface ISashDragSnapState { + readonly index: number; + readonly limitDelta: number; + readonly size: number; +} + +type ViewItemSize = number | { cachedVisibleSize: number }; + +export type DistributeSizing = { type: 'distribute' }; +export type SplitSizing = { type: 'split'; index: number }; +export type InvisibleSizing = { type: 'invisible'; cachedVisibleSize: number }; +export type Sizing = DistributeSizing | SplitSizing | InvisibleSizing; + +export namespace Sizing { + export const Distribute: DistributeSizing = { type: 'distribute' }; + export function Split(index: number): SplitSizing { + return { type: 'split', index }; + } + export function Invisible(cachedVisibleSize: number): InvisibleSizing { + return { type: 'invisible', cachedVisibleSize }; + } +} + +export interface ISplitViewDescriptor { + size: number; + views: { + visible?: boolean; + size: number; + view: IView; + }[]; +} + +export class Splitview { + private element: HTMLElement; + private viewContainer: HTMLElement; + private sashContainer: HTMLElement; + private views: ViewItem[] = []; + private sashes: ISashItem[] = []; + private _orientation: Orientation; + private _size = 0; + private _orthogonalSize = 0; + private contentSize = 0; + private _proportions: number[] | undefined = undefined; + private proportionalLayout: boolean; + + private readonly _onDidSashEnd = new Emitter(); + readonly onDidSashEnd = this._onDidSashEnd.event; + private readonly _onDidAddView = new Emitter(); + readonly onDidAddView = this._onDidAddView.event; + private readonly _onDidRemoveView = new Emitter(); + readonly onDidRemoveView = this._onDidRemoveView.event; + + get size() { + return this._size; + } + + set size(value: number) { + this._size = value; + } + + get orthogonalSize() { + return this._orthogonalSize; + } + + set orthogonalSize(value: number) { + this._orthogonalSize = value; + } + + public get length() { + return this.views.length; + } + + public get proportions() { + return this._proportions ? [...this._proportions] : undefined; + } + + get orientation() { + return this._orientation; + } + + set orientation(value: Orientation) { + this._orientation = value; + + const tmp = this.size; + this.size = this.orthogonalSize; + this.orthogonalSize = tmp; + + removeClasses(this.element, 'horizontal', 'vertical'); + this.element.classList.add( + this.orientation == Orientation.HORIZONTAL + ? 'horizontal' + : 'vertical' + ); + } + + get minimumSize(): number { + return this.views.reduce((r, item) => r + item.minimumSize, 0); + } + + get maximumSize(): number { + return this.length === 0 + ? Number.POSITIVE_INFINITY + : this.views.reduce((r, item) => r + item.maximumSize, 0); + } + + private _startSnappingEnabled = true; + get startSnappingEnabled(): boolean { + return this._startSnappingEnabled; + } + set startSnappingEnabled(startSnappingEnabled: boolean) { + if (this._startSnappingEnabled === startSnappingEnabled) { + return; + } + + this._startSnappingEnabled = startSnappingEnabled; + this.updateSashEnablement(); + } + + private _endSnappingEnabled = true; + get endSnappingEnabled(): boolean { + return this._endSnappingEnabled; + } + set endSnappingEnabled(endSnappingEnabled: boolean) { + if (this._endSnappingEnabled === endSnappingEnabled) { + return; + } + + this._endSnappingEnabled = endSnappingEnabled; + this.updateSashEnablement(); + } + + constructor( + private readonly container: HTMLElement, + options: SplitViewOptions + ) { + this._orientation = options.orientation; + this.element = this.createContainer(); + + this.proportionalLayout = + options.proportionalLayout === undefined + ? true + : !!options.proportionalLayout; + + this.viewContainer = this.createViewContainer(); + this.sashContainer = this.createSashContainer(); + + this.element.appendChild(this.sashContainer); + this.element.appendChild(this.viewContainer); + + this.container.appendChild(this.element); + + this.style(options.styles); + + // We have an existing set of view, add them now + if (options.descriptor) { + this._size = options.descriptor.size; + options.descriptor.views.forEach((viewDescriptor, index) => { + const sizing = + viewDescriptor.visible === undefined || + viewDescriptor.visible + ? viewDescriptor.size + : ({ + type: 'invisible', + cachedVisibleSize: viewDescriptor.size, + } as InvisibleSizing); + + const view = viewDescriptor.view; + this.addView( + view, + sizing, + index, + true + // true skip layout + ); + }); + + // Initialize content size and proportions for first layout + this.contentSize = this.views.reduce((r, i) => r + i.size, 0); + this.saveProportions(); + } + } + + style(styles?: ISplitviewStyles): void { + if (styles?.separatorBorder === 'transparent') { + removeClasses(this.element, 'separator-border'); + this.element.style.removeProperty('--dv-separator-border'); + } else { + addClasses(this.element, 'separator-border'); + if (styles?.separatorBorder) { + this.element.style.setProperty( + '--dv-separator-border', + styles.separatorBorder + ); + } + } + } + + isViewVisible(index: number): boolean { + if (index < 0 || index >= this.views.length) { + throw new Error('Index out of bounds'); + } + + const viewItem = this.views[index]; + return viewItem.visible; + } + + setViewVisible(index: number, visible: boolean): void { + if (index < 0 || index >= this.views.length) { + throw new Error('Index out of bounds'); + } + + toggleClass(this.container, 'visible', visible); + + const viewItem = this.views[index]; + + toggleClass(this.container, 'visible', visible); + + viewItem.setVisible(visible, viewItem.size); + + this.distributeEmptySpace(index); + this.layoutViews(); + this.saveProportions(); + } + + getViewSize(index: number): number { + if (index < 0 || index >= this.views.length) { + return -1; + } + + return this.views[index].size; + } + + resizeView(index: number, size: number): void { + if (index < 0 || index >= this.views.length) { + return; + } + + const indexes = range(this.views.length).filter((i) => i !== index); + const lowPriorityIndexes = [ + ...indexes.filter( + (i) => this.views[i].priority === LayoutPriority.Low + ), + index, + ]; + const highPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.High + ); + + const item = this.views[index]; + size = Math.round(size); + size = clamp( + size, + item.minimumSize, + Math.min(item.maximumSize, this._size) + ); + + item.size = size; + this.relayout(lowPriorityIndexes, highPriorityIndexes); + } + + public getViews() { + return this.views.map((x) => x.view as T); + } + + private onDidChange(item: ViewItem, size: number | undefined): void { + const index = this.views.indexOf(item); + + if (index < 0 || index >= this.views.length) { + return; + } + + size = typeof size === 'number' ? size : item.size; + size = clamp(size, item.minimumSize, item.maximumSize); + + item.size = size; + + this.relayout([index]); + } + + public addView( + view: IView, + size: number | Sizing = { type: 'distribute' }, + index: number = this.views.length, + skipLayout?: boolean + ) { + const container = document.createElement('div'); + container.className = 'view'; + + container.appendChild(view.element); + + let viewSize: ViewItemSize; + + if (typeof size === 'number') { + viewSize = size; + } else if (size.type === 'split') { + viewSize = this.getViewSize(size.index) / 2; + } else if (size.type === 'invisible') { + viewSize = { cachedVisibleSize: size.cachedVisibleSize }; + } else { + viewSize = view.minimumSize; + } + + const disposable = view.onDidChange((newSize) => + this.onDidChange(viewItem, newSize) + ); + + const dispose = () => { + disposable?.dispose(); + this.viewContainer.removeChild(container); + }; + + const viewItem = new ViewItem(container, view, viewSize, { dispose }); + + if (index === this.views.length) { + this.viewContainer.appendChild(container); + } else { + this.viewContainer.insertBefore( + container, + this.viewContainer.children.item(index) + ); + } + + this.views.splice(index, 0, viewItem); + + if (this.views.length > 1) { + //add sash + const sash = document.createElement('div'); + sash.className = 'sash'; + + const onStart = (event: MouseEvent) => { + for (const item of this.views) { + item.enabled = false; + } + + const iframes = [ + ...getElementsByTagName('iframe'), + ...getElementsByTagName('webview'), + ]; + + for (const iframe of iframes) { + iframe.style.pointerEvents = 'none'; + } + + const start = + this._orientation === Orientation.HORIZONTAL + ? event.clientX + : event.clientY; + + const sashIndex = firstIndex( + this.sashes, + (s) => s.container === sash + ); + + // + const sizes = this.views.map((x) => x.size); + + // + let snapBefore: ISashDragSnapState | undefined; + let snapAfter: ISashDragSnapState | undefined; + const upIndexes = range(sashIndex, -1); + const downIndexes = range(sashIndex + 1, this.views.length); + const minDeltaUp = upIndexes.reduce( + (r, i) => r + (this.views[i].minimumSize - sizes[i]), + 0 + ); + const maxDeltaUp = upIndexes.reduce( + (r, i) => r + (this.views[i].viewMaximumSize - sizes[i]), + 0 + ); + const maxDeltaDown = + downIndexes.length === 0 + ? Number.POSITIVE_INFINITY + : downIndexes.reduce( + (r, i) => + r + (sizes[i] - this.views[i].minimumSize), + 0 + ); + const minDeltaDown = + downIndexes.length === 0 + ? Number.NEGATIVE_INFINITY + : downIndexes.reduce( + (r, i) => + r + + (sizes[i] - this.views[i].viewMaximumSize), + 0 + ); + const minDelta = Math.max(minDeltaUp, minDeltaDown); + const maxDelta = Math.min(maxDeltaDown, maxDeltaUp); + const snapBeforeIndex = this.findFirstSnapIndex(upIndexes); + const snapAfterIndex = this.findFirstSnapIndex(downIndexes); + if (typeof snapBeforeIndex === 'number') { + const snappedViewItem = this.views[snapBeforeIndex]; + const halfSize = Math.floor( + snappedViewItem.viewMinimumSize / 2 + ); + + snapBefore = { + index: snapBeforeIndex, + limitDelta: snappedViewItem.visible + ? minDelta - halfSize + : minDelta + halfSize, + size: snappedViewItem.size, + }; + } + + if (typeof snapAfterIndex === 'number') { + const snappedViewItem = this.views[snapAfterIndex]; + const halfSize = Math.floor( + snappedViewItem.viewMinimumSize / 2 + ); + + snapAfter = { + index: snapAfterIndex, + limitDelta: snappedViewItem.visible + ? maxDelta + halfSize + : maxDelta - halfSize, + size: snappedViewItem.size, + }; + } + // + + const mousemove = (mousemoveEvent: MouseEvent) => { + const current = + this._orientation === Orientation.HORIZONTAL + ? mousemoveEvent.clientX + : mousemoveEvent.clientY; + const delta = current - start; + + this.resize( + sashIndex, + delta, + sizes, + undefined, + undefined, + minDelta, + maxDelta, + snapBefore, + snapAfter + ); + this.distributeEmptySpace(); + this.layoutViews(); + }; + + const end = () => { + for (const item of this.views) { + item.enabled = true; + } + + for (const iframe of iframes) { + iframe.style.pointerEvents = 'auto'; + } + + this.saveProportions(); + + document.removeEventListener('mousemove', mousemove); + document.removeEventListener('mouseup', end); + document.removeEventListener('mouseend', end); + + this._onDidSashEnd.fire(undefined); + }; + + document.addEventListener('mousemove', mousemove); + document.addEventListener('mouseup', end); + document.addEventListener('mouseend', end); + }; + + sash.addEventListener('mousedown', onStart); + + const sashItem: ISashItem = { + container: sash, + disposable: () => { + sash.removeEventListener('mousedown', onStart); + this.sashContainer.removeChild(sash); + }, + }; + + this.sashContainer.appendChild(sash); + this.sashes.push(sashItem); + } + + if (!skipLayout) { + this.relayout([index]); + } + + if ( + !skipLayout && + typeof size !== 'number' && + size.type === 'distribute' + ) { + this.distributeViewSizes(); + } + + this._onDidAddView.fire(view); + } + + distributeViewSizes(): void { + const flexibleViewItems: ViewItem[] = []; + let flexibleSize = 0; + + for (const item of this.views) { + if (item.maximumSize - item.minimumSize > 0) { + flexibleViewItems.push(item); + flexibleSize += item.size; + } + } + + const size = Math.floor(flexibleSize / flexibleViewItems.length); + + for (const item of flexibleViewItems) { + item.size = clamp(size, item.minimumSize, item.maximumSize); + } + + const indexes = range(this.views.length); + const lowPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.Low + ); + const highPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.High + ); + + this.relayout(lowPriorityIndexes, highPriorityIndexes); + } + + public removeView( + index: number, + sizing?: Sizing, + skipLayout = false + ): IView { + // Remove view + const viewItem = this.views.splice(index, 1)[0]; + viewItem.dispose(); + + // Remove sash + if (this.views.length >= 1) { + const sashIndex = Math.max(index - 1, 0); + const sashItem = this.sashes.splice(sashIndex, 1)[0]; + sashItem.disposable(); + } + + if (!skipLayout) { + this.relayout(); + } + + if (sizing && sizing.type === 'distribute') { + this.distributeViewSizes(); + } + + this._onDidRemoveView.fire(viewItem.view); + + return viewItem.view; + } + + getViewCachedVisibleSize(index: number): number | undefined { + if (index < 0 || index >= this.views.length) { + throw new Error('Index out of bounds'); + } + + const viewItem = this.views[index]; + return viewItem.cachedVisibleSize; + } + + public moveView(from: number, to: number) { + const cachedVisibleSize = this.getViewCachedVisibleSize(from); + const sizing = + typeof cachedVisibleSize === 'undefined' + ? this.getViewSize(from) + : Sizing.Invisible(cachedVisibleSize); + const view = this.removeView(from, undefined, true); + this.addView(view, sizing, to); + } + + public layout(size: number, orthogonalSize: number) { + const previousSize = Math.max(this.size, this.contentSize); + this.size = size; + this.orthogonalSize = orthogonalSize; + + if (!this.proportions) { + const indexes = range(this.views.length); + const lowPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.Low + ); + const highPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.High + ); + + this.resize( + this.views.length - 1, + size - previousSize, + undefined, + lowPriorityIndexes, + highPriorityIndexes + ); + } else { + for (let i = 0; i < this.views.length; i++) { + const item = this.views[i]; + + item.size = clamp( + Math.round(this.proportions[i] * size), + item.minimumSize, + item.maximumSize + ); + } + } + + this.distributeEmptySpace(); + this.layoutViews(); + } + + private relayout( + lowPriorityIndexes?: number[], + highPriorityIndexes?: number[] + ) { + const contentSize = this.views.reduce((r, i) => r + i.size, 0); + + this.resize( + this.views.length - 1, + this._size - contentSize, + undefined, + lowPriorityIndexes, + highPriorityIndexes + ); + this.distributeEmptySpace(); + this.layoutViews(); + this.saveProportions(); + } + + private distributeEmptySpace(lowPriorityIndex?: number) { + const contentSize = this.views.reduce((r, i) => r + i.size, 0); + let emptyDelta = this.size - contentSize; + + const indexes = range(this.views.length - 1, -1); + const lowPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.Low + ); + const highPriorityIndexes = indexes.filter( + (i) => this.views[i].priority === LayoutPriority.High + ); + + for (const index of highPriorityIndexes) { + pushToStart(indexes, index); + } + + for (const index of lowPriorityIndexes) { + pushToEnd(indexes, index); + } + + if (typeof lowPriorityIndex === 'number') { + pushToEnd(indexes, lowPriorityIndex); + } + + for (let i = 0; emptyDelta !== 0 && i < indexes.length; i++) { + const item = this.views[indexes[i]]; + const size = clamp( + item.size + emptyDelta, + item.minimumSize, + item.maximumSize + ); + const viewDelta = size - item.size; + + emptyDelta -= viewDelta; + item.size = size; + } + } + + private saveProportions(): void { + if (this.proportionalLayout && this.contentSize > 0) { + this._proportions = this.views.map( + (i) => i.size / this.contentSize + ); + } + } + + private layoutViews() { + this.contentSize = this.views.reduce((r, i) => r + i.size, 0); + let sum = 0; + const x: number[] = []; + + this.updateSashEnablement(); + + for (let i = 0; i < this.views.length - 1; i++) { + sum += this.views[i].size; + x.push(sum); + + const offset = Math.min(Math.max(0, sum - 2), this.size - 4); + + if (this._orientation === Orientation.HORIZONTAL) { + this.sashes[i].container.style.left = `${offset}px`; + this.sashes[i].container.style.top = `0px`; + } + if (this._orientation === Orientation.VERTICAL) { + this.sashes[i].container.style.left = `0px`; + this.sashes[i].container.style.top = `${offset}px`; + } + } + this.views.forEach((view, i) => { + if (this._orientation === Orientation.HORIZONTAL) { + view.container.style.width = `${view.size}px`; + view.container.style.left = i == 0 ? '0px' : `${x[i - 1]}px`; + view.container.style.top = ''; + view.container.style.height = ''; + } + if (this._orientation === Orientation.VERTICAL) { + view.container.style.height = `${view.size}px`; + view.container.style.top = i == 0 ? '0px' : `${x[i - 1]}px`; + view.container.style.width = ''; + view.container.style.left = ''; + } + + view.view.layout(view.size, this._orthogonalSize); + }); + } + + private findFirstSnapIndex(indexes: number[]): number | undefined { + // visible views first + for (const index of indexes) { + const viewItem = this.views[index]; + + if (!viewItem.visible) { + continue; + } + + if (viewItem.snap) { + return index; + } + } + + // then, hidden views + for (const index of indexes) { + const viewItem = this.views[index]; + + if ( + viewItem.visible && + viewItem.maximumSize - viewItem.minimumSize > 0 + ) { + return undefined; + } + + if (!viewItem.visible && viewItem.snap) { + return index; + } + } + + return undefined; + } + + private updateSashEnablement(): void { + let previous = false; + const collapsesDown = this.views.map( + (i) => (previous = i.size - i.minimumSize > 0 || previous) + ); + + previous = false; + const expandsDown = this.views.map( + (i) => (previous = i.maximumSize - i.size > 0 || previous) + ); + + const reverseViews = [...this.views].reverse(); + previous = false; + const collapsesUp = reverseViews + .map((i) => (previous = i.size - i.minimumSize > 0 || previous)) + .reverse(); + + previous = false; + const expandsUp = reverseViews + .map((i) => (previous = i.maximumSize - i.size > 0 || previous)) + .reverse(); + + let position = 0; + for (let index = 0; index < this.sashes.length; index++) { + const sash = this.sashes[index]; + const viewItem = this.views[index]; + position += viewItem.size; + + const min = !(collapsesDown[index] && expandsUp[index + 1]); + const max = !(expandsDown[index] && collapsesUp[index + 1]); + + if (min && max) { + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.views.length); + const snapBeforeIndex = this.findFirstSnapIndex(upIndexes); + const snapAfterIndex = this.findFirstSnapIndex(downIndexes); + + const snappedBefore = + typeof snapBeforeIndex === 'number' && + !this.views[snapBeforeIndex].visible; + const snappedAfter = + typeof snapAfterIndex === 'number' && + !this.views[snapAfterIndex].visible; + + if ( + snappedBefore && + collapsesUp[index] && + (position > 0 || this.startSnappingEnabled) + ) { + this.updateSash(sash, SashState.MINIMUM); + } else if ( + snappedAfter && + collapsesDown[index] && + (position < this.contentSize || this.endSnappingEnabled) + ) { + this.updateSash(sash, SashState.MAXIMUM); + } else { + this.updateSash(sash, SashState.DISABLED); + } + } else if (min && !max) { + this.updateSash(sash, SashState.MINIMUM); + } else if (!min && max) { + this.updateSash(sash, SashState.MAXIMUM); + } else { + this.updateSash(sash, SashState.ENABLED); + } + } + } + + private updateSash(sash: ISashItem, state: SashState) { + toggleClass(sash.container, 'disabled', state === SashState.DISABLED); + toggleClass(sash.container, 'enabled', state === SashState.ENABLED); + toggleClass(sash.container, 'maximum', state === SashState.MAXIMUM); + toggleClass(sash.container, 'minimum', state === SashState.MINIMUM); + } + + private resize = ( + index: number, + delta: number, + sizes: number[] = this.views.map((x) => x.size), + lowPriorityIndexes?: number[], + highPriorityIndexes?: number[], + overloadMinDelta: number = Number.NEGATIVE_INFINITY, + overloadMaxDelta: number = Number.POSITIVE_INFINITY, + snapBefore?: ISashDragSnapState, + snapAfter?: ISashDragSnapState + ): number => { + if (index < 0 || index > this.views.length) { + return 0; + } + + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.views.length); + // + if (highPriorityIndexes) { + for (const i of highPriorityIndexes) { + pushToStart(upIndexes, i); + pushToStart(downIndexes, i); + } + } + + if (lowPriorityIndexes) { + for (const i of lowPriorityIndexes) { + pushToEnd(upIndexes, i); + pushToEnd(downIndexes, i); + } + } + // + const upItems = upIndexes.map((i) => this.views[i]); + const upSizes = upIndexes.map((i) => sizes[i]); + // + const downItems = downIndexes.map((i) => this.views[i]); + const downSizes = downIndexes.map((i) => sizes[i]); + // + const minDeltaUp = upIndexes.reduce( + (_, i) => _ + this.views[i].minimumSize - sizes[i], + 0 + ); + const maxDeltaUp = upIndexes.reduce( + (_, i) => _ + this.views[i].maximumSize - sizes[i], + 0 + ); + // + const maxDeltaDown = + downIndexes.length === 0 + ? Number.POSITIVE_INFINITY + : downIndexes.reduce( + (_, i) => _ + sizes[i] - this.views[i].minimumSize, + + 0 + ); + const minDeltaDown = + downIndexes.length === 0 + ? Number.NEGATIVE_INFINITY + : downIndexes.reduce( + (_, i) => _ + sizes[i] - this.views[i].maximumSize, + 0 + ); + // + const minDelta = Math.max(minDeltaUp, minDeltaDown); + const maxDelta = Math.min(maxDeltaDown, maxDeltaUp); + // + let snapped = false; + if (snapBefore) { + const snapView = this.views[snapBefore.index]; + const visible = delta >= snapBefore.limitDelta; + snapped = visible !== snapView.visible; + snapView.setVisible(visible, snapBefore.size); + } + + if (!snapped && snapAfter) { + const snapView = this.views[snapAfter.index]; + const visible = delta < snapAfter.limitDelta; + snapped = visible !== snapView.visible; + snapView.setVisible(visible, snapAfter.size); + } + + if (snapped) { + return this.resize( + index, + delta, + sizes, + lowPriorityIndexes, + highPriorityIndexes, + overloadMinDelta, + overloadMaxDelta + ); + } + // + const tentativeDelta = clamp(delta, minDelta, maxDelta); + let actualDelta = 0; + // + let deltaUp = tentativeDelta; + + for (let i = 0; i < upItems.length; i++) { + const item = upItems[i]; + const size = clamp( + upSizes[i] + deltaUp, + item.minimumSize, + item.maximumSize + ); + const viewDelta = size - upSizes[i]; + + actualDelta += viewDelta; + deltaUp -= viewDelta; + item.size = size; + } + // + let deltaDown = actualDelta; + for (let i = 0; i < downItems.length; i++) { + const item = downItems[i]; + const size = clamp( + downSizes[i] - deltaDown, + item.minimumSize, + item.maximumSize + ); + const viewDelta = size - downSizes[i]; + + deltaDown += viewDelta; + item.size = size; + } + // + return delta; + }; + + private createViewContainer() { + const element = document.createElement('div'); + element.className = 'view-container'; + return element; + } + + private createSashContainer() { + const element = document.createElement('div'); + element.className = 'sash-container'; + return element; + } + + private createContainer() { + const element = document.createElement('div'); + const orientationClassname = + this._orientation === Orientation.HORIZONTAL + ? 'horizontal' + : 'vertical'; + element.className = `split-view-container ${orientationClassname}`; + return element; + } + + public dispose() { + this._onDidSashEnd.dispose(); + this._onDidAddView.dispose(); + this._onDidRemoveView.dispose(); + + for (let i = 0; i < this.element.children.length; i++) { + if (this.element.children.item(i) === this.element) { + this.element.removeChild(this.element); + break; + } + } + + this.element.remove(); + } +} diff --git a/build/packages/dockview/src/splitview/core/viewItem.ts b/build/packages/dockview/src/splitview/core/viewItem.ts new file mode 100644 index 000000000..ceb6ffeef --- /dev/null +++ b/build/packages/dockview/src/splitview/core/viewItem.ts @@ -0,0 +1,101 @@ +import { IDisposable } from '../../lifecycle'; +import { clamp } from '../../math'; +import { IView, LayoutPriority } from './splitview'; + +export class ViewItem { + private _size: number; + set size(size: number) { + this._size = size; + } + + get size(): number { + return this._size; + } + + private _cachedVisibleSize: number | undefined = undefined; + get cachedVisibleSize(): number | undefined { + return this._cachedVisibleSize; + } + + get visible(): boolean { + return typeof this._cachedVisibleSize === 'undefined'; + } + + setVisible(visible: boolean, size?: number): void { + if (visible === this.visible) { + return; + } + + if (visible) { + this.size = clamp( + this._cachedVisibleSize ?? 0, + this.viewMinimumSize, + this.viewMaximumSize + ); + this._cachedVisibleSize = undefined; + } else { + this._cachedVisibleSize = + typeof size === 'number' ? size : this.size; + this.size = 0; + } + + this.container.classList.toggle('visible', visible); + + if (this.view.setVisible) { + this.view.setVisible(visible); + } + } + + get minimumSize(): number { + return this.visible ? this.view.minimumSize : 0; + } + get viewMinimumSize(): number { + return this.view.minimumSize; + } + + get maximumSize(): number { + return this.visible ? this.view.maximumSize : 0; + } + get viewMaximumSize(): number { + return this.view.maximumSize; + } + + get priority(): LayoutPriority | undefined { + return this.view.priority; + } + get snap(): boolean { + return !!this.view.snap; + } + + set enabled(enabled: boolean) { + this.container.style.pointerEvents = enabled ? '' : 'none'; + } + + constructor( + public container: HTMLElement, + public view: IView, + size: number | { cachedVisibleSize: number }, + private disposable: IDisposable + ) { + if (typeof size === 'number') { + this._size = size; + this._cachedVisibleSize = undefined; + container.classList.add('visible'); + } else { + this._size = 0; + this._cachedVisibleSize = size.cachedVisibleSize; + } + } + + // layout(offset: number, layoutContext: TLayoutContext | undefined): void { + // this.layoutContainer(offset); + // this.view.layout(this.size, offset, layoutContext); + // } + + // abstract layoutContainer(offset: number): void; + + dispose(): IView { + this.disposable.dispose(); + return this.view; + } +} diff --git a/build/packages/dockview/src/splitview/splitviewComponent.ts b/build/packages/dockview/src/splitview/splitviewComponent.ts new file mode 100644 index 000000000..1fb23846b --- /dev/null +++ b/build/packages/dockview/src/splitview/splitviewComponent.ts @@ -0,0 +1,428 @@ +import { + CompositeDisposable, + IDisposable, + IValueDisposable, + MutableDisposable, +} from '../lifecycle'; +import { + IView, + LayoutPriority, + Orientation, + Sizing, + Splitview, +} from './core/splitview'; +import { SplitviewComponentOptions } from './core/options'; +import { BaseComponentOptions } from '../panel/types'; +import { Emitter, Event } from '../events'; +import { SplitviewPanel, ISplitviewPanel } from './splitviewPanel'; +import { createComponent } from '../panel/componentFactory'; + +export interface SerializedSplitviewPanelData { + id: string; + component: string; + minimumSize?: number; + maximumSize?: number; + params?: { [index: string]: any }; +} + +export interface SerializedSplitviewPanel { + snap?: boolean; + priority?: LayoutPriority; + data: SerializedSplitviewPanelData; + size: number; +} + +export interface SerializedSplitview { + orientation: Orientation; + size: number; + activeView?: string; + views: SerializedSplitviewPanel[]; +} + +export interface AddSplitviewComponentOptions extends BaseComponentOptions { + index?: number; + minimumSize?: number; + maximumSize?: number; +} + +export type SplitviewComponentUpdateOptions = Pick< + SplitviewComponentOptions, + 'orientation' | 'components' | 'frameworkComponents' +>; + +export interface ISplitviewComponent extends IDisposable { + readonly minimumSize: number; + readonly maximumSize: number; + readonly height: number; + readonly width: number; + readonly length: number; + readonly orientation: Orientation; + readonly onDidAddView: Event; + readonly onDidRemoveView: Event; + readonly onDidLayoutFromJSON: Event; + readonly panels: SplitviewPanel[]; + updateOptions(options: Partial): void; + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel; + layout(width: number, height: number): void; + onDidLayoutChange: Event; + toJSON(): SerializedSplitview; + fromJSON(serializedSplitview: SerializedSplitview): void; + focus(): void; + getPanel(id: string): ISplitviewPanel | undefined; + removePanel(panel: ISplitviewPanel, sizing?: Sizing): void; + setVisible(panel: ISplitviewPanel, visible: boolean): void; + movePanel(from: number, to: number): void; + clear(): void; +} + +/** + * A high-level implementation of splitview that works using 'panels' + */ +export class SplitviewComponent + extends CompositeDisposable + implements ISplitviewComponent +{ + private _disposable = new MutableDisposable(); + private _splitview!: Splitview; + private _activePanel: SplitviewPanel | undefined; + private _panels = new Map>(); + private _options: SplitviewComponentOptions; + + private readonly _onDidLayoutfromJSON = new Emitter(); + readonly onDidLayoutFromJSON: Event = this._onDidLayoutfromJSON.event; + + private readonly _onDidAddView = new Emitter(); + readonly onDidAddView = this._onDidAddView.event; + + private readonly _onDidRemoveView = new Emitter(); + readonly onDidRemoveView = this._onDidRemoveView.event; + + private readonly _onDidLayoutChange = new Emitter(); + readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; + + get panels(): SplitviewPanel[] { + return this.splitview.getViews(); + } + + get options(): SplitviewComponentOptions { + return this._options; + } + + get length(): number { + return this._panels.size; + } + + get orientation(): Orientation { + return this.splitview.orientation; + } + + get splitview(): Splitview { + return this._splitview; + } + + set splitview(value: Splitview) { + this._splitview = value; + + this._disposable.value = new CompositeDisposable( + this._splitview.onDidSashEnd(() => { + this._onDidLayoutChange.fire(undefined); + }), + this._splitview.onDidAddView((e) => this._onDidAddView.fire(e)), + this._splitview.onDidRemoveView((e) => + this._onDidRemoveView.fire(e) + ) + ); + } + + get minimumSize(): number { + return this.splitview.minimumSize; + } + + get maximumSize(): number { + return this.splitview.maximumSize; + } + + get height(): number { + return this.splitview.orientation === Orientation.HORIZONTAL + ? this.splitview.orthogonalSize + : this.splitview.size; + } + + get width(): number { + return this.splitview.orientation === Orientation.HORIZONTAL + ? this.splitview.size + : this.splitview.orthogonalSize; + } + + constructor( + private readonly element: HTMLElement, + options: SplitviewComponentOptions + ) { + super(); + + this._options = options; + + if (!options.components) { + options.components = {}; + } + if (!options.frameworkComponents) { + options.frameworkComponents = {}; + } + + this.splitview = new Splitview(this.element, options); + + this.addDisposables( + this._disposable, + this._onDidAddView, + this._onDidLayoutfromJSON, + this._onDidRemoveView, + this._onDidLayoutChange + ); + } + + updateOptions(options: Partial): void { + const hasOrientationChanged = + typeof options.orientation === 'string' && + this.options.orientation !== options.orientation; + + this._options = { ...this.options, ...options }; + + if (hasOrientationChanged) { + this.splitview.orientation = options.orientation!; + } + + this.splitview.layout( + this.splitview.size, + this.splitview.orthogonalSize + ); + } + + focus(): void { + this._activePanel?.focus(); + } + + movePanel(from: number, to: number): void { + this.splitview.moveView(from, to); + } + + setVisible(panel: SplitviewPanel, visible: boolean): void { + const index = this.panels.indexOf(panel); + this.splitview.setViewVisible(index, visible); + } + + setActive(view: SplitviewPanel, skipFocus?: boolean): void { + this._activePanel = view; + + this.panels + .filter((v) => v !== view) + .forEach((v) => { + v.api._onDidActiveChange.fire({ isActive: false }); + if (!skipFocus) { + v.focus(); + } + }); + view.api._onDidActiveChange.fire({ isActive: true }); + if (!skipFocus) { + view.focus(); + } + } + + removePanel(panel: SplitviewPanel, sizing?: Sizing): void { + const disposable = this._panels.get(panel.id); + + if (!disposable) { + throw new Error(`unknown splitview panel ${panel.id}`); + } + + disposable.disposable.dispose(); + disposable.value.dispose(); + + this._panels.delete(panel.id); + + const index = this.panels.findIndex((_) => _ === panel); + this.splitview.removeView(index, sizing); + + const panels = this.panels; + if (panels.length > 0) { + this.setActive(panels[panels.length - 1]); + } + } + + getPanel(id: string): SplitviewPanel | undefined { + return this.panels.find((view) => view.id === id); + } + + addPanel(options: AddSplitviewComponentOptions): ISplitviewPanel { + if (this._panels.has(options.id)) { + throw new Error(`panel ${options.id} already exists`); + } + + const view = createComponent( + options.id, + options.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper.createComponent, + } + : undefined + ); + + view.orientation = this.splitview.orientation; + + view.init({ + params: options.params || {}, + minimumSize: options.minimumSize, + maximumSize: options.maximumSize, + snap: options.snap, + priority: options.priority, + accessor: this, + }); + + const size: Sizing | number = + typeof options.size === 'number' ? options.size : Sizing.Distribute; + const index = + typeof options.index === 'number' ? options.index : undefined; + + this.splitview.addView(view, size, index); + + this.doAddView(view); + this.setActive(view); + + return view; + } + + layout(width: number, height: number): void { + const [size, orthogonalSize] = + this.splitview.orientation === Orientation.HORIZONTAL + ? [width, height] + : [height, width]; + this.splitview.layout(size, orthogonalSize); + } + + private doAddView(view: SplitviewPanel): void { + const disposable = view.api.onDidFocusChange((event) => { + if (!event.isFocused) { + return; + } + this.setActive(view, true); + }); + + this._panels.set(view.id, { disposable, value: view }); + } + + toJSON(): SerializedSplitview { + const views: SerializedSplitviewPanel[] = this.splitview + .getViews() + .map((view, i) => { + const size = this.splitview.getViewSize(i); + return { + size, + data: view.toJSON(), + snap: !!view.snap, + priority: view.priority, + }; + }); + + return { + views, + activeView: this._activePanel?.id, + size: this.splitview.size, + orientation: this.splitview.orientation, + }; + } + + fromJSON(serializedSplitview: SerializedSplitview): void { + this.clear(); + + const { views, orientation, size, activeView } = serializedSplitview; + + const queue: Function[] = []; + + this.splitview = new Splitview(this.element, { + orientation, + proportionalLayout: this.options.proportionalLayout, + descriptor: { + size, + views: views.map((view) => { + const data = view.data; + + if (this._panels.has(data.id)) { + throw new Error(`panel ${data.id} already exists`); + } + + const panel = createComponent( + data.id, + data.component, + this.options.components || {}, + this.options.frameworkComponents || {}, + this.options.frameworkWrapper + ? { + createComponent: + this.options.frameworkWrapper + .createComponent, + } + : undefined + ); + + queue.push(() => { + panel.init({ + params: data.params || {}, + minimumSize: data.minimumSize, + maximumSize: data.maximumSize, + snap: view.snap, + priority: view.priority, + accessor: this, + }); + }); + + panel.orientation = orientation; + + this.doAddView(panel); + setTimeout(() => { + // the original onDidAddView events are missed since they are fired before we can subcribe to them + this._onDidAddView.fire(panel); + }, 0); + + return { size: view.size, view: panel }; + }), + }, + }); + + this.layout(this.width, this.height); + + queue.forEach((f) => f()); + + if (typeof activeView === 'string') { + const panel = this.getPanel(activeView); + if (panel) { + this.setActive(panel); + } + } + + this._onDidLayoutfromJSON.fire(); + } + + clear(): void { + for (const [_, value] of this._panels.entries()) { + value.disposable.dispose(); + value.value.dispose(); + } + this._panels.clear(); + this.splitview.dispose(); + } + + dispose(): void { + for (const [_, value] of this._panels.entries()) { + value.disposable.dispose(); + value.value.dispose(); + } + this._panels.clear(); + + this.splitview.dispose(); + + super.dispose(); + } +} diff --git a/build/packages/dockview/src/splitview/splitviewPanel.ts b/build/packages/dockview/src/splitview/splitviewPanel.ts new file mode 100644 index 000000000..459cea825 --- /dev/null +++ b/build/packages/dockview/src/splitview/splitviewPanel.ts @@ -0,0 +1,169 @@ +import { ISerializableView, PanelViewInitParameters } from './core/options'; +import { + BasePanelView, + BasePanelViewExported, +} from '../gridview/basePanelView'; +import { SplitviewPanelApiImpl } from '../api/splitviewPanelApi'; +import { LayoutPriority, Orientation } from './core/splitview'; +import { FunctionOrValue } from '../types'; +import { Emitter, Event } from '../events'; + +export interface ISplitviewPanel + extends BasePanelViewExported { + readonly priority: LayoutPriority | undefined; + readonly minimumSize: number; + readonly maximumSize: number; + readonly snap: boolean; + readonly orientation: Orientation; +} + +export abstract class SplitviewPanel + extends BasePanelView + implements ISerializableView, ISplitviewPanel +{ + private _evaluatedMinimumSize = 0; + private _evaluatedMaximumSize = Number.POSITIVE_INFINITY; + + private _minimumSize: FunctionOrValue = 0; + private _maximumSize: FunctionOrValue = Number.POSITIVE_INFINITY; + private _priority?: LayoutPriority; + private _snap = false; + + private _orientation?: Orientation; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + get priority(): LayoutPriority | undefined { + return this._priority; + } + + set orientation(value: Orientation) { + this._orientation = value; + } + + get orientation(): Orientation { + return this._orientation!; + } + + get minimumSize(): number { + const size = + typeof this._minimumSize === 'function' + ? this._minimumSize() + : this._minimumSize; + + if (size !== this._evaluatedMinimumSize) { + this._evaluatedMinimumSize = size; + this.updateConstraints(); + } + + return size; + } + + get maximumSize(): number { + const size = + typeof this._maximumSize === 'function' + ? this._maximumSize() + : this._maximumSize; + + if (size !== this._evaluatedMaximumSize) { + this._evaluatedMaximumSize = size; + this.updateConstraints(); + } + + return size; + } + + get snap(): boolean { + return this._snap; + } + + constructor(id: string, componentName: string) { + super(id, componentName, new SplitviewPanelApiImpl(id)); + + this.addDisposables( + this._onDidChange, + this.api.onVisibilityChange((event) => { + const { isVisible } = event; + const { accessor } = this._params as PanelViewInitParameters; + accessor.setVisible(this, isVisible); + }), + this.api.onActiveChange(() => { + const { accessor } = this._params as PanelViewInitParameters; + accessor.setActive(this); + }), + this.api.onDidConstraintsChangeInternal((event) => { + if ( + typeof event.minimumSize === 'number' || + typeof event.minimumSize === 'function' + ) { + this._minimumSize = event.minimumSize; + } + if ( + typeof event.maximumSize === 'number' || + typeof event.maximumSize === 'function' + ) { + this._maximumSize = event.maximumSize; + } + this.updateConstraints(); + }), + this.api.onDidSizeChange((event) => { + this._onDidChange.fire(event.size); + }) + ); + } + + setVisible(isVisible: boolean): void { + this.api._onDidVisibilityChange.fire({ isVisible }); + } + + setActive(isActive: boolean): void { + this.api._onDidActiveChange.fire({ isActive }); + } + + layout(size: number, orthogonalSize: number): void { + const [width, height] = + this.orientation === Orientation.HORIZONTAL + ? [size, orthogonalSize] + : [orthogonalSize, size]; + super.layout(width, height); + } + + init(parameters: PanelViewInitParameters): void { + super.init(parameters); + + this._priority = parameters.priority; + + if (parameters.minimumSize) { + this._minimumSize = parameters.minimumSize; + } + if (parameters.maximumSize) { + this._maximumSize = parameters.maximumSize; + } + if (parameters.snap) { + this._snap = parameters.snap; + } + } + + toJSON() { + const maximum = (value: number) => + value === Number.MAX_SAFE_INTEGER || + value === Number.POSITIVE_INFINITY + ? undefined + : value; + const minimum = (value: number) => (value <= 0 ? undefined : value); + + return { + ...super.toJSON(), + minimumSize: minimum(this.minimumSize), + maximumSize: maximum(this.maximumSize), + }; + } + + private updateConstraints(): void { + this.api._onDidConstraintsChange.fire({ + maximumSize: this._evaluatedMaximumSize, + minimumSize: this._evaluatedMinimumSize, + }); + } +} diff --git a/build/packages/dockview/src/theme.scss b/build/packages/dockview/src/theme.scss new file mode 100644 index 000000000..c574a64a4 --- /dev/null +++ b/build/packages/dockview/src/theme.scss @@ -0,0 +1,84 @@ +@mixin dockview-theme-core-mixin { + --dv-paneview-active-outline-color: dodgerblue; + --dv-tabs-and-actions-container-font-size: 13px; + --dv-tabs-and-actions-container-height: 35px; + --dv-tab-close-icon: url('data:image/svg+xml;utf8,'); + --dv-drag-over-background-color: rgba(83, 89, 93, 0.5); + --dv-drag-over-border-color: white; + --dv-tabs-container-scrollbar-color: #888; +} + +@mixin dockview-theme-dark-mixin { + @include dockview-theme-core-mixin(); + // + --dv-group-view-background-color: #1e1e1e; + // + --dv-tabs-and-actions-container-background-color: #252526; + // + --dv-activegroup-visiblepanel-tab-background-color: #1e1e1e; + --dv-activegroup-hiddenpanel-tab-background-color: #2d2d2d; + --dv-inactivegroup-visiblepanel-tab-background-color: #1e1e1e; + --dv-inactivegroup-hiddenpanel-tab-background-color: #2d2d2d; + --dv-tab-divider-color: #1e1e1e; + // + --dv-activegroup-visiblepanel-tab-color: white; + --dv-activegroup-hiddenpanel-tab-color: #969696; + --dv-inactivegroup-visiblepanel-tab-color: #8f8f8f; + --dv-inactivegroup-hiddenpanel-tab-color: #626262; + // + --dv-separator-border: rgb(68, 68, 68); + --dv-paneview-header-border-color: rgba(204, 204, 204, 0.2); +} + +@mixin dockview-theme-light-mixin { + @include dockview-theme-core-mixin(); + // + --dv-group-view-background-color: white; + // + --dv-tabs-and-actions-container-background-color: #f3f3f3; + // + --dv-activegroup-visiblepanel-tab-background-color: white; + --dv-activegroup-hiddenpanel-tab-background-color: #ececec; + --dv-inactivegroup-visiblepanel-tab-background-color: white; + --dv-inactivegroup-hiddenpanel-tab-background-color: #ececec; + --dv-tab-divider-color: white; + // + --dv-activegroup-visiblepanel-tab-color: rgb(51, 51, 51); + --dv-activegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.7); + --dv-inactivegroup-visiblepanel-tab-color: rgba(51, 51, 51, 0.7); + --dv-inactivegroup-hiddenpanel-tab-color: rgba(51, 51, 51, 0.35); + // + --dv-separator-border: rgba(128, 128, 128, 0.35); + --dv-paneview-header-border-color: rgb(51, 51, 51); +} + +.dockview-theme-dark { + @include dockview-theme-dark-mixin(); +} + +.dockview-theme-light { + @include dockview-theme-light-mixin(); +} + +.dockview-theme-vs { + @include dockview-theme-dark-mixin(); + + --dv-activegroup-visiblepanel-tab-background-color: dodgerblue; + --dv-tabs-and-actions-container-height: 18px; + --dv-tabs-and-actions-container-font-size: 11px; + + .groupview { + &.active-group { + > .tabs-and-actions-container { + border-bottom: 2px solid + var(--dv-activegroup-visiblepanel-tab-background-color); + } + } + &.inactive-group { + > .tabs-and-actions-container { + border-bottom: 2px solid + var(--dv-inactivegroup-visiblepanel-tab-background-color); + } + } + } +} diff --git a/build/packages/dockview/src/types.ts b/build/packages/dockview/src/types.ts new file mode 100644 index 000000000..1da2a8a10 --- /dev/null +++ b/build/packages/dockview/src/types.ts @@ -0,0 +1,9 @@ +export interface Constructor { + new (): T; +} + +export interface FrameworkFactory { + createComponent: (id: string, componentId: string, component: any) => T; +} + +export type FunctionOrValue = (() => T) | T; diff --git a/build/packages/dockview/tsconfig.esm.json b/build/packages/dockview/tsconfig.esm.json new file mode 100644 index 000000000..b48538b62 --- /dev/null +++ b/build/packages/dockview/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "../../module-build/tsconfig.esm.json", + "compilerOptions": { + "outDir": "dist/esm", + "tsBuildInfoFile": ".build/tsconfig.tsbuildinfo.esm", + "jsx": "react", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["**/node_modules", "src/__tests__"] +} diff --git a/build/packages/dockview/tsconfig.json b/build/packages/dockview/tsconfig.json new file mode 100644 index 000000000..9ff78cef1 --- /dev/null +++ b/build/packages/dockview/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../module-build/tsconfig.json", + "compilerOptions": { + "outDir": "dist/cjs", + "tsBuildInfoFile": ".build/tsconfig.tsbuildinfo.cjs", + "jsx": "react", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["**/node_modules", "src/__tests__"] +} \ No newline at end of file diff --git a/build/packages/dockview/typedoc.json b/build/packages/dockview/typedoc.json new file mode 100644 index 000000000..9ab13c458 --- /dev/null +++ b/build/packages/dockview/typedoc.json @@ -0,0 +1,7 @@ +{ + "out": "typedocs", + "entryPoints": ["./src/index.ts"], + "exclude": ["**/_test/**/*.*", "**/index.ts"], + "excludeExternals": true, + "excludePrivate": true +} diff --git a/build/scripts/build.js b/build/scripts/build.js new file mode 100644 index 000000000..36f2d6c88 --- /dev/null +++ b/build/scripts/build.js @@ -0,0 +1,15 @@ +const gulp = require('gulp'); +const gulpSass = require('gulp-dart-sass'); +const concat = require('gulp-concat'); + +const init = () => { + gulp.task('sass', () => { + return gulp + .src('./src/**/*.scss') + .pipe(gulpSass().on('error', gulpSass.logError)) + .pipe(concat('dockview.css')) + .pipe(gulp.dest('./dist/styles/')); + }); +}; + +module.exports = { init }; diff --git a/build/scripts/package-docs.js b/build/scripts/package-docs.js new file mode 100644 index 000000000..11ac3cf51 --- /dev/null +++ b/build/scripts/package-docs.js @@ -0,0 +1,8 @@ +const fs = require('fs-extra'); +const path = require('path'); + +const output = path.join(__dirname, '../'); + +const docsDir = path.join(__dirname, '../docs/build'); + +fs.copySync(docsDir, path.join(output, 'docs')); diff --git a/build/scripts/package.js b/build/scripts/package.js new file mode 100644 index 000000000..9b0238063 --- /dev/null +++ b/build/scripts/package.js @@ -0,0 +1,15 @@ +const fs = require('fs-extra'); +const path = require('path'); + +const output = path.join(__dirname, '../output'); + +const docsDir = path.join(__dirname, '../packages/dockview/typedocs'); +const webpackAppDir = path.join(__dirname, '../packages/dockview-demo/dist'); +// const storybookAppDir = path.join( +// __dirname, +// '../packages/dockview-demo/storybook-static' +// ); + +fs.copySync(docsDir, path.join(output, 'typedocs')); +fs.copySync(webpackAppDir, path.join(output, 'build')); +// fs.copySync(storybookAppDir, path.join(output, 'storybook-static')); diff --git a/build/sonar-project.properties b/build/sonar-project.properties new file mode 100644 index 000000000..9ceed39eb --- /dev/null +++ b/build/sonar-project.properties @@ -0,0 +1,20 @@ +sonar.projectKey=mathuo_dockview +sonar.organization=dockview + +sonar.inclusions=packages/dockview/src/**/* +sonar.exclusions=packages/dockview/src/__tests__/** +sonar.tests=packages/dockview/src/__tests__ + +sonar.testExecutionReportPaths=test-report.xml +sonar.javascript.lcov.reportPaths=coverage/lcov.info + +# This is the name and version displayed in the SonarCloud UI. +#sonar.projectName=dockview +#sonar.projectVersion=1.0 + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +sonar.sources=packages + +# Encoding of the source code. Default is default system encoding +sonar.sourceEncoding=UTF-8 + diff --git a/build/tsconfig.eslint.json b/build/tsconfig.eslint.json new file mode 100644 index 000000000..4343d501d --- /dev/null +++ b/build/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "types": ["@types/node"], + "noEmit": true, + "allowJs": true + }, + "extends": "./module-build/tsconfig.esm.json", + "include": ["tests/**/*.ts", "tools/**/*.ts", ".eslintrc.js"] +} diff --git a/build/tsconfig.test.json b/build/tsconfig.test.json new file mode 100644 index 000000000..d58b7d79f --- /dev/null +++ b/build/tsconfig.test.json @@ -0,0 +1,22 @@ + +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2019", + "sourceMap": true, + "declaration": true, + "jsx": "react", + "noImplicitReturns": true, + "noImplicitAny": true, + "allowUnreachableCode": false, + "forceConsistentCasingInFileNames": true, + // "strict": true, + "strictBindCallApply": true, // pass + "alwaysStrict": true, // pass + "noImplicitThis": true, // pass + "strictFunctionTypes": true, // pass + "strictNullChecks": false, + "strictPropertyInitialization": false, + }, + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/build/yarn.lock b/build/yarn.lock new file mode 100644 index 000000000..210948cf5 --- /dev/null +++ b/build/yarn.lock @@ -0,0 +1,16352 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.17.10", "@babel/core@^7.7.5": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.17.10", "@babel/generator@^7.7.2": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz" + integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" + +"@babel/highlight@^7.16.7": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.17.6": + version "7.17.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz" + integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.6" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.12.12": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz" + integrity sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.9" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/plugin-syntax-decorators" "^7.17.0" + charcodes "^0.2.0" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-default-from@^7.12.1": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz" + integrity sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-default-from" "^7.16.7" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.17.3": + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== + dependencies: + "@babel/compat-data" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.12.1", "@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.17.0": + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz" + integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz" + integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.7", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz" + integrity sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz" + integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-flow-strip-types@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-flow" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz" + integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== + dependencies: + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.17.8": + version "7.17.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz" + integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.0" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.16.7": + version "7.17.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz" + integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz" + integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== + dependencies: + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typescript@^7.16.7": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.12.11": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.17.10" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-flow@^7.12.1": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.16.7.tgz" + integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-flow-strip-types" "^7.16.7" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.10": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.12.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" + +"@babel/register@^7.12.1": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.17.7.tgz" + integrity sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@eslint/eslintrc@^1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz" + integrity sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz" + integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + +"@jest/core@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.0.tgz" + integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g== + dependencies: + "@jest/console" "^28.1.0" + "@jest/reporters" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.0.2" + jest-config "^28.1.0" + jest-haste-map "^28.1.0" + jest-message-util "^28.1.0" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-resolve-dependencies "^28.1.0" + jest-runner "^28.1.0" + jest-runtime "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + jest-watcher "^28.1.0" + micromatch "^4.0.4" + pretty-format "^28.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.0.tgz" + integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA== + dependencies: + "@jest/fake-timers" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + jest-mock "^28.1.0" + +"@jest/expect-utils@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.0.tgz" + integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.0.tgz" + integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA== + dependencies: + expect "^28.1.0" + jest-snapshot "^28.1.0" + +"@jest/fake-timers@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.0.tgz" + integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg== + dependencies: + "@jest/types" "^28.1.0" + "@sinonjs/fake-timers" "^9.1.1" + "@types/node" "*" + jest-message-util "^28.1.0" + jest-mock "^28.1.0" + jest-util "^28.1.0" + +"@jest/globals@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.0.tgz" + integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/expect" "^28.1.0" + "@jest/types" "^28.1.0" + +"@jest/reporters@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.0.tgz" + integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@jridgewell/trace-mapping" "^0.3.7" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-util "^28.1.0" + jest-worker "^28.1.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.0" + +"@jest/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + +"@jest/source-map@^28.0.2": + version "28.0.2" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.0.2.tgz" + integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz" + integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ== + dependencies: + "@jest/console" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz" + integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ== + dependencies: + "@jest/test-result" "^28.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + slash "^3.0.0" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.0.tgz" + integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.0" + "@jridgewell/trace-mapping" "^0.3.7" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-regex-util "^28.0.2" + jest-util "^28.1.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.0": + version "28.1.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz" + integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.10" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.10.tgz" + integrity sha512-Q0YbBd6OTsXm8Y21+YUSDXupHnodNC2M4O18jtd3iwJ3+vMZNdKGols0a9G6JOK0dcJ3IdUUHoh908ZI6qhk8Q== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.3" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz" + integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== + +"@lerna/add@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz" + integrity sha512-cpmAH1iS3k8JBxNvnMqrGTTjbY/ZAiKa1ChJzFevMYY3eeqbvhsBKnBcxjRXtdrJ6bd3dCQM+ZtK+0i682Fhng== + dependencies: + "@lerna/bootstrap" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + npm-package-arg "^8.1.0" + p-map "^4.0.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/bootstrap@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-4.0.0.tgz" + integrity sha512-RkS7UbeM2vu+kJnHzxNRCLvoOP9yGNgkzRdy4UV2hNalD7EP41bLvRVOwRYQ7fhc2QcbhnKNdOBihYRL0LcKtw== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/has-npm-version" "4.0.0" + "@lerna/npm-install" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + get-port "^5.1.1" + multimatch "^5.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + read-package-tree "^5.3.1" + semver "^7.3.4" + +"@lerna/changed@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/changed/-/changed-4.0.0.tgz" + integrity sha512-cD+KuPRp6qiPOD+BO6S6SN5cARspIaWSOqGBpGnYzLb4uWT8Vk4JzKyYtc8ym1DIwyoFXHosXt8+GDAgR8QrgQ== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/check-working-tree@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-4.0.0.tgz" + integrity sha512-/++bxM43jYJCshBiKP5cRlCTwSJdRSxVmcDAXM+1oUewlZJVSVlnks5eO0uLxokVFvLhHlC5kHMc7gbVFPHv6Q== + dependencies: + "@lerna/collect-uncommitted" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/validation-error" "4.0.0" + +"@lerna/child-process@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-4.0.0.tgz" + integrity sha512-XtCnmCT9eyVsUUHx6y/CTBYdV9g2Cr/VxyseTWBgfIur92/YKClfEtJTbOh94jRT62hlKLqSvux/UhxXVh613Q== + dependencies: + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/clean@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/clean/-/clean-4.0.0.tgz" + integrity sha512-uugG2iN9k45ITx2jtd8nEOoAtca8hNlDCUM0N3lFgU/b1mEQYAPRkqr1qs4FLRl/Y50ZJ41wUz1eazS+d/0osA== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/rimraf-dir" "4.0.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + p-waterfall "^2.1.1" + +"@lerna/cli@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/cli/-/cli-4.0.0.tgz" + integrity sha512-Neaw3GzFrwZiRZv2g7g6NwFjs3er1vhraIniEs0jjVLPMNC4eata0na3GfE5yibkM/9d3gZdmihhZdZ3EBdvYA== + dependencies: + "@lerna/global-options" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + yargs "^16.2.0" + +"@lerna/collect-uncommitted@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-4.0.0.tgz" + integrity sha512-ufSTfHZzbx69YNj7KXQ3o66V4RC76ffOjwLX0q/ab//61bObJ41n03SiQEhSlmpP+gmFbTJ3/7pTe04AHX9m/g== + dependencies: + "@lerna/child-process" "4.0.0" + chalk "^4.1.0" + npmlog "^4.1.2" + +"@lerna/collect-updates@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-4.0.0.tgz" + integrity sha512-bnNGpaj4zuxsEkyaCZLka9s7nMs58uZoxrRIPJ+nrmrZYp1V5rrd+7/NYTuunOhY2ug1sTBvTAxj3NZQ+JKnOw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/describe-ref" "4.0.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + slash "^3.0.0" + +"@lerna/command@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/command/-/command-4.0.0.tgz" + integrity sha512-LM9g3rt5FsPNFqIHUeRwWXLNHJ5NKzOwmVKZ8anSp4e1SPrv2HNc1V02/9QyDDZK/w+5POXH5lxZUI1CHaOK/A== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/project" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/write-log-file" "4.0.0" + clone-deep "^4.0.1" + dedent "^0.7.0" + execa "^5.0.0" + is-ci "^2.0.0" + npmlog "^4.1.2" + +"@lerna/conventional-commits@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-4.0.0.tgz" + integrity sha512-CSUQRjJHFrH8eBn7+wegZLV3OrNc0Y1FehYfYGhjLE2SIfpCL4bmfu/ViYuHh9YjwHaA+4SX6d3hR+xkeseKmw== + dependencies: + "@lerna/validation-error" "4.0.0" + conventional-changelog-angular "^5.0.12" + conventional-changelog-core "^4.2.2" + conventional-recommended-bump "^6.1.0" + fs-extra "^9.1.0" + get-stream "^6.0.0" + lodash.template "^4.5.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + semver "^7.3.4" + +"@lerna/create-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-4.0.0.tgz" + integrity sha512-I0phtKJJdafUiDwm7BBlEUOtogmu8+taxq6PtIrxZbllV9hWg59qkpuIsiFp+no7nfRVuaasNYHwNUhDAVQBig== + dependencies: + cmd-shim "^4.1.0" + fs-extra "^9.1.0" + npmlog "^4.1.2" + +"@lerna/create@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/create/-/create-4.0.0.tgz" + integrity sha512-mVOB1niKByEUfxlbKTM1UNECWAjwUdiioIbRQZEeEabtjCL69r9rscIsjlGyhGWCfsdAG5wfq4t47nlDXdLLag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + globby "^11.0.2" + init-package-json "^2.0.2" + npm-package-arg "^8.1.0" + p-reduce "^2.1.0" + pacote "^11.2.6" + pify "^5.0.0" + semver "^7.3.4" + slash "^3.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + whatwg-url "^8.4.0" + yargs-parser "20.2.4" + +"@lerna/describe-ref@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-4.0.0.tgz" + integrity sha512-eTU5+xC4C5Gcgz+Ey4Qiw9nV2B4JJbMulsYJMW8QjGcGh8zudib7Sduj6urgZXUYNyhYpRs+teci9M2J8u+UvQ== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + +"@lerna/diff@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/diff/-/diff-4.0.0.tgz" + integrity sha512-jYPKprQVg41+MUMxx6cwtqsNm0Yxx9GDEwdiPLwcUTFx+/qKCEwifKNJ1oGIPBxyEHX2PFCOjkK39lHoj2qiag== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/validation-error" "4.0.0" + npmlog "^4.1.2" + +"@lerna/exec@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/exec/-/exec-4.0.0.tgz" + integrity sha512-VGXtL/b/JfY84NB98VWZpIExfhLOzy0ozm/0XaS4a2SmkAJc5CeUfrhvHxxkxiTBLkU+iVQUyYEoAT0ulQ8PCw== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/filter-options@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-4.0.0.tgz" + integrity sha512-vV2ANOeZhOqM0rzXnYcFFCJ/kBWy/3OA58irXih9AMTAlQLymWAK0akWybl++sUJ4HB9Hx12TOqaXbYS2NM5uw== + dependencies: + "@lerna/collect-updates" "4.0.0" + "@lerna/filter-packages" "4.0.0" + dedent "^0.7.0" + npmlog "^4.1.2" + +"@lerna/filter-packages@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-4.0.0.tgz" + integrity sha512-+4AJIkK7iIiOaqCiVTYJxh/I9qikk4XjNQLhE3kixaqgMuHl1NQ99qXRR0OZqAWB9mh8Z1HA9bM5K1HZLBTOqA== + dependencies: + "@lerna/validation-error" "4.0.0" + multimatch "^5.0.0" + npmlog "^4.1.2" + +"@lerna/get-npm-exec-opts@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-4.0.0.tgz" + integrity sha512-yvmkerU31CTWS2c7DvmAWmZVeclPBqI7gPVr5VATUKNWJ/zmVcU4PqbYoLu92I9Qc4gY1TuUplMNdNuZTSL7IQ== + dependencies: + npmlog "^4.1.2" + +"@lerna/get-packed@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-4.0.0.tgz" + integrity sha512-rfWONRsEIGyPJTxFzC8ECb3ZbsDXJbfqWYyeeQQDrJRPnEJErlltRLPLgC2QWbxFgFPsoDLeQmFHJnf0iDfd8w== + dependencies: + fs-extra "^9.1.0" + ssri "^8.0.1" + tar "^6.1.0" + +"@lerna/github-client@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/github-client/-/github-client-4.0.0.tgz" + integrity sha512-2jhsldZtTKXYUBnOm23Lb0Fx8G4qfSXF9y7UpyUgWUj+YZYd+cFxSuorwQIgk5P4XXrtVhsUesIsli+BYSThiw== + dependencies: + "@lerna/child-process" "4.0.0" + "@octokit/plugin-enterprise-rest" "^6.0.1" + "@octokit/rest" "^18.1.0" + git-url-parse "^11.4.4" + npmlog "^4.1.2" + +"@lerna/gitlab-client@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-4.0.0.tgz" + integrity sha512-OMUpGSkeDWFf7BxGHlkbb35T7YHqVFCwBPSIR6wRsszY8PAzCYahtH3IaJzEJyUg6vmZsNl0FSr3pdA2skhxqA== + dependencies: + node-fetch "^2.6.1" + npmlog "^4.1.2" + whatwg-url "^8.4.0" + +"@lerna/global-options@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/global-options/-/global-options-4.0.0.tgz" + integrity sha512-TRMR8afAHxuYBHK7F++Ogop2a82xQjoGna1dvPOY6ltj/pEx59pdgcJfYcynYqMkFIk8bhLJJN9/ndIfX29FTQ== + +"@lerna/has-npm-version@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-4.0.0.tgz" + integrity sha512-LQ3U6XFH8ZmLCsvsgq1zNDqka0Xzjq5ibVN+igAI5ccRWNaUsE/OcmsyMr50xAtNQMYMzmpw5GVLAivT2/YzCg== + dependencies: + "@lerna/child-process" "4.0.0" + semver "^7.3.4" + +"@lerna/import@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/import/-/import-4.0.0.tgz" + integrity sha512-FaIhd+4aiBousKNqC7TX1Uhe97eNKf5/SC7c5WZANVWtC7aBWdmswwDt3usrzCNpj6/Wwr9EtEbYROzxKH8ffg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/validation-error" "4.0.0" + dedent "^0.7.0" + fs-extra "^9.1.0" + p-map-series "^2.1.0" + +"@lerna/info@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/info/-/info-4.0.0.tgz" + integrity sha512-8Uboa12kaCSZEn4XRfPz5KU9XXoexSPS4oeYGj76s2UQb1O1GdnEyfjyNWoUl1KlJ2i/8nxUskpXIftoFYH0/Q== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/output" "4.0.0" + envinfo "^7.7.4" + +"@lerna/init@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/init/-/init-4.0.0.tgz" + integrity sha512-wY6kygop0BCXupzWj5eLvTUqdR7vIAm0OgyV9WHpMYQGfs1V22jhztt8mtjCloD/O0nEe4tJhdG62XU5aYmPNQ== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/command" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/link@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/link/-/link-4.0.0.tgz" + integrity sha512-KlvPi7XTAcVOByfaLlOeYOfkkDcd+bejpHMCd1KcArcFTwijOwXOVi24DYomIeHvy6HsX/IUquJ4PPUJIeB4+w== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/package-graph" "4.0.0" + "@lerna/symlink-dependencies" "4.0.0" + p-map "^4.0.0" + slash "^3.0.0" + +"@lerna/list@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/list/-/list-4.0.0.tgz" + integrity sha512-L2B5m3P+U4Bif5PultR4TI+KtW+SArwq1i75QZ78mRYxPc0U/piau1DbLOmwrdqr99wzM49t0Dlvl6twd7GHFg== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/listable" "4.0.0" + "@lerna/output" "4.0.0" + +"@lerna/listable@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/listable/-/listable-4.0.0.tgz" + integrity sha512-/rPOSDKsOHs5/PBLINZOkRIX1joOXUXEtyUs5DHLM8q6/RP668x/1lFhw6Dx7/U+L0+tbkpGtZ1Yt0LewCLgeQ== + dependencies: + "@lerna/query-graph" "4.0.0" + chalk "^4.1.0" + columnify "^1.5.4" + +"@lerna/log-packed@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-4.0.0.tgz" + integrity sha512-+dpCiWbdzgMAtpajLToy9PO713IHoE6GV/aizXycAyA07QlqnkpaBNZ8DW84gHdM1j79TWockGJo9PybVhrrZQ== + dependencies: + byte-size "^7.0.0" + columnify "^1.5.4" + has-unicode "^2.0.1" + npmlog "^4.1.2" + +"@lerna/npm-conf@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-4.0.0.tgz" + integrity sha512-uS7H02yQNq3oejgjxAxqq/jhwGEE0W0ntr8vM3EfpCW1F/wZruwQw+7bleJQ9vUBjmdXST//tk8mXzr5+JXCfw== + dependencies: + config-chain "^1.1.12" + pify "^5.0.0" + +"@lerna/npm-dist-tag@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-4.0.0.tgz" + integrity sha512-F20sg28FMYTgXqEQihgoqSfwmq+Id3zT23CnOwD+XQMPSy9IzyLf1fFVH319vXIw6NF6Pgs4JZN2Qty6/CQXGw== + dependencies: + "@lerna/otplease" "4.0.0" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + +"@lerna/npm-install@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-4.0.0.tgz" + integrity sha512-aKNxq2j3bCH3eXl3Fmu4D54s/YLL9WSwV8W7X2O25r98wzrO38AUN6AB9EtmAx+LV/SP15et7Yueg9vSaanRWg== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + fs-extra "^9.1.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + signal-exit "^3.0.3" + write-pkg "^4.0.0" + +"@lerna/npm-publish@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-4.0.0.tgz" + integrity sha512-vQb7yAPRo5G5r77DRjHITc9piR9gvEKWrmfCH7wkfBnGWEqu7n8/4bFQ7lhnkujvc8RXOsYpvbMQkNfkYibD/w== + dependencies: + "@lerna/otplease" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + fs-extra "^9.1.0" + libnpmpublish "^4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + pify "^5.0.0" + read-package-json "^3.0.0" + +"@lerna/npm-run-script@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-4.0.0.tgz" + integrity sha512-Jmyh9/IwXJjOXqKfIgtxi0bxi1pUeKe5bD3S81tkcy+kyng/GNj9WSqD5ZggoNP2NP//s4CLDAtUYLdP7CU9rA== + dependencies: + "@lerna/child-process" "4.0.0" + "@lerna/get-npm-exec-opts" "4.0.0" + npmlog "^4.1.2" + +"@lerna/otplease@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/otplease/-/otplease-4.0.0.tgz" + integrity sha512-Sgzbqdk1GH4psNiT6hk+BhjOfIr/5KhGBk86CEfHNJTk9BK4aZYyJD4lpDbDdMjIV4g03G7pYoqHzH765T4fxw== + dependencies: + "@lerna/prompt" "4.0.0" + +"@lerna/output@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/output/-/output-4.0.0.tgz" + integrity sha512-Un1sHtO1AD7buDQrpnaYTi2EG6sLF+KOPEAMxeUYG5qG3khTs2Zgzq5WE3dt2N/bKh7naESt20JjIW6tBELP0w== + dependencies: + npmlog "^4.1.2" + +"@lerna/pack-directory@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-4.0.0.tgz" + integrity sha512-NJrmZNmBHS+5aM+T8N6FVbaKFScVqKlQFJNY2k7nsJ/uklNKsLLl6VhTQBPwMTbf6Tf7l6bcKzpy7aePuq9UiQ== + dependencies: + "@lerna/get-packed" "4.0.0" + "@lerna/package" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + npm-packlist "^2.1.4" + npmlog "^4.1.2" + tar "^6.1.0" + temp-write "^4.0.0" + +"@lerna/package-graph@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-4.0.0.tgz" + integrity sha512-QED2ZCTkfXMKFoTGoccwUzjHtZMSf3UKX14A4/kYyBms9xfFsesCZ6SLI5YeySEgcul8iuIWfQFZqRw+Qrjraw== + dependencies: + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/validation-error" "4.0.0" + npm-package-arg "^8.1.0" + npmlog "^4.1.2" + semver "^7.3.4" + +"@lerna/package@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/package/-/package-4.0.0.tgz" + integrity sha512-l0M/izok6FlyyitxiQKr+gZLVFnvxRQdNhzmQ6nRnN9dvBJWn+IxxpM+cLqGACatTnyo9LDzNTOj2Db3+s0s8Q== + dependencies: + load-json-file "^6.2.0" + npm-package-arg "^8.1.0" + write-pkg "^4.0.0" + +"@lerna/prerelease-id-from-version@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-4.0.0.tgz" + integrity sha512-GQqguzETdsYRxOSmdFZ6zDBXDErIETWOqomLERRY54f4p+tk4aJjoVdd9xKwehC9TBfIFvlRbL1V9uQGHh1opg== + dependencies: + semver "^7.3.4" + +"@lerna/profiler@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/profiler/-/profiler-4.0.0.tgz" + integrity sha512-/BaEbqnVh1LgW/+qz8wCuI+obzi5/vRE8nlhjPzdEzdmWmZXuCKyWSEzAyHOJWw1ntwMiww5dZHhFQABuoFz9Q== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + upath "^2.0.1" + +"@lerna/project@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/project/-/project-4.0.0.tgz" + integrity sha512-o0MlVbDkD5qRPkFKlBZsXZjoNTWPyuL58564nSfZJ6JYNmgAptnWPB2dQlAc7HWRZkmnC2fCkEdoU+jioPavbg== + dependencies: + "@lerna/package" "4.0.0" + "@lerna/validation-error" "4.0.0" + cosmiconfig "^7.0.0" + dedent "^0.7.0" + dot-prop "^6.0.1" + glob-parent "^5.1.1" + globby "^11.0.2" + load-json-file "^6.2.0" + npmlog "^4.1.2" + p-map "^4.0.0" + resolve-from "^5.0.0" + write-json-file "^4.3.0" + +"@lerna/prompt@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/prompt/-/prompt-4.0.0.tgz" + integrity sha512-4Ig46oCH1TH5M7YyTt53fT6TuaKMgqUUaqdgxvp6HP6jtdak6+amcsqB8YGz2eQnw/sdxunx84DfI9XpoLj4bQ== + dependencies: + inquirer "^7.3.3" + npmlog "^4.1.2" + +"@lerna/publish@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/publish/-/publish-4.0.0.tgz" + integrity sha512-K8jpqjHrChH22qtkytA5GRKIVFEtqBF6JWj1I8dWZtHs4Jywn8yB1jQ3BAMLhqmDJjWJtRck0KXhQQKzDK2UPg== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/describe-ref" "4.0.0" + "@lerna/log-packed" "4.0.0" + "@lerna/npm-conf" "4.0.0" + "@lerna/npm-dist-tag" "4.0.0" + "@lerna/npm-publish" "4.0.0" + "@lerna/otplease" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/pack-directory" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/pulse-till-done" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + "@lerna/version" "4.0.0" + fs-extra "^9.1.0" + libnpmaccess "^4.0.1" + npm-package-arg "^8.1.0" + npm-registry-fetch "^9.0.0" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + pacote "^11.2.6" + semver "^7.3.4" + +"@lerna/pulse-till-done@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-4.0.0.tgz" + integrity sha512-Frb4F7QGckaybRhbF7aosLsJ5e9WuH7h0KUkjlzSByVycxY91UZgaEIVjS2oN9wQLrheLMHl6SiFY0/Pvo0Cxg== + dependencies: + npmlog "^4.1.2" + +"@lerna/query-graph@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-4.0.0.tgz" + integrity sha512-YlP6yI3tM4WbBmL9GCmNDoeQyzcyg1e4W96y/PKMZa5GbyUvkS2+Jc2kwPD+5KcXou3wQZxSPzR3Te5OenaDdg== + dependencies: + "@lerna/package-graph" "4.0.0" + +"@lerna/resolve-symlink@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-4.0.0.tgz" + integrity sha512-RtX8VEUzqT+uLSCohx8zgmjc6zjyRlh6i/helxtZTMmc4+6O4FS9q5LJas2uGO2wKvBlhcD6siibGt7dIC3xZA== + dependencies: + fs-extra "^9.1.0" + npmlog "^4.1.2" + read-cmd-shim "^2.0.0" + +"@lerna/rimraf-dir@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-4.0.0.tgz" + integrity sha512-QNH9ABWk9mcMJh2/muD9iYWBk1oQd40y6oH+f3wwmVGKYU5YJD//+zMiBI13jxZRtwBx0vmBZzkBkK1dR11cBg== + dependencies: + "@lerna/child-process" "4.0.0" + npmlog "^4.1.2" + path-exists "^4.0.0" + rimraf "^3.0.2" + +"@lerna/run-lifecycle@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-4.0.0.tgz" + integrity sha512-IwxxsajjCQQEJAeAaxF8QdEixfI7eLKNm4GHhXHrgBu185JcwScFZrj9Bs+PFKxwb+gNLR4iI5rpUdY8Y0UdGQ== + dependencies: + "@lerna/npm-conf" "4.0.0" + npm-lifecycle "^3.1.5" + npmlog "^4.1.2" + +"@lerna/run-topologically@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-4.0.0.tgz" + integrity sha512-EVZw9hGwo+5yp+VL94+NXRYisqgAlj0jWKWtAIynDCpghRxCE5GMO3xrQLmQgqkpUl9ZxQFpICgYv5DW4DksQA== + dependencies: + "@lerna/query-graph" "4.0.0" + p-queue "^6.6.2" + +"@lerna/run@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/run/-/run-4.0.0.tgz" + integrity sha512-9giulCOzlMPzcZS/6Eov6pxE9gNTyaXk0Man+iCIdGJNMrCnW7Dme0Z229WWP/UoxDKg71F2tMsVVGDiRd8fFQ== + dependencies: + "@lerna/command" "4.0.0" + "@lerna/filter-options" "4.0.0" + "@lerna/npm-run-script" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/profiler" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/timer" "4.0.0" + "@lerna/validation-error" "4.0.0" + p-map "^4.0.0" + +"@lerna/symlink-binary@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-4.0.0.tgz" + integrity sha512-zualodWC4q1QQc1pkz969hcFeWXOsVYZC5AWVtAPTDfLl+TwM7eG/O6oP+Rr3fFowspxo6b1TQ6sYfDV6HXNWA== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/package" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + +"@lerna/symlink-dependencies@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-4.0.0.tgz" + integrity sha512-BABo0MjeUHNAe2FNGty1eantWp8u83BHSeIMPDxNq0MuW2K3CiQRaeWT3EGPAzXpGt0+hVzBrA6+OT0GPn7Yuw== + dependencies: + "@lerna/create-symlink" "4.0.0" + "@lerna/resolve-symlink" "4.0.0" + "@lerna/symlink-binary" "4.0.0" + fs-extra "^9.1.0" + p-map "^4.0.0" + p-map-series "^2.1.0" + +"@lerna/timer@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/timer/-/timer-4.0.0.tgz" + integrity sha512-WFsnlaE7SdOvjuyd05oKt8Leg3ENHICnvX3uYKKdByA+S3g+TCz38JsNs7OUZVt+ba63nC2nbXDlUnuT2Xbsfg== + +"@lerna/validation-error@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-4.0.0.tgz" + integrity sha512-1rBOM5/koiVWlRi3V6dB863E1YzJS8v41UtsHgMr6gB2ncJ2LsQtMKlJpi3voqcgh41H8UsPXR58RrrpPpufyw== + dependencies: + npmlog "^4.1.2" + +"@lerna/version@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/version/-/version-4.0.0.tgz" + integrity sha512-otUgiqs5W9zGWJZSCCMRV/2Zm2A9q9JwSDS7s/tlKq4mWCYriWo7+wsHEA/nPTMDyYyBO5oyZDj+3X50KDUzeA== + dependencies: + "@lerna/check-working-tree" "4.0.0" + "@lerna/child-process" "4.0.0" + "@lerna/collect-updates" "4.0.0" + "@lerna/command" "4.0.0" + "@lerna/conventional-commits" "4.0.0" + "@lerna/github-client" "4.0.0" + "@lerna/gitlab-client" "4.0.0" + "@lerna/output" "4.0.0" + "@lerna/prerelease-id-from-version" "4.0.0" + "@lerna/prompt" "4.0.0" + "@lerna/run-lifecycle" "4.0.0" + "@lerna/run-topologically" "4.0.0" + "@lerna/validation-error" "4.0.0" + chalk "^4.1.0" + dedent "^0.7.0" + load-json-file "^6.2.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + p-map "^4.0.0" + p-pipe "^3.1.0" + p-reduce "^2.1.0" + p-waterfall "^2.1.1" + semver "^7.3.4" + slash "^3.0.0" + temp-write "^4.0.0" + write-json-file "^4.3.0" + +"@lerna/write-log-file@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-4.0.0.tgz" + integrity sha512-XRG5BloiArpXRakcnPHmEHJp+4AtnhRtpDIHSghmXD5EichI1uD73J7FgPp30mm2pDRq3FdqB0NbwSEsJ9xFQg== + dependencies: + npmlog "^4.1.2" + write-file-atomic "^3.0.3" + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/react@^2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.1.1.tgz" + integrity sha512-7zlZDf5xmWH8I0kFE4DG91COOkxjaW9DX5f1HWztZpFcVua2gJgMYfIkFaDpO/DH/tWi6Mz+OheW4194r15igg== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/ci-detect@^1.0.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz" + integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/git@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz" + integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6": + version "1.0.7" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz" + integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.8.2": + version "1.8.6" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz" + integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@octokit/auth-token@^2.4.4": + version "2.5.0" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz" + integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.5.1": + version "3.6.0" + resolved "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz" + integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.6.3" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.12" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.8.0" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz" + integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== + dependencies: + "@octokit/request" "^5.6.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^11.2.0": + version "11.2.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz" + integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== + +"@octokit/plugin-enterprise-rest@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== + +"@octokit/plugin-paginate-rest@^2.16.8": + version "2.17.0" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz" + integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== + dependencies: + "@octokit/types" "^6.34.0" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^5.12.0": + version "5.13.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz" + integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== + dependencies: + "@octokit/types" "^6.34.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": + version "5.6.3" + resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz" + integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.1.0" + "@octokit/types" "^6.16.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@^18.1.0": + version "18.12.0" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz" + integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== + dependencies: + "@octokit/core" "^3.5.1" + "@octokit/plugin-paginate-rest" "^2.16.8" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": + version "6.34.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz" + integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== + dependencies: + "@octokit/openapi-types" "^11.2.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.5" + resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.5.tgz" + integrity sha512-RbG7h6TuP6nFFYKJwbcToA1rjC1FyPg25NR2noAZ0vKI+la01KTSRPkuVPE+U88jXv7javx2JHglUcL1MHcshQ== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.8.1" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@rollup/plugin-typescript@^8.3.2": + version "8.3.2" + resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.2.tgz" + integrity sha512-MtgyR5LNHZr3GyN0tM7gNO9D0CS+Y+vflS4v/PHmrX17JCkHUYKvQ5jN5o3cz1YKllM3duXUqu3yOHwMPUxhDg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + resolve "^1.17.0" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@sinclair/typebox@^0.23.3": + version "0.23.5" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^9.1.1": + version "9.1.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@storybook/addon-actions@6.5.0-beta.6", "@storybook/addon-actions@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.5.0-beta.6.tgz" + integrity sha512-c6jsGANLY/xAuH8W6+N7R8UTO42vYF/jCWnMO9uNckmAf3cQ3M3mM9JsLTy7uhWo7Ojaq3OH3XZf5itCCiEQyg== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + polished "^4.2.2" + prop-types "^15.7.2" + react-inspector "^5.1.0" + regenerator-runtime "^0.13.7" + telejson "^5.3.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + uuid-browser "^3.1.0" + +"@storybook/addon-backgrounds@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.5.0-beta.6.tgz" + integrity sha512-SgNLuPc+YEmpyvobj6PaNrYyrcFK8HwiB9Wv6LLxJh43mrVz50cogedj6O6QBliwZW9waxQdKyodRSkAB9YG/Q== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + global "^4.4.0" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-controls@6.5.0-beta.6", "@storybook/addon-controls@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.5.0-beta.6.tgz" + integrity sha512-DNOKmnqAQnvKgT+0bD3T9wOF9cdeK9oDYFvO8FlBfvITZmnXMHYWM/P9I0VzeEKURzkrNG+TocGfc7kl/jEYtw== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/store" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + lodash "^4.17.21" + ts-dedent "^2.0.0" + +"@storybook/addon-docs@6.5.0-beta.6", "@storybook/addon-docs@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.5.0-beta.6.tgz" + integrity sha512-2ONPCVe4Gd9H8RQ7LvFYRpqiXAq1GBnqpgYlAG84kCJv+0HRFl717bbWKZYNDvplIQYIVvLAa9X6FSiP6xrZLA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@jest/transform" "^26.6.2" + "@mdx-js/react" "^1.6.22" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/docs-tools" "6.5.0-beta.6" + "@storybook/mdx1-csf" canary + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/postinstall" "6.5.0-beta.6" + "@storybook/preview-web" "6.5.0-beta.6" + "@storybook/source-loader" "6.5.0-beta.6" + "@storybook/store" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + babel-loader "^8.0.0" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + regenerator-runtime "^0.13.7" + remark-external-links "^8.0.0" + remark-slug "^6.0.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-essentials@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.5.0-beta.6.tgz" + integrity sha512-rsuoUgbpxfJZNw55vghW+Ol9SixSg5AIr0IpD9ddLRXd678UlGZrqVLAxFXV44DJ7RvAixpbkEFKZKLvXOPRwQ== + dependencies: + "@storybook/addon-actions" "6.5.0-beta.6" + "@storybook/addon-backgrounds" "6.5.0-beta.6" + "@storybook/addon-controls" "6.5.0-beta.6" + "@storybook/addon-docs" "6.5.0-beta.6" + "@storybook/addon-measure" "6.5.0-beta.6" + "@storybook/addon-outline" "6.5.0-beta.6" + "@storybook/addon-toolbars" "6.5.0-beta.6" + "@storybook/addon-viewport" "6.5.0-beta.6" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + +"@storybook/addon-links@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.5.0-beta.6.tgz" + integrity sha512-Qh/HLg00kvb0td/jyfeMYyH/DNIN1Fo8gEg1A1Fbn2v97j9YgGV2TejR9MKjjf489RvIBMIQ0oKmLT83humx8w== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/router" "6.5.0-beta.6" + "@types/qs" "^6.9.5" + core-js "^3.8.2" + global "^4.4.0" + prop-types "^15.7.2" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + +"@storybook/addon-measure@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.5.0-beta.6.tgz" + integrity sha512-PF3vhhKW5wUDnD54uK5maWAXSbNX91HHCTYhTaiRL+uszbG7a2YeMVvhQ5hiz14GVFP+6Vq+jqnmLWV9DoTlNw== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + core-js "^3.8.2" + global "^4.4.0" + +"@storybook/addon-outline@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.5.0-beta.6.tgz" + integrity sha512-GtcCHOUrhhFS/fEakYzlmCj5ccKv8HGM9Di1JCG9fpiFgqaSmqprtnK+GNwN6SQyOPqPHiBBnSO3DefAG/Yt4g== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + +"@storybook/addon-storysource@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-6.5.0-beta.6.tgz" + integrity sha512-StN4uOzLgx8ztH4v0UoWAB2Ccw+aZZZypLoRL/fyAdLLv4cPNoXTW6O4CGQ2aagNFlTafG2qUvWh/c5kaytIFA== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/router" "6.5.0-beta.6" + "@storybook/source-loader" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + estraverse "^5.2.0" + loader-utils "^2.0.0" + prop-types "^15.7.2" + react-syntax-highlighter "^15.4.5" + regenerator-runtime "^0.13.7" + +"@storybook/addon-toolbars@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.5.0-beta.6.tgz" + integrity sha512-EKvP/9ww9IJJp9o+bfOBGKav2Lx0P9KPrqXLP3aOo9anu5DthZi+iexRu7H41zx8C9eAdkRxpq2WZh+E9lCigg== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + +"@storybook/addon-viewport@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.5.0-beta.6.tgz" + integrity sha512-uRxfsxUuPKeB/GO5CpfCD7K7FT59ZN+qPdGHTgB4lfEuwpD22q/9QUHhUftEO0JS10J+5Wryha+x/aKx55f7fQ== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + global "^4.4.0" + memoizerific "^1.11.3" + prop-types "^15.7.2" + regenerator-runtime "^0.13.7" + +"@storybook/addons@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.0-beta.6.tgz" + integrity sha512-iVBPe+9utfqwVngc4h2JRGcKBuBn15Mgtb74ROP8Hehg4LcX7ohiOaPsuJvjNk2DofMr5x0EHVWrzNjCOYa8mw== + dependencies: + "@storybook/api" "6.5.0-beta.6" + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/router" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + regenerator-runtime "^0.13.7" + +"@storybook/api@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/api/-/api-6.5.0-beta.6.tgz" + integrity sha512-yLYXpCufax2psVvPKmqnkGro8SpTbk546YtxobeosgIZ+pImUqjErspeGgYSo6cVrZ88N9lm3sAt+vz+6jUN6g== + dependencies: + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/router" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + telejson "^5.3.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/builder-webpack4@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.5.0-beta.6.tgz" + integrity sha512-hxj9VrtQzJscA8w5OBMHLDBMwapQ6+N+QRNUmb/o1dozPwMQfKY7U1hgv8h2S0I05n/SexuUbasuPGlPYkKjzQ== + dependencies: + "@babel/core" "^7.12.10" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/channel-postmessage" "6.5.0-beta.6" + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/preview-web" "6.5.0-beta.6" + "@storybook/router" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@storybook/store" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + "@storybook/ui" "6.5.0-beta.6" + "@types/node" "^14.0.10 || ^16.0.0" + "@types/webpack" "^4.41.26" + autoprefixer "^9.8.6" + babel-loader "^8.0.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + core-js "^3.8.2" + css-loader "^3.6.0" + file-loader "^6.2.0" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^4.1.6" + glob "^7.1.6" + glob-promise "^3.4.0" + global "^4.4.0" + html-webpack-plugin "^4.0.0" + pnp-webpack-plugin "1.6.4" + postcss "^7.0.36" + postcss-flexbugs-fixes "^4.2.1" + postcss-loader "^4.2.0" + raw-loader "^4.0.2" + stable "^0.1.8" + style-loader "^1.3.0" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-filter-warnings-plugin "^1.2.1" + webpack-hot-middleware "^2.25.1" + webpack-virtual-modules "^0.2.2" + +"@storybook/builder-webpack5@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.5.0-beta.6.tgz" + integrity sha512-IEOG9+EVWOgof+3OaoECR5a+d8rMcYd+L8ZsqTSmUpiMm/PprZQHCRoaxfeOLjRSqPa5PGapEP0/tbaFOGJuuQ== + dependencies: + "@babel/core" "^7.12.10" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/channel-postmessage" "6.5.0-beta.6" + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/preview-web" "6.5.0-beta.6" + "@storybook/router" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@storybook/store" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + "@types/node" "^14.0.10 || ^16.0.0" + babel-loader "^8.0.0" + babel-plugin-named-exports-order "^0.0.2" + browser-assert "^1.2.1" + case-sensitive-paths-webpack-plugin "^2.3.0" + core-js "^3.8.2" + css-loader "^5.0.1" + fork-ts-checker-webpack-plugin "^6.0.4" + glob "^7.1.6" + glob-promise "^3.4.0" + html-webpack-plugin "^5.0.0" + path-browserify "^1.0.1" + process "^0.11.10" + stable "^0.1.8" + style-loader "^2.0.0" + terser-webpack-plugin "^5.0.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "^5.9.0" + webpack-dev-middleware "^4.1.0" + webpack-hot-middleware "^2.25.1" + webpack-virtual-modules "^0.4.1" + +"@storybook/channel-postmessage@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.5.0-beta.6.tgz" + integrity sha512-mvcc74nJMX6dQAZ+KGyTnF6AJ4HR01Ni09ZwDUi4pvOVRAYrWD+BfwYMkXb8TVOzu13eJIxZdxFB57nc5rCwVQ== + dependencies: + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + core-js "^3.8.2" + global "^4.4.0" + qs "^6.10.0" + telejson "^5.3.3" + +"@storybook/channel-websocket@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.5.0-beta.6.tgz" + integrity sha512-iJe+Br+oJTBpRtp0ySTocbhq9SVEX7O7I1aBbmB5bQ8NrGR8FOfQAFgKZeW5bnGE75W1sK9sh+zo3nawn1Vsag== + dependencies: + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + core-js "^3.8.2" + global "^4.4.0" + telejson "^5.3.3" + +"@storybook/channels@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.0-beta.6.tgz" + integrity sha512-3h+WuMeAuPmrVD7GbjMdmgrZMmjj2MHu9tTok7S2gjvy7R+I0wXR4ECZRcmtU/8IOu0lgphiPtmkQMN+gbGf5w== + dependencies: + core-js "^3.8.2" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-api@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.5.0-beta.6.tgz" + integrity sha512-mdzUmHAxPadbinpRYyZx/bQgOINkiOVLIY42etQlJp7EkDMjZnfF24qNoKV5e7gOgQAMAD2mzDfOGJ/9FmMAhw== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/channel-postmessage" "6.5.0-beta.6" + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/store" "6.5.0-beta.6" + "@types/qs" "^6.9.5" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + store2 "^2.12.0" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/client-logger@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.0-beta.6.tgz" + integrity sha512-/zg4LqGGx85t/Fj5CYziUOt3F5EaYqUUglVKKfvE3k4ke+8LcZoB42OMPFqv1E6COT7DePCIztWLcBStcdwYFg== + dependencies: + core-js "^3.8.2" + global "^4.4.0" + +"@storybook/components@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/components/-/components-6.5.0-beta.6.tgz" + integrity sha512-GGyfu25SUq1JFCRf5ggxuiSMYsohPgQEJB7x0ZFHC4ZUBMuYuYLbWeL4h3JhcuOvqEiXs1mvpaXLEYBYPc+ZQQ== + dependencies: + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/theming" "6.5.0-beta.6" + "@types/react-syntax-highlighter" "11.0.5" + core-js "^3.8.2" + react-syntax-highlighter "^15.4.5" + regenerator-runtime "^0.13.7" + +"@storybook/core-client@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.5.0-beta.6.tgz" + integrity sha512-U/xRR9MKdn3kvm9C8OmmoeSghpdEuMItjjXgn1W/3FRcivReI56Z73tsWQ9vWNZG0acGIFexlKROZKpVl7U0ew== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/channel-postmessage" "6.5.0-beta.6" + "@storybook/channel-websocket" "6.5.0-beta.6" + "@storybook/client-api" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/preview-web" "6.5.0-beta.6" + "@storybook/store" "6.5.0-beta.6" + "@storybook/ui" "6.5.0-beta.6" + airbnb-js-shims "^2.2.1" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.21" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + +"@storybook/core-common@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.5.0-beta.6.tgz" + integrity sha512-TMeSjo1Gu71cJ92X/KYaVJFLOpY2DQ4mTjjOsz2kmflQBn02zc4iYTfYI8V/9pIHdADXsvCV4d6k45MVaS5szA== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" + "@babel/plugin-proposal-export-default-from" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-private-property-in-object" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" + "@babel/register" "^7.12.1" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@types/node" "^14.0.10 || ^16.0.0" + "@types/pretty-hrtime" "^1.0.0" + babel-loader "^8.0.0" + babel-plugin-macros "^3.0.1" + babel-plugin-polyfill-corejs3 "^0.1.0" + chalk "^4.1.0" + core-js "^3.8.2" + express "^4.17.1" + file-system-cache "^1.0.5" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.0.4" + fs-extra "^9.0.1" + glob "^7.1.6" + handlebars "^4.7.7" + interpret "^2.2.0" + json5 "^2.1.3" + lazy-universal-dotenv "^3.0.1" + picomatch "^2.3.0" + pkg-dir "^5.0.0" + pretty-hrtime "^1.0.3" + resolve-from "^5.0.0" + slash "^3.0.0" + telejson "^5.3.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "4" + +"@storybook/core-events@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.0-beta.6.tgz" + integrity sha512-cl7gSa3yDmJgBfL2H6i0SndgWUigzw8BG/a2oIZe2+3kRD9/LEMmyFqHGvzVb4jnlV3B1MjjiwrTNXLog9QoJw== + dependencies: + core-js "^3.8.2" + +"@storybook/core-server@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.5.0-beta.6.tgz" + integrity sha512-5pV7HrmkvtBQ3TCtZY8EdLqWXStWzYu2zPs9rxA1VlJUO4vzfw7Gx5iSVFTPSCcA963ZJ15WYEtS5t+aBzwj/A== + dependencies: + "@discoveryjs/json-ext" "^0.5.3" + "@storybook/builder-webpack4" "6.5.0-beta.6" + "@storybook/core-client" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/csf-tools" "6.5.0-beta.6" + "@storybook/manager-webpack4" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@storybook/store" "6.5.0-beta.6" + "@storybook/telemetry" "6.5.0-beta.6" + "@types/node" "^14.0.10 || ^16.0.0" + "@types/node-fetch" "^2.5.7" + "@types/pretty-hrtime" "^1.0.0" + "@types/webpack" "^4.41.26" + better-opn "^2.1.1" + boxen "^5.1.2" + chalk "^4.1.0" + cli-table3 "^0.6.1" + commander "^6.2.1" + compression "^1.7.4" + core-js "^3.8.2" + cpy "^8.1.2" + detect-port "^1.3.0" + express "^4.17.1" + fs-extra "^9.0.1" + global "^4.4.0" + globby "^11.0.2" + ip "^1.1.5" + lodash "^4.17.21" + node-fetch "^2.6.7" + open "^8.4.0" + pretty-hrtime "^1.0.3" + prompts "^2.4.0" + regenerator-runtime "^0.13.7" + serve-favicon "^2.5.0" + slash "^3.0.0" + telejson "^5.3.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + watchpack "^2.2.0" + webpack "4" + ws "^8.2.3" + x-default-browser "^0.4.0" + +"@storybook/core@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/core/-/core-6.5.0-beta.6.tgz" + integrity sha512-fMyq1Lt4+7tmcmrHy8xx4z5ed+BhRwVuldLElfnfSzvQKIEpPw005nELjUDKFiBEIcoyxYQrCM4+j0KFZGCuDg== + dependencies: + "@storybook/core-client" "6.5.0-beta.6" + "@storybook/core-server" "6.5.0-beta.6" + +"@storybook/csf-tools@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.5.0-beta.6.tgz" + integrity sha512-JXukl7g1x95LR9ZHxf/9oX+H+nJpYT0QqWAOQOscJ9/+KylIPE0rK5fxON2IKUmMRDvy6FlXA3lvfZFa8mFZow== + dependencies: + "@babel/core" "^7.12.10" + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@babel/traverse" "^7.12.11" + "@babel/types" "^7.12.11" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/mdx1-csf" canary + core-js "^3.8.2" + fs-extra "^9.0.1" + global "^4.4.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + +"@storybook/csf@0.0.2--canary.4566f4d.1": + version "0.0.2--canary.4566f4d.1" + resolved "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz" + integrity sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ== + dependencies: + lodash "^4.17.15" + +"@storybook/docs-tools@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-6.5.0-beta.6.tgz" + integrity sha512-NfjRjRL5D2e/Jk8LdWJ43fwEmzidNDBVG/hc3Pt3F4b69/KOsINFRMR5SrRm8n7rlrhhCJofEcJMFYY8+Ofwxw== + dependencies: + "@babel/core" "^7.12.10" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/store" "6.5.0-beta.6" + core-js "^3.8.2" + doctrine "^3.0.0" + lodash "^4.17.21" + regenerator-runtime "^0.13.7" + +"@storybook/manager-webpack4@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.5.0-beta.6.tgz" + integrity sha512-uHc999yu+itIxFRsYC2wIK6wDwMM2dxuUVhNBAPWjyjwkU4gBDp1qa2Zkw8szJVC60PpGJMtj1xSSMumEwLI4Q== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/core-client" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + "@storybook/ui" "6.5.0-beta.6" + "@types/node" "^14.0.10 || ^16.0.0" + "@types/webpack" "^4.41.26" + babel-loader "^8.0.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + chalk "^4.1.0" + core-js "^3.8.2" + css-loader "^3.6.0" + express "^4.17.1" + file-loader "^6.2.0" + find-up "^5.0.0" + fs-extra "^9.0.1" + html-webpack-plugin "^4.0.0" + node-fetch "^2.6.7" + pnp-webpack-plugin "1.6.4" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + style-loader "^1.3.0" + telejson "^5.3.3" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-virtual-modules "^0.2.2" + +"@storybook/manager-webpack5@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.5.0-beta.6.tgz" + integrity sha512-JTB1peasUTMhKQUaJyFT9R2fDiJ2cEsiG5Y0vUwmpJSGcuYmCJJg7JeqJfFchRmB6RgrHtW8vNY6xq9KBPUgGA== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/core-client" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/theming" "6.5.0-beta.6" + "@storybook/ui" "6.5.0-beta.6" + "@types/node" "^14.0.10 || ^16.0.0" + babel-loader "^8.0.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + chalk "^4.1.0" + core-js "^3.8.2" + css-loader "^5.0.1" + express "^4.17.1" + find-up "^5.0.0" + fs-extra "^9.0.1" + html-webpack-plugin "^5.0.0" + node-fetch "^2.6.7" + process "^0.11.10" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + style-loader "^2.0.0" + telejson "^5.3.3" + terser-webpack-plugin "^5.0.3" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "^5.9.0" + webpack-dev-middleware "^4.1.0" + webpack-virtual-modules "^0.4.1" + +"@storybook/mdx1-csf@canary": + version "0.0.1-canary.1.867dcd5.0" + resolved "https://registry.yarnpkg.com/@storybook/mdx1-csf/-/mdx1-csf-0.0.1-canary.1.867dcd5.0.tgz#e8739a7451a557292977d83bfb7475986a8013b6" + integrity sha512-VnlE825M9SpjyJCPLCXbo+RbvqllsqXqRDCouzHKSpCE3Q79KR7MMURBsJo/vrTG1zeNG68Z4TZrLAu6IoyYaA== + dependencies: + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/preset-env" "^7.12.11" + "@babel/types" "^7.12.11" + "@mdx-js/mdx" "^1.6.22" + "@types/lodash" "^4.14.167" + js-string-escape "^1.0.1" + loader-utils "^2.0.0" + lodash "^4.17.21" + prettier ">=2.2.1 <=2.3.0" + ts-dedent "^2.0.0" + +"@storybook/node-logger@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.5.0-beta.6.tgz" + integrity sha512-ytx8rfmzVMf1cvzJKGo/npLYEwyjp1weX9BrVo1+9kXn3bWJoPl4c5UhJZVjNc1PXqerCOMmiMSKVlYHam2LQg== + dependencies: + "@types/npmlog" "^4.1.2" + chalk "^4.1.0" + core-js "^3.8.2" + npmlog "^5.0.1" + pretty-hrtime "^1.0.3" + +"@storybook/postinstall@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.5.0-beta.6.tgz" + integrity sha512-hP9oS/0BQsNnQN3Ekd2XF6ADQ7IgYf4zN8c7h4Zji/Z3Lh4FTOwaWUog28c+QdlQlvyg92kwE8a2oiRK9ARvkg== + dependencies: + core-js "^3.8.2" + +"@storybook/preview-web@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.5.0-beta.6.tgz" + integrity sha512-UXc6B7qXc2F3pABz9/WvG97NGjU7VP+0b2xPj89wXMAmvpyCbUh/Gvr+rl9UR4YWBKDi4neJtT6t2sbXAYD7JA== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/channel-postmessage" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/store" "6.5.0-beta.6" + ansi-to-html "^0.6.11" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.21" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" + +"@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0": + version "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0" + resolved "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0.tgz" + integrity sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w== + dependencies: + debug "^4.1.1" + endent "^2.0.1" + find-cache-dir "^3.3.1" + flat-cache "^3.0.4" + micromatch "^4.0.2" + react-docgen-typescript "^2.1.1" + tslib "^2.0.0" + +"@storybook/react@^6.5.0-beta.0": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/react/-/react-6.5.0-beta.6.tgz" + integrity sha512-xFBb9K+cwMYgi0fOFRR2dgexoSZ8Z1Z6WvJAn5I8kOJCv53+1c3nzuAK85tS5a0ZgZfnm5l8j1NYuVWVIuWczQ== + dependencies: + "@babel/preset-flow" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@storybook/addons" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + "@storybook/docs-tools" "6.5.0-beta.6" + "@storybook/node-logger" "6.5.0-beta.6" + "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0" + "@storybook/semver" "^7.3.2" + "@storybook/store" "6.5.0-beta.6" + "@types/estree" "^0.0.51" + "@types/node" "^14.14.20 || ^16.0.0" + "@types/webpack-env" "^1.16.0" + acorn "^7.4.1" + acorn-jsx "^5.3.1" + acorn-walk "^7.2.0" + babel-plugin-add-react-displayname "^0.0.5" + babel-plugin-react-docgen "^4.2.1" + core-js "^3.8.2" + escodegen "^2.0.0" + fs-extra "^9.0.1" + global "^4.4.0" + html-tags "^3.1.0" + lodash "^4.17.21" + prop-types "^15.7.2" + react-element-to-jsx-string "^14.3.4" + react-refresh "^0.11.0" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack ">=4.43.0 <6.0.0" + +"@storybook/router@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/router/-/router-6.5.0-beta.6.tgz" + integrity sha512-6AdLHl0demrmFeLliGXN7u1JAISlWR9tddCxQF1Wo5G+NPvRQ7rGv28UUpanzcxvl6c3FnXAnqiBNSSt9yOV+Q== + dependencies: + "@storybook/client-logger" "6.5.0-beta.6" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + +"@storybook/semver@^7.3.2": + version "7.3.2" + resolved "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz" + integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg== + dependencies: + core-js "^3.6.5" + find-up "^4.1.0" + +"@storybook/source-loader@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.5.0-beta.6.tgz" + integrity sha512-/gYaWeU4XEHnDKKzFKI2CuAEcCbQO4/rhb17IskpEc89RVfJZwcC1folS157wTvi9iCrpqVQqDDRnqNQSzZdVQ== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + core-js "^3.8.2" + estraverse "^5.2.0" + global "^4.4.0" + loader-utils "^2.0.0" + lodash "^4.17.21" + prettier ">=2.2.1 <=2.3.0" + regenerator-runtime "^0.13.7" + +"@storybook/store@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/store/-/store-6.5.0-beta.6.tgz" + integrity sha512-JU6hHxNGLIOyK7ymDFMi2BmSpmzyxUqUnLek+SGCUwRLcUo+Ya3kMzVsT7d6v/R0BI/PT08sxiq8dxMzUyqhMA== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/csf" "0.0.2--canary.4566f4d.1" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + regenerator-runtime "^0.13.7" + slash "^3.0.0" + stable "^0.1.8" + synchronous-promise "^2.0.15" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/telemetry@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-6.5.0-beta.6.tgz" + integrity sha512-DDjj/TfbAfqg6a2+QHidHItrNn+fzK02g4HQOOVyd+bPJz+XEWHQzT/XTrsCXAG2WxHmCuaq7fdBSgJiTXa/AQ== + dependencies: + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/core-common" "6.5.0-beta.6" + chalk "^4.1.0" + core-js "^3.8.2" + detect-package-manager "^2.0.1" + fetch-retry "^5.0.2" + fs-extra "^9.0.1" + global "^4.4.0" + isomorphic-unfetch "^3.1.0" + nanoid "^3.3.1" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + +"@storybook/theming@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.0-beta.6.tgz" + integrity sha512-jFMS8/xVz6EHMPpJutxmrJMpVDBuRQDiNT/JVfCsh5LQiwuviTbbv/0qte7A0ATG+vIGeCPFi9vm0tre/LuWfQ== + dependencies: + "@storybook/client-logger" "6.5.0-beta.6" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + +"@storybook/ui@6.5.0-beta.6": + version "6.5.0-beta.6" + resolved "https://registry.npmjs.org/@storybook/ui/-/ui-6.5.0-beta.6.tgz" + integrity sha512-S8b72CCZA2C2/hoB97+wA7HkDRKyE4koErsayFwhPG32O+vg6D0vJCD/g0uYeNq01U/r6E+Yn35vAmWSqcOEXw== + dependencies: + "@storybook/addons" "6.5.0-beta.6" + "@storybook/api" "6.5.0-beta.6" + "@storybook/channels" "6.5.0-beta.6" + "@storybook/client-logger" "6.5.0-beta.6" + "@storybook/components" "6.5.0-beta.6" + "@storybook/core-events" "6.5.0-beta.6" + "@storybook/router" "6.5.0-beta.6" + "@storybook/semver" "^7.3.2" + "@storybook/theming" "6.5.0-beta.6" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + +"@testing-library/dom@^8.13.0", "@testing-library/dom@^8.5.0": + version "8.13.0" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz" + integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/react@^13.2.0": + version "13.2.0" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-13.2.0.tgz" + integrity sha512-Bprbz/SZVONCJy5f7hcihNCv313IJXdYiv0nSJklIs1SQCIHHNlnGNkosSXnGZTmesyGIcBGNppYhXcc11pb7g== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.17.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@*", "@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/is-function@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz" + integrity sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^27.5.0": + version "27.5.0" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.5.0.tgz" + integrity sha512-9RBFx7r4k+msyj/arpfaa0WOOEcaAZNmN+j80KFbFCoSqCJGHTz7YMAMGQW9Xmqm5w6l5c25vbSjMwlikJi5+g== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/jsdom@^16.2.4": + version "16.2.14" + resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.14.tgz" + integrity sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w== + dependencies: + "@types/node" "*" + "@types/parse5" "*" + "@types/tough-cookie" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/lodash@^4.14.167": + version "4.14.182" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.1.tgz" + integrity sha512-JPEv4iAl0I+o7g8yVWDwk30es8mfVrjkvh5UeVR2sYPpZCK44vrAPsbJpIS+rJAUxLgaSAMKTEH5Vn5qd9XsrQ== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@*", "@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node-fetch@^2.5.7": + version "2.6.1" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz" + integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*": + version "17.0.31" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.31.tgz" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + +"@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0": + version "16.11.33" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz" + integrity sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/npmlog@^4.1.2": + version "4.1.4" + resolved "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz" + integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@*": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prettier@^2.1.5": + version "2.6.0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz" + integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== + +"@types/pretty-hrtime@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz" + integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*", "@types/qs@^6.9.5": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.3": + version "18.0.3" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.3.tgz" + integrity sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ== + dependencies: + "@types/react" "*" + +"@types/react-syntax-highlighter@11.0.5": + version "11.0.5" + resolved "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz" + integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16", "@types/react@^18.0.9": + version "18.0.9" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.9.tgz" + integrity sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/uglify-js@*": + version "3.13.2" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz" + integrity sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q== + dependencies: + source-map "^0.6.1" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/webpack-env@^1.16.0": + version "1.16.4" + resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz" + integrity sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw== + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.26", "@types/webpack@^4.41.8": + version "4.41.32" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz" + integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz" + integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/type-utils" "5.22.0" + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.22.0.tgz" + integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ== + dependencies: + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz" + integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + +"@typescript-eslint/type-utils@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz" + integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA== + dependencies: + "@typescript-eslint/utils" "5.22.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.22.0.tgz" + integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw== + +"@typescript-eslint/typescript-estree@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz" + integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw== + dependencies: + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/visitor-keys" "5.22.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.22.0.tgz" + integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.22.0" + "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/typescript-estree" "5.22.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.22.0": + version "5.22.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz" + integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg== + dependencies: + "@typescript-eslint/types" "5.22.0" + eslint-visitor-keys "^3.0.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.5, abab@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1, acorn-walk@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1, acorn@^7.4.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz" + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + +address@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/address/-/address-1.2.0.tgz" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +airbnb-js-shims@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + array.prototype.flatmap "^1.2.1" + es5-shim "^4.5.13" + es6-shim "^0.35.5" + function.prototype.name "^1.1.0" + globalthis "^1.0.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0 || ^1.0.0" + object.getownpropertydescriptors "^2.0.3" + object.values "^1.1.0" + promise.allsettled "^1.0.0" + promise.prototype.finally "^3.1.0" + string.prototype.matchall "^4.0.0 || ^3.0.1" + string.prototype.padend "^3.0.0" + string.prototype.padstart "^3.0.0" + symbol.prototype.description "^1.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-html-community@0.0.8, ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-to-html@^0.6.11: + version "0.6.15" + resolved "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz" + integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ== + dependencies: + entities "^2.0.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz" + integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg= + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +argv@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz" + integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= + +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-each@^1.0.0, array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-includes@^3.0.3: + version "3.1.5" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.map@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz" + integrity sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@^0.14.2: + version "0.14.2" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.2" + resolved "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz" + integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^2.0.0" + stream-exhaust "^1.0.1" + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-jest@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz" + integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w== + dependencies: + "@jest/transform" "^28.1.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.0.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.0.0, babel-loader@^8.2.5: + version "8.2.5" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-add-react-displayname@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz" + integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz" + integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-exports-order@^0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz" + integrity sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw== + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.0: + version "0.1.7" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-plugin-react-docgen@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz" + integrity sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ== + dependencies: + ast-types "^0.14.2" + lodash "^4.17.15" + react-docgen "^5.0.0" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz" + integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ== + dependencies: + babel-plugin-jest-hoist "^28.0.2" + babel-preset-current-node-syntax "^1.0.0" + +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +before-after-hook@^2.2.0: + version "2.2.2" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz" + integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + +better-opn@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz" + integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA== + dependencies: + open "^7.0.3" + +big-integer@^1.6.7: + version "1.6.51" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.3.5, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +bplist-parser@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz" + integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= + dependencies: + big-integer "^1.6.7" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-assert@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz" + integrity sha1-mqpaKox0aFwq4Fv+Ru/WBvBowgA= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +byte-size@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz" + integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +c8@^7.6.0: + version "7.11.2" + resolved "https://registry.npmjs.org/c8/-/c8-7.11.2.tgz" + integrity sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^2.0.0" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.0" + istanbul-reports "^3.1.4" + rimraf "^3.0.2" + test-exclude "^6.0.0" + v8-to-istanbul "^9.0.0" + yargs "^16.2.0" + yargs-parser "^20.2.9" + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5, cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1, camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001332: + version "1.0.30001338" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz" + integrity sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +charcodes@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz" + integrity sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^2.0.0, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1, chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@^4.2.3: + version "4.2.4" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + +clean-css@^5.2.2: + version "5.3.0" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@^0.6.1: + version "0.6.2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +cmd-shim@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz" + integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== + dependencies: + mkdirp-infer-owner "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +codecov@^3.8.3: + version "3.8.3" + resolved "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz" + integrity sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA== + dependencies: + argv "0.0.2" + ignore-walk "3.0.4" + js-yaml "3.14.1" + teeny-request "7.1.1" + urlgrey "1.0.0" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +columnify@^1.5.4: + version "1.6.0" + resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== + dependencies: + strip-ansi "^6.0.1" + wcwidth "^1.0.0" + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@^1.0.0, concat-with-sourcemaps@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + +config-chain@^1.1.12: + version "1.1.13" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +conventional-changelog-angular@^5.0.12: + version "5.0.13" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-core@^4.2.2: + version "4.2.4" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz" + integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^5.0.0" + conventional-commits-parser "^3.2.0" + dateformat "^3.0.0" + get-pkg-repo "^4.0.0" + git-raw-commits "^2.0.8" + git-remote-origin-url "^2.0.0" + git-semver-tags "^4.1.1" + lodash "^4.17.15" + normalize-package-data "^3.0.0" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^4.0.0" + +conventional-changelog-preset-loader@^2.3.4: + version "2.3.4" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== + +conventional-changelog-writer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz" + integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== + dependencies: + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.2.0: + version "3.2.4" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +conventional-recommended-bump@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz" + integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^2.3.4" + conventional-commits-filter "^2.0.7" + conventional-commits-parser "^3.2.0" + git-raw-commits "^2.0.8" + git-semver-tags "^4.1.1" + meow "^8.0.0" + q "^1.5.1" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-props@^2.0.1: + version "2.0.5" + resolved "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz" + integrity sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw== + dependencies: + each-props "^1.3.2" + is-plain-object "^5.0.0" + +core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.8.1: + version "3.22.4" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz" + integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-js-pure@^3.8.1: + version "3.22.4" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.4.tgz" + integrity sha512-4iF+QZkpzIz0prAFuepmxwJ2h5t4agvE8WPYqs2mjLJMNNwJOnpch76w2Q7bUfCPEv/V7wpvOfog0w273M+ZSw== + +core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: + version "3.22.4" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.22.4.tgz" + integrity sha512-1uLykR+iOfYja+6Jn/57743gc9n73EWiOnSJJ4ba3B4fOEYDBv25MagmEZBxTp5cWq4b/KPx/l77zgsp28ju4w== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cp-file@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz" + integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== + dependencies: + graceful-fs "^4.1.2" + make-dir "^3.0.0" + nested-error-stacks "^2.0.0" + p-event "^4.1.0" + +cpy@^8.1.2: + version "8.1.2" + resolved "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz" + integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== + dependencies: + arrify "^2.0.1" + cp-file "^7.0.0" + globby "^9.2.0" + has-glob "^1.0.0" + junk "^3.1.0" + nested-error-stacks "^2.1.0" + p-all "^2.1.0" + p-filter "^2.1.0" + p-map "^3.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-declaration-sorter@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz" + integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== + +css-loader@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-loader@^5.0.1: + version "5.2.7" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-loader@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.7: + version "5.2.7" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz" + integrity sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.0" + postcss-discard-comments "^5.1.1" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.4" + postcss-merge-rules "^5.1.1" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.2" + postcss-minify-selectors "^5.2.0" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.1" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.1: + version "5.1.7" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz" + integrity sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg== + dependencies: + cssnano-preset-default "^5.2.7" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2: + version "3.0.11" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz" + integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.0.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.3.1: + version "10.3.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-browser-id@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-1.0.4.tgz" + integrity sha1-5Z0JpdFXuCi4dsJoFuYcPSosIDo= + dependencies: + bplist-parser "^0.1.0" + meow "^3.1.0" + untildify "^2.0.0" + +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-package-manager@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz" + integrity sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A== + dependencies: + execa "^5.1.1" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dezalgo@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz" + integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^8.0.0: + version "8.6.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.4.118: + version "1.4.137" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz" + integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +endent@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz" + integrity sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w== + dependencies: + dedent "^0.7.0" + fast-json-parse "^1.0.3" + objectorarray "^1.0.5" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.2: + version "5.9.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3, envinfo@^7.7.4: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.0.7" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz" + integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.0.tgz" + integrity sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.1" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2: + version "1.1.2" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.61" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz" + integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es5-shim@^4.5.13: + version "4.6.7" + resolved "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz" + integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== + +es6-iterator@^2.0.1, es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-shim@^0.35.5: + version "0.35.6" + resolved "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.6.tgz" + integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.15.0: + version "8.15.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz" + integrity sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA== + dependencies: + "@eslint/eslintrc" "^1.2.3" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-to-babel@^3.1.0: + version "3.2.1" + resolved "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz" + integrity sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg== + dependencies: + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" + c8 "^7.6.0" + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0, events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/expect/-/expect-28.1.0.tgz" + integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw== + dependencies: + "@jest/expect-utils" "^28.1.0" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + +express@^4.17.1, express@^4.17.3: + version "4.18.1" + resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-parse@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz" + integrity sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk= + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fetch-retry@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.2.tgz" + integrity sha512-57Hmu+1kc6pKFUGVIobT7qw3NeAzY/uNN26bSevERLVvf6VGFR/ooDCOFBHMNDgAxBiU2YJq1D0vFzc6U1DcPw== + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-system-cache@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz" + integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08= + dependencies: + bluebird "^3.3.5" + fs-extra "^0.30.0" + ramda "^0.21.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.15.0" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@^4.1.6: + version "4.1.6" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +fork-ts-checker-webpack-plugin@^6.0.4: + version "6.5.2" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generic-names@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz" + integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== + dependencies: + loader-utils "^3.2.0" + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-pkg-repo@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== + dependencies: + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" + through2 "^2.0.0" + yargs "^16.2.0" + +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@^2.0.8: + version "2.0.11" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== + dependencies: + meow "^8.0.0" + semver "^6.0.0" + +git-up@^4.0.0: + version "4.0.5" + resolved "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz" + integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== + dependencies: + is-ssh "^1.3.0" + parse-url "^6.0.0" + +git-url-parse@^11.4.4: + version "11.6.0" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz" + integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== + dependencies: + git-up "^4.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + dependencies: + ini "^1.3.2" + +github-slugger@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-promise@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz" + integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw== + dependencies: + "@types/glob" "*" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob-watcher@^5.0.3: + version "5.0.5" + resolved "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz" + integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + normalize-path "^3.0.0" + object.defaults "^1.1.0" + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.14.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.14.0.tgz" + integrity sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.2, globby@^11.0.4: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +gulp-cli@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.4.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.2.0" + yargs "^7.1.0" + +gulp-concat@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz" + integrity sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M= + dependencies: + concat-with-sourcemaps "^1.0.0" + through2 "^2.0.0" + vinyl "^2.0.0" + +gulp-dart-sass@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/gulp-dart-sass/-/gulp-dart-sass-1.0.2.tgz" + integrity sha512-8fLttA824mbuc0jRVlGs00zWYZXBckat6INawx5kp66Eqsz5srNWTA51t0mbfB4C8a/a/GZ9muYLwXGklgAHlw== + dependencies: + chalk "^2.3.0" + lodash.clonedeep "^4.3.2" + plugin-error "^1.0.1" + replace-ext "^1.0.0" + sass "^1.26.3" + strip-ansi "^4.0.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== + dependencies: + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + +hamt_plus@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz" + integrity sha1-4hwlKWjH4zsg9qGwlM2FeHomVgE= + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz" + integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= + dependencies: + is-glob "^3.0.0" + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^4.0.0: + version "4.5.2" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.20" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +html-webpack-plugin@^5.0.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + +http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@3.0.4, ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + +import-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.2, ini@^1.3.4: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +init-package-json@^2.0.2: + version "2.0.5" + resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz" + integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== + dependencies: + npm-package-arg "^8.1.5" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "^4.1.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^3.0.0" + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-absolute-url@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-dom@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-dom/-/is-dom-1.1.0.tgz" + integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.0.0, is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@5.0.0, is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.2, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-ssh@^1.3.0: + version "1.3.3" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz" + integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== + dependencies: + protocols "^1.1.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz" + integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +isomorphic-unfetch@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3, istanbul-reports@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterate-iterator@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz" + integrity sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw== + +iterate-value@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" + +jest-changed-files@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.0.2.tgz" + integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== + dependencies: + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.0.tgz" + integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/expect" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.0" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-runtime "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + pretty-format "^28.1.0" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.0.tgz" + integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ== + dependencies: + "@jest/core" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.0.tgz" + integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.0" + "@jest/types" "^28.1.0" + babel-jest "^28.1.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.0" + jest-environment-node "^28.1.0" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-runner "^28.1.0" + jest-util "^28.1.0" + jest-validate "^28.1.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.0.tgz" + integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.0.2" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + +jest-docblock@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.0.2.tgz" + integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.0.tgz" + integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg== + dependencies: + "@jest/types" "^28.1.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.0" + pretty-format "^28.1.0" + +jest-environment-jsdom@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.0.tgz" + integrity sha512-8n6P4xiDjNVqTWv6W6vJPuQdLx+ZiA3dbYg7YJ+DPzR+9B61K6pMVJrSs2IxfGRG4J7pyAUA5shQ9G0KEun78w== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/fake-timers" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/jsdom" "^16.2.4" + "@types/node" "*" + jest-mock "^28.1.0" + jest-util "^28.1.0" + jsdom "^19.0.0" + +jest-environment-node@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz" + integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/fake-timers" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + jest-mock "^28.1.0" + jest-util "^28.1.0" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-haste-map@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.0.tgz" + integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw== + dependencies: + "@jest/types" "^28.1.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.0" + jest-worker "^28.1.0" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz" + integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + +jest-matcher-utils@^27.0.0: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz" + integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.0" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" + +jest-message-util@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz" + integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.0.tgz" + integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz" + integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.0" + +jest-resolve@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.0.tgz" + integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.0" + jest-validate "^28.1.0" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.0.tgz" + integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w== + dependencies: + "@jest/console" "^28.1.0" + "@jest/environment" "^28.1.0" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.0.2" + jest-environment-node "^28.1.0" + jest-haste-map "^28.1.0" + jest-leak-detector "^28.1.0" + jest-message-util "^28.1.0" + jest-resolve "^28.1.0" + jest-runtime "^28.1.0" + jest-util "^28.1.0" + jest-watcher "^28.1.0" + jest-worker "^28.1.0" + source-map-support "0.5.13" + throat "^6.0.1" + +jest-runtime@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.0.tgz" + integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg== + dependencies: + "@jest/environment" "^28.1.0" + "@jest/fake-timers" "^28.1.0" + "@jest/globals" "^28.1.0" + "@jest/source-map" "^28.0.2" + "@jest/test-result" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.0" + jest-message-util "^28.1.0" + jest-mock "^28.1.0" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.0" + jest-snapshot "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.0.tgz" + integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.0" + "@jest/transform" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.0" + graceful-fs "^4.2.9" + jest-diff "^28.1.0" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.0" + jest-matcher-utils "^28.1.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + natural-compare "^1.4.0" + pretty-format "^28.1.0" + semver "^7.3.5" + +jest-sonar-reporter@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz" + integrity sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w== + dependencies: + xml "^1.0.1" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-util@^28.0.0, jest-util@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz" + integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== + dependencies: + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.0.tgz" + integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ== + dependencies: + "@jest/types" "^28.1.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.0" + +jest-watcher@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz" + integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA== + dependencies: + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.0" + string-length "^4.0.1" + +jest-worker@^26.2.1, jest-worker@^26.5.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.0.tgz" + integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/jest/-/jest-28.1.0.tgz" + integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg== + dependencies: + "@jest/core" "^28.1.0" + import-local "^3.0.2" + jest-cli "^28.1.0" + +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.14.1, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^19.0.0: + version "19.0.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" + integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== + dependencies: + abab "^2.0.5" + acorn "^8.5.0" + acorn-globals "^6.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.1" + decimal.js "^10.3.1" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^10.0.0" + ws "^8.2.3" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.2, json5@^2.1.3, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + +just-debounce@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz" + integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + +lazy-universal-dotenv@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz" + integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ== + dependencies: + "@babel/runtime" "^7.5.0" + app-root-dir "^1.0.2" + core-js "^3.0.4" + dotenv "^8.0.0" + dotenv-expand "^5.1.0" + +lazystream@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + +lerna@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/lerna/-/lerna-4.0.0.tgz" + integrity sha512-DD/i1znurfOmNJb0OBw66NmNqiM8kF6uIrzrJ0wGE3VNdzeOhz9ziWLYiRaZDGGwgbcjOo6eIfcx9O5Qynz+kg== + dependencies: + "@lerna/add" "4.0.0" + "@lerna/bootstrap" "4.0.0" + "@lerna/changed" "4.0.0" + "@lerna/clean" "4.0.0" + "@lerna/cli" "4.0.0" + "@lerna/create" "4.0.0" + "@lerna/diff" "4.0.0" + "@lerna/exec" "4.0.0" + "@lerna/import" "4.0.0" + "@lerna/info" "4.0.0" + "@lerna/init" "4.0.0" + "@lerna/link" "4.0.0" + "@lerna/list" "4.0.0" + "@lerna/publish" "4.0.0" + "@lerna/run" "4.0.0" + "@lerna/version" "4.0.0" + import-local "^3.0.2" + npmlog "^4.1.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +libnpmaccess@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz" + integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== + dependencies: + aproba "^2.0.0" + minipass "^3.1.1" + npm-package-arg "^8.1.2" + npm-registry-fetch "^11.0.0" + +libnpmpublish@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-4.0.2.tgz" + integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== + dependencies: + normalize-package-data "^3.0.2" + npm-package-arg "^8.1.2" + npm-registry-fetch "^11.0.0" + semver "^7.1.3" + ssri "^8.0.1" + +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lilconfig@^2.0.3, lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz" + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + +lodash.memoize@4.x, lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^8.0.9: + version "8.0.14" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz" + integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.0.5" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + +make-fetch-happen@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz" + integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +marked@^4.0.12: + version "4.0.15" + resolved "https://registry.npmjs.org/marked/-/marked-4.0.15.tgz" + integrity sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q== + +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz" + integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + +memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz" + integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo= + dependencies: + map-or-similar "^1.5.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.1.0: + version "3.7.0" + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.4: + version "7.2.4" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz" + integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + +mute-stream@0.0.8, mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanoid@^3.3.1, nanoid@^3.3.3: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.3, negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz" + integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-dir@^0.1.10: + version "0.1.17" + resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp@^5.0.2: + version "5.1.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz" + integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^6.0.1, normalize-url@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-lifecycle@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz" + integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^5.0.2" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: + version "8.1.5" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== + dependencies: + npm-install-checks "^4.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" + +npm-registry-fetch@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz" + integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== + dependencies: + make-fetch-happen "^9.0.1" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-registry-fetch@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz" + integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== + dependencies: + "@npmcli/ci-detect" "^1.0.0" + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.defaults@^1.0.0, object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.entries@^1.1.0: + version "1.1.5" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +"object.fromentries@^2.0.0 || ^1.0.0": + version "2.0.5" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.values@^1.1.0: + version "1.1.5" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +objectorarray@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz" + integrity sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.3: + version "7.4.2" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-all@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz" + integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== + dependencies: + p-map "^2.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-event@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map-series@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-pipe@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.1.0, p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +p-waterfall@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== + dependencies: + p-reduce "^2.0.0" + +pacote@^11.2.6: + version "11.3.5" + resolved "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz" + integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== + dependencies: + "@npmcli/git" "^2.1.0" + "@npmcli/installed-package-contents" "^1.0.6" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.8.2" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^11.0.0" + promise-retry "^2.0.1" + read-package-json-fast "^2.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.1.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3, param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-path@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz" + integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + qs "^6.9.4" + query-string "^6.13.8" + +parse-url@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz" + integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== + dependencies: + is-ssh "^1.3.0" + normalize-url "^6.1.0" + parse-path "^4.0.0" + protocols "^1.4.0" + +parse5@6.0.1, parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +polished@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz" + integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== + dependencies: + "@babel/runtime" "^7.17.8" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz" + integrity sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz" + integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-flexbugs-fixes@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-load-config@^3.0.0: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz" + integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" + +postcss-merge-longhand@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz" + integrity sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz" + integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz" + integrity sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz" + integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^4.0.0: + version "4.3.1" + resolved "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz" + integrity sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q== + dependencies: + generic-names "^4.0.0" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz" + integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.15, postcss@^8.4.13, postcss@^8.4.7: + version "8.4.13" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== + dependencies: + nanoid "^3.3.3" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +"prettier@>=2.2.1 <=2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.0: + version "28.1.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz" + integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-hrtime@^1.0.0, pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +prismjs@^1.27.0: + version "1.28.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +promise.allsettled@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz" + integrity sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ== + dependencies: + array.prototype.map "^1.0.4" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + iterate-value "^1.0.2" + +promise.prototype.finally@^3.1.0: + version "3.1.3" + resolved "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz" + integrity sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +promise.series@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz" + integrity sha1-LMfr6Vn8OmYZwEq029yeRS2GS70= + +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + +prop-types@^15.0.0, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.8" + resolved "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28, psl@^1.1.33: + version "1.8.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.10.3, qs@^6.10.0, qs@^6.9.4: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^6.13.8: + version "6.14.1" + resolved "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +ramda@^0.21.0: + version "0.21.0" + resolved "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz" + integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +react-docgen-typescript@^2.1.1: + version "2.2.2" + resolved "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz" + integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== + +react-docgen@^5.0.0: + version "5.4.0" + resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.0.tgz" + integrity sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ== + dependencies: + "@babel/core" "^7.7.5" + "@babel/generator" "^7.12.11" + "@babel/runtime" "^7.7.6" + ast-types "^0.14.2" + commander "^2.19.0" + doctrine "^3.0.0" + estree-to-babel "^3.1.0" + neo-async "^2.6.1" + node-dir "^0.1.10" + strip-indent "^3.0.0" + +react-dom@^18.1.0: + version "18.1.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.1.0.tgz" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.22.0" + +react-element-to-jsx-string@^14.3.4: + version "14.3.4" + resolved "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.4.tgz" + integrity sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg== + dependencies: + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "17.0.2" + +react-inspector@^5.1.0: + version "5.1.1" + resolved "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz" + integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg== + dependencies: + "@babel/runtime" "^7.0.0" + is-dom "^1.0.0" + prop-types "^15.0.0" + +react-is@17.0.2, react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.1.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-syntax-highlighter@^15.4.5: + version "15.5.0" + resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react@^18.1.0: + version "18.1.0" + resolved "https://registry.npmjs.org/react/-/react-18.1.0.tgz" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== + dependencies: + loose-envify "^1.1.0" + +read-cmd-shim@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz" + integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== + +read-package-json-fast@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-json@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-3.0.1.tgz" + integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^3.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-json@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.2.tgz" + integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^3.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-tree@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== + dependencies: + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +recoil@^0.7.2: + version "0.7.2" + resolved "https://registry.npmjs.org/recoil/-/recoil-0.7.2.tgz" + integrity sha512-OT4pI7FOUHcIoRtjsL5Lqq+lFFzQfir4MIbUkqyJ3nqv3WfBP1pHepyurqTsK5gw+T+I2R8+uOD28yH+Lg5o4g== + dependencies: + hamt_plus "1.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.4.1: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-external-links@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz" + integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== + dependencies: + extend "^3.0.0" + is-absolute-url "^3.0.0" + mdast-util-definitions "^4.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-slug@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz" + integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + +request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-postcss@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz" + integrity sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w== + dependencies: + chalk "^4.1.0" + concat-with-sourcemaps "^1.1.0" + cssnano "^5.0.1" + import-cwd "^3.0.0" + p-queue "^6.6.2" + pify "^5.0.0" + postcss-load-config "^3.0.0" + postcss-modules "^4.0.0" + promise.series "^0.2.0" + resolve "^1.19.0" + rollup-pluginutils "^2.8.2" + safe-identifier "^0.4.2" + style-inject "^0.3.0" + +rollup-plugin-terser@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^2.72.1: + version "2.72.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.72.1.tgz" + integrity sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA== + optionalDependencies: + fsevents "~2.3.2" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-identifier@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz" + integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@^1.26.3, sass@^1.51.0: + version "1.51.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz" + integrity sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.22.0: + version "0.22.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.22.0.tgz" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-favicon@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz" + integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shiki@^0.10.1: + version "0.10.1" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== + dependencies: + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slide@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== + dependencies: + agent-base "^6.0.2" + debug "4" + socks "^2.3.3" + +socks-proxy-agent@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz" + integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.3.3, socks@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz" + integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.2.0" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + +sort-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz" + integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== + dependencies: + is-plain-obj "^2.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16, source-map-support@~0.5.12, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz" + integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +store2@^2.12.0: + version "2.13.2" + resolved "https://registry.npmjs.org/store2/-/store2-2.13.2.tgz" + integrity sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-events@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz" + integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== + dependencies: + stubs "^3.0.0" + +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.7" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.padstart@^3.0.0: + version "3.1.3" + resolved "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.1.3.tgz" + integrity sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz" + integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= + +style-inject@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz" + integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== + +style-loader@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +symbol.prototype.description@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz" + integrity sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ== + dependencies: + call-bind "^1.0.2" + get-symbol-description "^1.0.0" + has-symbols "^1.0.2" + object.getownpropertydescriptors "^2.1.2" + +synchronous-promise@^2.0.15: + version "2.0.15" + resolved "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz" + integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^4.4.12: + version "4.4.19" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.0.2, tar@^6.1.0: + version "6.1.11" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +teeny-request@7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz" + integrity sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== + dependencies: + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + stream-events "^1.0.5" + uuid "^8.0.0" + +telejson@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz" + integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA== + dependencies: + "@types/is-function" "^1.0.0" + global "^4.4.0" + is-function "^1.0.2" + is-regex "^1.1.2" + is-symbol "^1.0.3" + isobject "^4.0.0" + lodash "^4.17.21" + memoizerific "^1.11.3" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +temp-write@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== + dependencies: + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.3.2" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3: + version "5.3.1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + dependencies: + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^4.1.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.0.0, terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: + version "5.13.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== + dependencies: + acorn "^8.5.0" + commander "^2.20.0" + source-map "~0.8.0-beta.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-dedent@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + +ts-jest@^28.0.2: + version "28.0.2" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.2.tgz" + integrity sha512-IOZMb3D0gx6IHO9ywPgiQxJ3Zl4ECylEFwoVpENB55aTn5sdO0Ptyx/7noNBxAaUff708RqQL4XBNxxOVjY0vQ== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^20.x" + +ts-loader@^9.3.0: + version "9.3.0" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.0.tgz" + integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/type/-/type-2.6.0.tgz" + integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typedoc@^0.22.15: + version "0.22.15" + resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz" + integrity sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q== + dependencies: + glob "^7.2.0" + lunr "^2.3.9" + marked "^4.0.12" + minimatch "^5.0.1" + shiki "^0.10.1" + +typescript@^4.6.4: + version "4.6.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +uglify-js@^3.1.4: + version "3.15.4" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz" + integrity sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA== + +uid-number@0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + +umask@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz" + integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + fast-levenshtein "^1.0.0" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz" + integrity sha1-F+soB5h/dpUunASF/DEdBqgmouA= + dependencies: + os-homedir "^1.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urlgrey@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz" + integrity sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w== + dependencies: + fast-url-parser "^1.1.3" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid-browser@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz" + integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz" + integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" + integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= + dependencies: + source-map "^0.5.1" + +vinyl@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +vscode-oniguruma@^1.6.1: + version "1.6.2" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz" + integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" + integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +watchpack@^2.2.0, watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-cli@^4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^3.7.3: + version "3.7.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-middleware@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz" + integrity sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w== + dependencies: + colorette "^1.2.2" + mem "^8.1.1" + memfs "^3.2.2" + mime-types "^2.1.30" + range-parser "^1.2.1" + schema-utils "^3.0.0" + +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + dependencies: + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.0: + version "4.9.0" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz" + integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-filter-warnings-plugin@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz" + integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg== + +webpack-hot-middleware@^2.25.1: + version "2.25.1" + resolved "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz" + integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== + dependencies: + ansi-html-community "0.0.8" + html-entities "^2.1.0" + querystring "^0.2.0" + strip-ansi "^6.0.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz" + integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== + dependencies: + debug "^3.0.0" + +webpack-virtual-modules@^0.4.1: + version "0.4.3" + resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.3.tgz" + integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw== + +webpack@4: + version "4.46.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +"webpack@>=4.43.0 <6.0.0", webpack@^5.72.0, webpack@^5.9.0: + version "5.72.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz" + integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.2" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" + integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.4.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0, wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" + +write-json-file@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz" + integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== + dependencies: + detect-indent "^6.0.0" + graceful-fs "^4.1.15" + is-plain-obj "^2.0.0" + make-dir "^3.0.0" + sort-keys "^4.0.0" + write-file-atomic "^3.0.0" + +write-pkg@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== + dependencies: + sort-keys "^2.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" + +ws@^8.2.3, ws@^8.4.2: + version "8.6.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== + +x-default-browser@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz" + integrity sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE= + optionalDependencies: + default-browser-id "^1.0.4" + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9, yargs-parser@^20.x: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs-parser@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz" + integrity sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA== + dependencies: + camelcase "^3.0.0" + object.assign "^4.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz" + integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yargs@^7.1.0: + version "7.1.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz" + integrity sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA== + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==