From 3bbe7f6dcbb8e347a2ccf976b7611997c39090fe Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Mon, 27 May 2024 11:56:05 +0800 Subject: [PATCH] feat: init --- CONTRIBUTING.zh-CN.md | 83 + .editorconfig | 9 + .gitattributes | 14 + .github/ISSUE_TEMPLATE/bug_report.yml | 102 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feaure_request.yml | 38 + .github/PULL_REQUEST_TEMPLATE.md | 82 + .github/PULL_REQUEST_TEMPLATE/pr_cn.md | 79 + .github/labeler.yml | 38 + .github/workflows/bug-server.yml | 44 + .github/workflows/label.yml | 21 + .github/workflows/pr-check.yml | 29 + .github/workflows/pre-release.yml | 70 + .github/workflows/release-changelog.yml | 67 + .github/workflows/release.yml | 117 + .github/workflows/stale.yml | 35 + .github/workflows/sync-main-to-develop.yml | 61 + .github/workflows/unit-test.yml | 42 + .gitignore | 98 + .lintstagedrc | 3 + .prettierignore | 26 + .prettierrc.js | 15 + .vscode/settings.json | 25 + CODE_OF_CONDUCT.md | 47 + CONTRIBUTING.md | 71 + LICENSE | 21 + README.md | 97 + README.zh-CN.md | 97 + common/autoinstallers/create/README.md | 12 + common/autoinstallers/create/package.json | 22 + common/autoinstallers/create/pnpm-lock.yaml | 4279 +++++ common/autoinstallers/create/src/cli.ts | 150 + common/autoinstallers/create/src/create.ts | 59 + common/autoinstallers/create/src/global.d.ts | 7 + common/autoinstallers/create/src/logger.ts | 15 + common/autoinstallers/create/src/template.ts | 61 + .../create/templates/library/.eslintrc.js | 7 + .../create/templates/library/README.md | 11 + .../templates/library/bundler.config.js | 7 + .../create/templates/library/package.json | 37 + .../create/templates/library/src/global.d.ts | 1 + .../create/templates/library/src/index.ts | 1 + .../create/templates/library/tsconfig.json | 10 + .../create/templates/library/vite/index.html | 13 + .../templates/library/vite/public/vite.svg | 1 + .../create/templates/library/vite/src/App.css | 42 + .../create/templates/library/vite/src/App.tsx | 31 + .../library/vite/src/assets/react.svg | 1 + .../templates/library/vite/src/index.css | 69 + .../templates/library/vite/src/main.tsx | 11 + .../templates/library/vite/src/vite-env.d.ts | 1 + .../templates/library/vite/tsconfig.json | 32 + .../templates/library/vite/tsconfig.node.json | 10 + .../templates/library/vite/vite.config.ts | 7 + common/autoinstallers/create/tsconfig.json | 109 + common/autoinstallers/lint/change-all.ts | 67 + common/autoinstallers/lint/commit-lint.js | 24 + .../autoinstallers/lint/commitlint.config.js | 24 + common/autoinstallers/lint/package.json | 22 + common/autoinstallers/lint/pnpm-lock.yaml | 4897 ++++++ common/autoinstallers/lint/prettier.ts | 44 + common/autoinstallers/lint/tsconfig.json | 46 + common/autoinstallers/run-script/package.json | 15 + .../autoinstallers/run-script/pnpm-lock.yaml | 3717 +++++ common/autoinstallers/run-script/run.ts | 27 + common/autoinstallers/run-script/start.ts | 27 + .../autoinstallers/run-script/tsconfig.json | 46 + common/config/rush/.npmrc | 22 + common/config/rush/.npmrc-publish | 21 + common/config/rush/.pnpmfile.cjs | 38 + common/config/rush/artifactory.json | 109 + common/config/rush/build-cache.json | 100 + common/config/rush/command-line.json | 191 + common/config/rush/common-versions.json | 62 + common/config/rush/experiments.json | 50 + common/config/rush/pnpm-config.json | 205 + common/config/rush/pnpm-lock.yaml | 11854 ++++++++++++++ common/config/rush/repo-state.json | 4 + common/config/rush/rush-plugins.json | 29 + common/config/rush/version-policies.json | 1 + common/git-hooks/commit-msg | 3 + common/git-hooks/pre-commit | 37 + common/git-hooks/pre-push | 3 + common/scripts/apply-prerelease-version.js | 18 + common/scripts/get-package-json.js | 8 + common/scripts/install-run-rush-pnpm.js | 28 + common/scripts/install-run-rush.js | 214 + common/scripts/install-run-rushx.js | 28 + common/scripts/install-run.js | 645 + common/scripts/parse-version.js | 20 + common/scripts/pre-release.js | 97 + common/scripts/release.js | 82 + common/scripts/set-json-file.js | 30 + common/scripts/set-prerelease-version.js | 86 + common/scripts/sort_deps.js | 116 + common/scripts/version-policies.js | 85 + docs/assets/api/en/api.md | 14 + docs/assets/api/en/common/attribute.md | 221 + docs/assets/api/en/common/graphic.md | 130 + docs/assets/api/en/common/text.md | 38 + docs/assets/api/en/graphic/arc.md | 50 + docs/assets/api/en/graphic/area.md | 38 + docs/assets/api/en/graphic/circle.md | 30 + docs/assets/api/en/graphic/group.md | 62 + docs/assets/api/en/graphic/image.md | 42 + docs/assets/api/en/graphic/line.md | 42 + docs/assets/api/en/graphic/path.md | 22 + docs/assets/api/en/graphic/polygon.md | 30 + docs/assets/api/en/graphic/rect.md | 30 + docs/assets/api/en/graphic/richtext.md | 82 + docs/assets/api/en/graphic/symbol.md | 26 + docs/assets/api/en/graphic/text.md | 62 + docs/assets/api/zh/api.md | 14 + docs/assets/api/zh/common/attribute.md | 221 + docs/assets/api/zh/common/graphic.md | 130 + docs/assets/api/zh/common/text.md | 38 + docs/assets/api/zh/graphic/arc.md | 50 + docs/assets/api/zh/graphic/area.md | 38 + docs/assets/api/zh/graphic/circle.md | 30 + docs/assets/api/zh/graphic/group.md | 62 + docs/assets/api/zh/graphic/image.md | 42 + docs/assets/api/zh/graphic/line.md | 42 + docs/assets/api/zh/graphic/path.md | 22 + docs/assets/api/zh/graphic/polygon.md | 30 + docs/assets/api/zh/graphic/rect.md | 30 + docs/assets/api/zh/graphic/richtext.md | 82 + docs/assets/api/zh/graphic/symbol.md | 26 + docs/assets/api/zh/graphic/text.md | 62 + docs/assets/changelog/en/changelog.md | 0 docs/assets/changelog/zh/changelog.md | 0 docs/assets/examples/menu.json | 4 + docs/assets/guide/menu.json | 4 + docs/assets/option/en/option.md | 0 docs/demos/package.json | 37 + docs/demos/src/pages/rect.ts | 0 docs/demos/tsconfig.json | 28 + docs/index.html | 15 + docs/index.js | 205 + docs/libs/template-parse/build.js | 188 + docs/libs/template-parse/etpl.js | 1679 ++ docs/libs/template-parse/md2json.js | 449 + docs/libs/template-parse/schemaHelper.js | 226 + docs/menu.json | 15 + docs/package.json | 38 + docs/src/app.tsx | 55 + docs/src/header.tsx | 61 + docs/src/i18n.tsx | 20 + docs/src/main.tsx | 10 + docs/src/markdown.tsx | 228 + docs/src/option.tsx | 66 + docs/src/option/description.tsx | 291 + docs/src/option/index.css | 50 + docs/src/option/index.tsx | 86 + docs/src/option/outline.tsx | 215 + docs/style.css | 118 + docs/tsconfig.json | 25 + docs/tsconfig.node.json | 8 + docs/vite.config.js | 23 + index.js | 3 + packages/vstory/.eslintrc.js | 12 + packages/vstory/CHANGELOG.json | 0 packages/vstory/CHANGELOG.md | 0 packages/vstory/README.md | 9 + packages/vstory/bundler.config.js | 12 + packages/vstory/demo/data/ranking-bar.ts | 13579 ++++++++++++++++ packages/vstory/demo/index.html | 15 + packages/vstory/demo/src/App.tsx | 88 + .../vstory/demo/src/assets/scene3/chart-1.png | Bin 0 -> 51004 bytes .../vstory/demo/src/assets/scene3/chart-2.png | Bin 0 -> 34007 bytes .../vstory/demo/src/assets/scene3/chart-3.png | Bin 0 -> 43600 bytes .../vstory/demo/src/assets/scene3/chart-4.png | Bin 0 -> 48192 bytes .../demo/src/assets/scene3/chart-5-empty.png | Bin 0 -> 29011 bytes .../vstory/demo/src/assets/scene3/chart-5.png | Bin 0 -> 76217 bytes .../demo/src/assets/scene3/decoration.png | Bin 0 -> 19444 bytes .../vstory/demo/src/assets/scene3/text-en.png | Bin 0 -> 22430 bytes .../vstory/demo/src/assets/scene3/text-zh.png | Bin 0 -> 40838 bytes .../demo/src/assets/scene3/title-image.png | Bin 0 -> 398177 bytes .../demo/src/assets/scene4/bg-decoration.png | Bin 0 -> 49181 bytes .../vstory/demo/src/assets/scene4/blocks.png | Bin 0 -> 1118 bytes .../vstory/demo/src/assets/scene4/chart.png | Bin 0 -> 181342 bytes .../demo/src/assets/scene4/decoration.png | Bin 0 -> 6001 bytes .../vstory/demo/src/assets/scene4/matrix.png | Bin 0 -> 4970 bytes .../vstory/demo/src/assets/scene4/text-en.png | Bin 0 -> 25561 bytes .../vstory/demo/src/assets/scene4/text-zh.png | Bin 0 -> 38524 bytes .../src/assets/scene4/title-decoration.png | Bin 0 -> 2871 bytes packages/vstory/demo/src/demos/Appear.tsx | 973 ++ .../vstory/demo/src/demos/AreaWithTag.tsx | 160 + packages/vstory/demo/src/demos/DisAppear.tsx | 212 + packages/vstory/demo/src/demos/RankingBar.tsx | 87 + packages/vstory/demo/src/demos/SimpleBar.tsx | 81 + .../vstory/demo/src/demos/StoryBarDemo.tsx | 358 + .../demo/src/demos/StoryBarDemoPlay.tsx | 102 + packages/vstory/demo/src/demos/StoryEdit.tsx | 183 + .../vstory/demo/src/demos/StoryLineDemo.tsx | 97 + .../vstory/demo/src/demos/StoryPieDemo.tsx | 72 + packages/vstory/demo/src/demos/StoryScene.tsx | 274 + .../demo/src/demos/VChartSite/VChartSite.tsx | 72 + .../demo/src/demos/VChartSite/scene1.tsx | 1043 ++ .../demo/src/demos/VChartSite/scene2.tsx | 230 + .../demo/src/demos/VChartSite/scene3.tsx | 1240 ++ .../demo/src/demos/VChartSite/scene4.tsx | 551 + .../vstory/demo/src/demos/graphicAction.tsx | 156 + .../vstory/demo/src/hooks/useLocalStorage.ts | 16 + packages/vstory/demo/src/vite-env.d.ts | 1 + packages/vstory/demo/tsconfig.json | 26 + packages/vstory/demo/tsconfig.node.json | 10 + packages/vstory/demo/vite.config.ts | 34 + packages/vstory/jest.config.js | 47 + packages/vstory/package.json | 82 + packages/vstory/setup-mock.js | 2 + packages/vstory/src/animate/animate.ts | 29 + packages/vstory/src/animate/bounce.ts | 35 + packages/vstory/src/animate/highlight.ts | 53 + packages/vstory/src/animate/typewirter.ts | 76 + packages/vstory/src/animate/util/paths.ts | 1558 ++ packages/vstory/src/animate/util/util.ts | 343 + packages/vstory/src/animate/wipeIn.ts | 183 + packages/vstory/src/component/title.ts | 76 + packages/vstory/src/dsl/constant/index.ts | 31 + packages/vstory/src/dsl/story-chart/area.ts | 6 + packages/vstory/src/dsl/story-chart/bar.ts | 39 + packages/vstory/src/dsl/story-chart/chart.ts | 96 + .../src/dsl/story-chart/component/base.ts | 25 + .../dsl/story-chart/component/markPoint.ts | 19 + .../src/dsl/story-chart/component/title.ts | 0 .../vstory/src/dsl/story-chart/default/add.ts | 11 + .../dsl/story-chart/default/updateStyle.ts | 8 + .../vstory/src/dsl/story-chart/element.ts | 5 + packages/vstory/src/dsl/story-chart/index.ts | 8 + packages/vstory/src/dsl/story-chart/line.ts | 30 + packages/vstory/src/dsl/story-chart/pie.ts | 18 + .../vstory/src/dsl/story-executor/index.ts | 52 + .../vstory/src/dsl/story-processor/ README.md | 3 + .../src/dsl/story-processor/graphic/appear.ts | 24 + .../dsl/story-processor/graphic/brighten.ts | 12 + .../src/dsl/story-processor/graphic/darken.ts | 12 + .../dsl/story-processor/graphic/disappear.ts | 26 + .../story-processor/graphic/effect/appear.ts | 204 + .../story-processor/graphic/effect/bounce.ts | 21 + .../graphic/effect/disappear.ts | 170 + .../story-processor/graphic/effect/flicker.ts | 13 + .../story-processor/graphic/effect/moveTo.ts | 15 + .../story-processor/graphic/effect/shade.ts | 42 + .../graphic/effect/typewriter.ts | 13 + .../dsl/story-processor/graphic/flicker.ts | 12 + .../src/dsl/story-processor/graphic/moveTo.ts | 13 + .../src/dsl/story-processor/graphic/style.ts | 21 + .../src/dsl/story-processor/graphic/util.ts | 25 + .../vstory/src/dsl/story-processor/index.ts | 3 + .../src/dsl/story-processor/processor.ts | 83 + .../dsl/story-processor/processorMap/index.ts | 1 + .../processorMap/processorMap.ts | 152 + .../dsl/story-processor/processorMap/radar.ts | 43 + .../processorMap/rangeColumn.ts | 22 + .../dsl/story-processor/processorMap/rose.ts | 25 + .../story-processor/processorMap/scatter.ts | 22 + .../story-processor/processorMap/sunburst.ts | 22 + .../story-processor/processorMap/treeMap.ts | 22 + .../story-processor/processorMap/wordCloud.ts | 22 + .../src/dsl/story-processor/vchart/add.ts | 23 + .../src/dsl/story-processor/vchart/bounce.ts | 12 + .../vchart/charts/area/areaAppear.ts | 16 + .../vchart/charts/area/areaDisappear.ts | 46 + .../vchart/charts/area/index.ts | 2 + .../vchart/charts/bar/barAppear.ts | 18 + .../vchart/charts/bar/barDisappear.ts | 48 + .../vchart/charts/bar/index.ts | 2 + .../story-processor/vchart/charts/index.ts | 9 + .../vchart/charts/line/index.ts | 2 + .../vchart/charts/line/lineAppear.ts | 18 + .../vchart/charts/line/lineDisappear.ts | 47 + .../charts/line/transformLineSymbolAppear.ts | 77 + .../vchart/charts/pie/index.ts | 2 + .../vchart/charts/pie/pieAppear.ts | 16 + .../vchart/charts/pie/pieDisappear.ts | 47 + .../vchart/charts/radar/index.ts | 2 + .../vchart/charts/radar/radarAppear.ts | 29 + .../vchart/charts/radar/radarDisappear.ts | 48 + .../vchart/charts/rose/index.ts | 2 + .../vchart/charts/rose/roseAppear.ts | 16 + .../vchart/charts/rose/roseDisappear.ts | 47 + .../vchart/charts/scatter/index.ts | 2 + .../vchart/charts/scatter/scatterAppear.ts | 17 + .../vchart/charts/scatter/scatterDisappear.ts | 47 + .../vchart/charts/sunburst/index.ts | 2 + .../vchart/charts/sunburst/sunburstAppear.ts | 16 + .../charts/sunburst/sunburstDisappear.ts | 46 + .../vchart/charts/treeMap/index.ts | 2 + .../vchart/charts/treeMap/treeMapAppear.ts | 16 + .../vchart/charts/treeMap/treeMapDisappear.ts | 46 + .../vchart/charts/wordCloud/index.ts | 2 + .../charts/wordCloud/wordCloudAppear.ts | 17 + .../charts/wordCloud/wordCloudDisappear.ts | 46 + .../vchart/components/axes/disappear.ts | 47 + .../vchart/components/axes/index.ts | 1 + .../vchart/components/index.ts | 2 + .../vchart/components/title/disappear.ts | 50 + .../vchart/components/title/index.ts | 1 + .../src/dsl/story-processor/vchart/dance.ts | 59 + .../dsl/story-processor/vchart/markPoint.ts | 37 + .../vchart/marks/arc/appear.ts | 51 + .../vchart/marks/arc/disappear.ts | 51 + .../story-processor/vchart/marks/arc/index.ts | 2 + .../vchart/marks/arc/transformArcAppear.ts | 82 + .../vchart/marks/area/appear.ts | 52 + .../vchart/marks/area/disappear.ts | 51 + .../vchart/marks/area/index.ts | 2 + .../vchart/marks/area/transformAreaAppear.ts | 63 + .../dsl/story-processor/vchart/marks/index.ts | 6 + .../vchart/marks/line/appear.ts | 51 + .../vchart/marks/line/disappear.ts | 51 + .../vchart/marks/line/index.ts | 2 + .../vchart/marks/line/transformLineAppear.ts | 57 + .../vchart/marks/rect/appear.ts | 52 + .../vchart/marks/rect/disappear.ts | 52 + .../vchart/marks/rect/index.ts | 2 + .../vchart/marks/rect/transformRectAppear.ts | 115 + .../vchart/marks/symbol/appear.ts | 51 + .../vchart/marks/symbol/disappear.ts | 51 + .../vchart/marks/symbol/index.ts | 2 + .../marks/symbol/transformSymbolAppear.ts | 57 + .../vchart/marks/text/appear.ts | 52 + .../vchart/marks/text/disappear.ts | 52 + .../vchart/marks/text/index.ts | 2 + .../vchart/marks/text/transformTextAppear.ts | 54 + .../story-processor/vchart/style/lineStyle.ts | 40 + .../dsl/story-processor/vchart/style/style.ts | 41 + .../src/dsl/story-processor/vchart/title.ts | 18 + .../src/dsl/story-processor/vchart/update.ts | 36 + .../dsl/story-processor/vchart/utils/index.ts | 2 + .../story-processor/vchart/utils/isMatch.ts | 10 + .../dsl/story-processor/vchart/utils/mark.ts | 22 + .../story-processor/vchart/utils/series.ts | 16 + packages/vstory/src/dsl/types/Datum.ts | 2 + packages/vstory/src/dsl/types/chart/add.ts | 15 + packages/vstory/src/dsl/types/chart/appear.ts | 20 + .../src/dsl/types/chart/createComponent.ts | 37 + packages/vstory/src/dsl/types/chart/index.ts | 14 + packages/vstory/src/dsl/types/chart/style.ts | 12 + packages/vstory/src/dsl/types/chart/update.ts | 15 + .../vstory/src/dsl/types/common/bounce.ts | 22 + .../vstory/src/dsl/types/common/brighten.ts | 18 + .../vstory/src/dsl/types/common/darken.ts | 18 + .../vstory/src/dsl/types/common/flicker.ts | 15 + packages/vstory/src/dsl/types/common/index.ts | 7 + .../vstory/src/dsl/types/common/moveTo.ts | 8 + .../vstory/src/dsl/types/graphic/appear.ts | 40 + .../vstory/src/dsl/types/graphic/disappear.ts | 40 + .../vstory/src/dsl/types/graphic/index.ts | 20 + .../vstory/src/dsl/types/graphic/style.ts | 11 + packages/vstory/src/dsl/types/index.ts | 26 + packages/vstory/src/dsl/utils/datum.ts | 18 + packages/vstory/src/dsl/utils/flicker.ts | 14 + packages/vstory/src/edit/const.ts | 5 + packages/vstory/src/edit/edit-action.ts | 49 + .../src/edit/edit-component/box-selection.ts | 44 + .../vstory/src/edit/edit-component/common.ts | 31 + .../src/edit/edit-component/layer-edit.ts | 0 packages/vstory/src/edit/edit.ts | 77 + packages/vstory/src/edit/interface.ts | 49 + packages/vstory/src/index.ts | 0 packages/vstory/src/interface/type.ts | 9 + packages/vstory/src/scene/action.ts | 67 + packages/vstory/src/scene/index.ts | 1 + packages/vstory/src/scene/scene.ts | 129 + packages/vstory/src/story/act/act.ts | 3 + packages/vstory/src/story/canvas/canvas.ts | 86 + .../vstory/src/story/character/base/base.ts | 65 + .../src/story/character/chart/character.ts | 131 + .../story/character/chart/characters/area.ts | 9 + .../story/character/chart/characters/bar.ts | 9 + .../story/character/chart/characters/line.ts | 9 + .../story/character/chart/characters/pie.ts | 9 + .../story/character/chart/characters/radar.ts | 9 + .../character/chart/characters/rangeColumn.ts | 9 + .../story/character/chart/characters/rose.ts | 9 + .../character/chart/characters/scatter.ts | 9 + .../character/chart/characters/sunburst.ts | 9 + .../character/chart/characters/treemap.ts | 9 + .../character/chart/characters/wordcloud.ts | 9 + .../vstory/src/story/character/chart/const.ts | 12 + .../story/character/chart/data/interface.ts | 66 + .../character/chart/data/parser/standard.ts | 103 + .../chart/graphic/vchart-graphic-picker.ts | 45 + .../chart/graphic/vchart-graphic-render.ts | 68 + .../character/chart/graphic/vchart-graphic.ts | 124 + .../src/story/character/chart/parser.ts | 0 .../character/chart/runtime/common-spec.ts | 27 + .../character/chart/runtime/component-spec.ts | 54 + .../character/chart/runtime/interface.ts | 16 + .../character/chart/runtime/series-spec.ts | 47 + .../story/character/chart/runtime/utils.ts | 14 + .../chart/spec-process/data-temp-transform.ts | 15 + .../character/chart/spec-process/interface.ts | 25 + .../chart/spec-process/spec-process.ts | 42 + .../story/character/chart/temp/constant.ts | 15 + .../src/story/character/chart/temp/index.ts | 2 + .../story/character/chart/temp/interface.ts | 29 + .../character/chart/temp/templates/area.ts | 24 + .../character/chart/temp/templates/bar.ts | 23 + .../chart/temp/templates/base-temp.ts | 27 + .../chart/temp/templates/cartesian-single.ts | 48 + .../character/chart/temp/templates/common.ts | 230 + .../character/chart/temp/templates/line.ts | 38 + .../character/chart/temp/templates/pie.ts | 32 + .../chart/temp/templates/polar-single.ts | 32 + .../character/chart/temp/templates/radar.ts | 18 + .../chart/temp/templates/rangeColumn.ts | 38 + .../character/chart/temp/templates/rose.ts | 18 + .../character/chart/temp/templates/scatter.ts | 19 + .../chart/temp/templates/sunburst.ts | 32 + .../character/chart/temp/templates/treemap.ts | 32 + .../chart/temp/templates/wordcloud.ts | 33 + .../story/character/component/character.ts | 140 + .../component/characters/character-image.ts | 10 + .../component/characters/character-line.ts | 10 + .../component/characters/character-qipao.ts | 9 + .../component/characters/character-rect.ts | 10 + .../characters/character-richtext.ts | 10 + .../component/characters/character-text.ts | 13 + .../component/graphic/graphic-text.ts | 141 + .../character/component/graphic/graphic.ts | 127 + .../character/component/graphic/image.ts | 34 + .../story/character/component/graphic/line.ts | 33 + .../character/component/graphic/qipao.ts | 34 + .../story/character/component/graphic/rect.ts | 35 + .../character/component/graphic/richtext.ts | 56 + .../story/character/component/graphic/text.ts | 56 + .../character/component/graphic/utils.ts | 18 + .../src/story/character/dsl-interface.ts | 91 + packages/vstory/src/story/character/index.ts | 2 + .../src/story/character/runtime-interface.ts | 46 + .../src/story/character/visactor/character.ts | 77 + .../visactor/data-temp-transform-base.ts | 101 + .../src/story/character/visactor/interface.ts | 139 + .../character/visactor/spec-process-base.ts | 96 + packages/vstory/src/story/factory/factory.ts | 58 + packages/vstory/src/story/index.ts | 57 + .../src/story/interface/dsl-interface.ts | 29 + packages/vstory/src/story/interface/index.ts | 2 + packages/vstory/src/story/interface/player.ts | 17 + .../src/story/interface/runtime-interface.ts | 14 + packages/vstory/src/story/player/encode.ts | 67 + packages/vstory/src/story/player/index.ts | 202 + packages/vstory/src/story/player/ticker.ts | 3 + packages/vstory/src/story/story.ts | 87 + packages/vstory/src/story/utils/chart.ts | 134 + packages/vstory/src/story/utils/layout.ts | 10 + packages/vstory/src/task.ts | 43 + packages/vstory/src/template/base-template.ts | 44 + .../src/template/charts/simple-chart.ts | 42 + .../src/template/ranking-bar/interface.ts | 57 + .../src/template/ranking-bar/ranking-bar.ts | 60 + .../src/template/ranking-bar/spec-parser.ts | 364 + packages/vstory/src/type/common.ts | 5 + packages/vstory/src/util/common.ts | 5 + packages/vstory/src/util/size.ts | 26 + packages/vstory/src/util/vchart-api.ts | 22 + packages/vstory/src/util/vrender-api.ts | 14 + packages/vstory/tsconfig.eslint.json | 15 + packages/vstory/tsconfig.json | 12 + packages/vstory/tsconfig.test.json | 7 + packages/vstory/vite/index.html | 13 + packages/vstory/vite/public/vite.svg | 1 + packages/vstory/vite/src/App.css | 42 + packages/vstory/vite/src/App.tsx | 31 + packages/vstory/vite/src/assets/react.svg | 1 + packages/vstory/vite/src/index.css | 69 + packages/vstory/vite/src/main.tsx | 11 + packages/vstory/vite/src/vite-env.d.ts | 1 + packages/vstory/vite/tsconfig.json | 32 + packages/vstory/vite/tsconfig.node.json | 10 + packages/vstory/vite/vite.config.ts | 39 + rush.json | 66 + share/eslint-config/package.json | 22 + share/eslint-config/profile/common.js | 329 + share/eslint-config/profile/lib.js | 2 + share/eslint-config/profile/react.js | 1 + share/jest-config/jest.base.js | 33 + share/jest-config/package.json | 18 + share/ts-config/package.json | 5 + share/ts-config/tsconfig.base.json | 25 + tools/bugserver-trigger/.bundle/config | 2 + tools/bugserver-trigger/.eslintrc.js | 12 + tools/bugserver-trigger/bundler.config.js | 13 + tools/bugserver-trigger/package.json | 26 + .../bugserver-trigger/scripts/trigger-test.ts | 301 + tools/bugserver-trigger/src/index.ts | 5 + tools/bugserver-trigger/tsconfig.eslint.json | 11 + tools/bugserver-trigger/tsconfig.json | 29 + tools/bundler/.eslintrc.js | 7 + tools/bundler/README.md | 113 + tools/bundler/bin/index.js | 4 + tools/bundler/fixtures/config/.gitignore | 4 + .../bundler/fixtures/config/bundler.config.js | 70 + tools/bundler/fixtures/config/package.json | 7 + .../bundler/fixtures/config/source/custom.css | 79 + .../fixtures/config/source/foo/bar/index.ts | 5 + .../fixtures/config/source/foo/bar/web.png | Bin 0 -> 9048 bytes .../fixtures/config/source/foo/index.ts | 1 + .../fixtures/config/source/global.d.ts | 2 + tools/bundler/fixtures/config/source/index.ts | 17 + .../fixtures/config/source/utils/index.ts | 15 + tools/bundler/fixtures/config/tsconfig.json | 18 + tools/bundler/package.json | 101 + tools/bundler/src/bootstrap.ts | 161 + tools/bundler/src/global.d.ts | 4 + tools/bundler/src/index.ts | 8 + tools/bundler/src/logic/alias.ts | 118 + tools/bundler/src/logic/babel.config.ts | 32 + tools/bundler/src/logic/config.test.ts | 77 + tools/bundler/src/logic/config.ts | 200 + tools/bundler/src/logic/debug.ts | 6 + tools/bundler/src/logic/package.ts | 31 + tools/bundler/src/logic/rollup.config.ts | 77 + tools/bundler/src/tasks/clean.ts | 17 + tools/bundler/src/tasks/copy.ts | 24 + tools/bundler/src/tasks/modules.ts | 164 + tools/bundler/src/tasks/style.ts | 85 + tools/bundler/src/tasks/umd.ts | 46 + tools/bundler/tsconfig.json | 21 + tools/bundler/vitest.config.ts | 7 + 522 files changed, 69290 insertions(+) create mode 100644 CONTRIBUTING.zh-CN.md create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feaure_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/pr_cn.md create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/bug-server.yml create mode 100644 .github/workflows/label.yml create mode 100644 .github/workflows/pr-check.yml create mode 100644 .github/workflows/pre-release.yml create mode 100644 .github/workflows/release-changelog.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/stale.yml create mode 100644 .github/workflows/sync-main-to-develop.yml create mode 100644 .github/workflows/unit-test.yml create mode 100644 .gitignore create mode 100644 .lintstagedrc create mode 100644 .prettierignore create mode 100644 .prettierrc.js create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.zh-CN.md create mode 100644 common/autoinstallers/create/README.md create mode 100644 common/autoinstallers/create/package.json create mode 100644 common/autoinstallers/create/pnpm-lock.yaml create mode 100644 common/autoinstallers/create/src/cli.ts create mode 100644 common/autoinstallers/create/src/create.ts create mode 100644 common/autoinstallers/create/src/global.d.ts create mode 100644 common/autoinstallers/create/src/logger.ts create mode 100644 common/autoinstallers/create/src/template.ts create mode 100644 common/autoinstallers/create/templates/library/.eslintrc.js create mode 100644 common/autoinstallers/create/templates/library/README.md create mode 100644 common/autoinstallers/create/templates/library/bundler.config.js create mode 100644 common/autoinstallers/create/templates/library/package.json create mode 100644 common/autoinstallers/create/templates/library/src/global.d.ts create mode 100644 common/autoinstallers/create/templates/library/src/index.ts create mode 100644 common/autoinstallers/create/templates/library/tsconfig.json create mode 100644 common/autoinstallers/create/templates/library/vite/index.html create mode 100644 common/autoinstallers/create/templates/library/vite/public/vite.svg create mode 100644 common/autoinstallers/create/templates/library/vite/src/App.css create mode 100644 common/autoinstallers/create/templates/library/vite/src/App.tsx create mode 100644 common/autoinstallers/create/templates/library/vite/src/assets/react.svg create mode 100644 common/autoinstallers/create/templates/library/vite/src/index.css create mode 100644 common/autoinstallers/create/templates/library/vite/src/main.tsx create mode 100644 common/autoinstallers/create/templates/library/vite/src/vite-env.d.ts create mode 100644 common/autoinstallers/create/templates/library/vite/tsconfig.json create mode 100644 common/autoinstallers/create/templates/library/vite/tsconfig.node.json create mode 100644 common/autoinstallers/create/templates/library/vite/vite.config.ts create mode 100644 common/autoinstallers/create/tsconfig.json create mode 100644 common/autoinstallers/lint/change-all.ts create mode 100644 common/autoinstallers/lint/commit-lint.js create mode 100644 common/autoinstallers/lint/commitlint.config.js create mode 100644 common/autoinstallers/lint/package.json create mode 100644 common/autoinstallers/lint/pnpm-lock.yaml create mode 100644 common/autoinstallers/lint/prettier.ts create mode 100644 common/autoinstallers/lint/tsconfig.json create mode 100644 common/autoinstallers/run-script/package.json create mode 100644 common/autoinstallers/run-script/pnpm-lock.yaml create mode 100644 common/autoinstallers/run-script/run.ts create mode 100644 common/autoinstallers/run-script/start.ts create mode 100644 common/autoinstallers/run-script/tsconfig.json create mode 100644 common/config/rush/.npmrc create mode 100644 common/config/rush/.npmrc-publish create mode 100644 common/config/rush/.pnpmfile.cjs create mode 100644 common/config/rush/artifactory.json create mode 100644 common/config/rush/build-cache.json create mode 100644 common/config/rush/command-line.json create mode 100644 common/config/rush/common-versions.json create mode 100644 common/config/rush/experiments.json create mode 100644 common/config/rush/pnpm-config.json create mode 100644 common/config/rush/pnpm-lock.yaml create mode 100644 common/config/rush/repo-state.json create mode 100644 common/config/rush/rush-plugins.json create mode 100644 common/config/rush/version-policies.json create mode 100644 common/git-hooks/commit-msg create mode 100644 common/git-hooks/pre-commit create mode 100644 common/git-hooks/pre-push create mode 100644 common/scripts/apply-prerelease-version.js create mode 100644 common/scripts/get-package-json.js create mode 100644 common/scripts/install-run-rush-pnpm.js create mode 100644 common/scripts/install-run-rush.js create mode 100644 common/scripts/install-run-rushx.js create mode 100644 common/scripts/install-run.js create mode 100644 common/scripts/parse-version.js create mode 100644 common/scripts/pre-release.js create mode 100644 common/scripts/release.js create mode 100644 common/scripts/set-json-file.js create mode 100644 common/scripts/set-prerelease-version.js create mode 100644 common/scripts/sort_deps.js create mode 100644 common/scripts/version-policies.js create mode 100644 docs/assets/api/en/api.md create mode 100644 docs/assets/api/en/common/attribute.md create mode 100644 docs/assets/api/en/common/graphic.md create mode 100644 docs/assets/api/en/common/text.md create mode 100644 docs/assets/api/en/graphic/arc.md create mode 100644 docs/assets/api/en/graphic/area.md create mode 100644 docs/assets/api/en/graphic/circle.md create mode 100644 docs/assets/api/en/graphic/group.md create mode 100644 docs/assets/api/en/graphic/image.md create mode 100644 docs/assets/api/en/graphic/line.md create mode 100644 docs/assets/api/en/graphic/path.md create mode 100644 docs/assets/api/en/graphic/polygon.md create mode 100644 docs/assets/api/en/graphic/rect.md create mode 100644 docs/assets/api/en/graphic/richtext.md create mode 100644 docs/assets/api/en/graphic/symbol.md create mode 100644 docs/assets/api/en/graphic/text.md create mode 100644 docs/assets/api/zh/api.md create mode 100644 docs/assets/api/zh/common/attribute.md create mode 100644 docs/assets/api/zh/common/graphic.md create mode 100644 docs/assets/api/zh/common/text.md create mode 100644 docs/assets/api/zh/graphic/arc.md create mode 100644 docs/assets/api/zh/graphic/area.md create mode 100644 docs/assets/api/zh/graphic/circle.md create mode 100644 docs/assets/api/zh/graphic/group.md create mode 100644 docs/assets/api/zh/graphic/image.md create mode 100644 docs/assets/api/zh/graphic/line.md create mode 100644 docs/assets/api/zh/graphic/path.md create mode 100644 docs/assets/api/zh/graphic/polygon.md create mode 100644 docs/assets/api/zh/graphic/rect.md create mode 100644 docs/assets/api/zh/graphic/richtext.md create mode 100644 docs/assets/api/zh/graphic/symbol.md create mode 100644 docs/assets/api/zh/graphic/text.md create mode 100644 docs/assets/changelog/en/changelog.md create mode 100644 docs/assets/changelog/zh/changelog.md create mode 100644 docs/assets/examples/menu.json create mode 100644 docs/assets/guide/menu.json create mode 100644 docs/assets/option/en/option.md create mode 100644 docs/demos/package.json create mode 100644 docs/demos/src/pages/rect.ts create mode 100644 docs/demos/tsconfig.json create mode 100644 docs/index.html create mode 100644 docs/index.js create mode 100644 docs/libs/template-parse/build.js create mode 100644 docs/libs/template-parse/etpl.js create mode 100644 docs/libs/template-parse/md2json.js create mode 100644 docs/libs/template-parse/schemaHelper.js create mode 100644 docs/menu.json create mode 100644 docs/package.json create mode 100644 docs/src/app.tsx create mode 100644 docs/src/header.tsx create mode 100644 docs/src/i18n.tsx create mode 100644 docs/src/main.tsx create mode 100644 docs/src/markdown.tsx create mode 100644 docs/src/option.tsx create mode 100644 docs/src/option/description.tsx create mode 100644 docs/src/option/index.css create mode 100644 docs/src/option/index.tsx create mode 100644 docs/src/option/outline.tsx create mode 100644 docs/style.css create mode 100644 docs/tsconfig.json create mode 100644 docs/tsconfig.node.json create mode 100644 docs/vite.config.js create mode 100644 index.js create mode 100644 packages/vstory/.eslintrc.js create mode 100644 packages/vstory/CHANGELOG.json create mode 100644 packages/vstory/CHANGELOG.md create mode 100644 packages/vstory/README.md create mode 100644 packages/vstory/bundler.config.js create mode 100644 packages/vstory/demo/data/ranking-bar.ts create mode 100644 packages/vstory/demo/index.html create mode 100644 packages/vstory/demo/src/App.tsx create mode 100644 packages/vstory/demo/src/assets/scene3/chart-1.png create mode 100644 packages/vstory/demo/src/assets/scene3/chart-2.png create mode 100644 packages/vstory/demo/src/assets/scene3/chart-3.png create mode 100644 packages/vstory/demo/src/assets/scene3/chart-4.png create mode 100644 packages/vstory/demo/src/assets/scene3/chart-5-empty.png create mode 100644 packages/vstory/demo/src/assets/scene3/chart-5.png create mode 100644 packages/vstory/demo/src/assets/scene3/decoration.png create mode 100644 packages/vstory/demo/src/assets/scene3/text-en.png create mode 100644 packages/vstory/demo/src/assets/scene3/text-zh.png create mode 100644 packages/vstory/demo/src/assets/scene3/title-image.png create mode 100644 packages/vstory/demo/src/assets/scene4/bg-decoration.png create mode 100644 packages/vstory/demo/src/assets/scene4/blocks.png create mode 100644 packages/vstory/demo/src/assets/scene4/chart.png create mode 100644 packages/vstory/demo/src/assets/scene4/decoration.png create mode 100644 packages/vstory/demo/src/assets/scene4/matrix.png create mode 100644 packages/vstory/demo/src/assets/scene4/text-en.png create mode 100644 packages/vstory/demo/src/assets/scene4/text-zh.png create mode 100644 packages/vstory/demo/src/assets/scene4/title-decoration.png create mode 100644 packages/vstory/demo/src/demos/Appear.tsx create mode 100644 packages/vstory/demo/src/demos/AreaWithTag.tsx create mode 100644 packages/vstory/demo/src/demos/DisAppear.tsx create mode 100644 packages/vstory/demo/src/demos/RankingBar.tsx create mode 100644 packages/vstory/demo/src/demos/SimpleBar.tsx create mode 100644 packages/vstory/demo/src/demos/StoryBarDemo.tsx create mode 100644 packages/vstory/demo/src/demos/StoryBarDemoPlay.tsx create mode 100644 packages/vstory/demo/src/demos/StoryEdit.tsx create mode 100644 packages/vstory/demo/src/demos/StoryLineDemo.tsx create mode 100644 packages/vstory/demo/src/demos/StoryPieDemo.tsx create mode 100644 packages/vstory/demo/src/demos/StoryScene.tsx create mode 100644 packages/vstory/demo/src/demos/VChartSite/VChartSite.tsx create mode 100644 packages/vstory/demo/src/demos/VChartSite/scene1.tsx create mode 100644 packages/vstory/demo/src/demos/VChartSite/scene2.tsx create mode 100644 packages/vstory/demo/src/demos/VChartSite/scene3.tsx create mode 100644 packages/vstory/demo/src/demos/VChartSite/scene4.tsx create mode 100644 packages/vstory/demo/src/demos/graphicAction.tsx create mode 100644 packages/vstory/demo/src/hooks/useLocalStorage.ts create mode 100644 packages/vstory/demo/src/vite-env.d.ts create mode 100644 packages/vstory/demo/tsconfig.json create mode 100644 packages/vstory/demo/tsconfig.node.json create mode 100644 packages/vstory/demo/vite.config.ts create mode 100644 packages/vstory/jest.config.js create mode 100644 packages/vstory/package.json create mode 100644 packages/vstory/setup-mock.js create mode 100644 packages/vstory/src/animate/animate.ts create mode 100644 packages/vstory/src/animate/bounce.ts create mode 100644 packages/vstory/src/animate/highlight.ts create mode 100644 packages/vstory/src/animate/typewirter.ts create mode 100644 packages/vstory/src/animate/util/paths.ts create mode 100644 packages/vstory/src/animate/util/util.ts create mode 100644 packages/vstory/src/animate/wipeIn.ts create mode 100644 packages/vstory/src/component/title.ts create mode 100644 packages/vstory/src/dsl/constant/index.ts create mode 100644 packages/vstory/src/dsl/story-chart/area.ts create mode 100644 packages/vstory/src/dsl/story-chart/bar.ts create mode 100644 packages/vstory/src/dsl/story-chart/chart.ts create mode 100644 packages/vstory/src/dsl/story-chart/component/base.ts create mode 100644 packages/vstory/src/dsl/story-chart/component/markPoint.ts create mode 100644 packages/vstory/src/dsl/story-chart/component/title.ts create mode 100644 packages/vstory/src/dsl/story-chart/default/add.ts create mode 100644 packages/vstory/src/dsl/story-chart/default/updateStyle.ts create mode 100644 packages/vstory/src/dsl/story-chart/element.ts create mode 100644 packages/vstory/src/dsl/story-chart/index.ts create mode 100644 packages/vstory/src/dsl/story-chart/line.ts create mode 100644 packages/vstory/src/dsl/story-chart/pie.ts create mode 100644 packages/vstory/src/dsl/story-executor/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/ README.md create mode 100644 packages/vstory/src/dsl/story-processor/graphic/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/brighten.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/darken.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/bounce.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/flicker.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/moveTo.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/shade.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/effect/typewriter.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/flicker.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/moveTo.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/style.ts create mode 100644 packages/vstory/src/dsl/story-processor/graphic/util.ts create mode 100644 packages/vstory/src/dsl/story-processor/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/processor.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/processorMap.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/radar.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/rangeColumn.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/rose.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/scatter.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/sunburst.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/treeMap.ts create mode 100644 packages/vstory/src/dsl/story-processor/processorMap/wordCloud.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/add.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/bounce.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/area/areaAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/area/areaDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/area/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/bar/barAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/bar/barDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/bar/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/line/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/line/lineAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/line/lineDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/line/transformLineSymbolAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/pie/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/radar/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/rose/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/scatter/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudDisappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/components/axes/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/components/axes/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/components/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/components/title/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/components/title/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/dance.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/markPoint.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/arc/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/arc/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/arc/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/arc/transformArcAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/area/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/area/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/area/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/area/transformAreaAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/line/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/line/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/line/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/line/transformLineAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/rect/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/rect/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/rect/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/rect/transformRectAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/symbol/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/symbol/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/symbol/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/symbol/transformSymbolAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/text/appear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/text/disappear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/text/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/marks/text/transformTextAppear.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/style/lineStyle.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/style/style.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/title.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/update.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/utils/index.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/utils/isMatch.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/utils/mark.ts create mode 100644 packages/vstory/src/dsl/story-processor/vchart/utils/series.ts create mode 100644 packages/vstory/src/dsl/types/Datum.ts create mode 100644 packages/vstory/src/dsl/types/chart/add.ts create mode 100644 packages/vstory/src/dsl/types/chart/appear.ts create mode 100644 packages/vstory/src/dsl/types/chart/createComponent.ts create mode 100644 packages/vstory/src/dsl/types/chart/index.ts create mode 100644 packages/vstory/src/dsl/types/chart/style.ts create mode 100644 packages/vstory/src/dsl/types/chart/update.ts create mode 100644 packages/vstory/src/dsl/types/common/bounce.ts create mode 100644 packages/vstory/src/dsl/types/common/brighten.ts create mode 100644 packages/vstory/src/dsl/types/common/darken.ts create mode 100644 packages/vstory/src/dsl/types/common/flicker.ts create mode 100644 packages/vstory/src/dsl/types/common/index.ts create mode 100644 packages/vstory/src/dsl/types/common/moveTo.ts create mode 100644 packages/vstory/src/dsl/types/graphic/appear.ts create mode 100644 packages/vstory/src/dsl/types/graphic/disappear.ts create mode 100644 packages/vstory/src/dsl/types/graphic/index.ts create mode 100644 packages/vstory/src/dsl/types/graphic/style.ts create mode 100644 packages/vstory/src/dsl/types/index.ts create mode 100644 packages/vstory/src/dsl/utils/datum.ts create mode 100644 packages/vstory/src/dsl/utils/flicker.ts create mode 100644 packages/vstory/src/edit/const.ts create mode 100644 packages/vstory/src/edit/edit-action.ts create mode 100644 packages/vstory/src/edit/edit-component/box-selection.ts create mode 100644 packages/vstory/src/edit/edit-component/common.ts create mode 100644 packages/vstory/src/edit/edit-component/layer-edit.ts create mode 100644 packages/vstory/src/edit/edit.ts create mode 100644 packages/vstory/src/edit/interface.ts create mode 100644 packages/vstory/src/index.ts create mode 100644 packages/vstory/src/interface/type.ts create mode 100644 packages/vstory/src/scene/action.ts create mode 100644 packages/vstory/src/scene/index.ts create mode 100644 packages/vstory/src/scene/scene.ts create mode 100644 packages/vstory/src/story/act/act.ts create mode 100644 packages/vstory/src/story/canvas/canvas.ts create mode 100644 packages/vstory/src/story/character/base/base.ts create mode 100644 packages/vstory/src/story/character/chart/character.ts create mode 100644 packages/vstory/src/story/character/chart/characters/area.ts create mode 100644 packages/vstory/src/story/character/chart/characters/bar.ts create mode 100644 packages/vstory/src/story/character/chart/characters/line.ts create mode 100644 packages/vstory/src/story/character/chart/characters/pie.ts create mode 100644 packages/vstory/src/story/character/chart/characters/radar.ts create mode 100644 packages/vstory/src/story/character/chart/characters/rangeColumn.ts create mode 100644 packages/vstory/src/story/character/chart/characters/rose.ts create mode 100644 packages/vstory/src/story/character/chart/characters/scatter.ts create mode 100644 packages/vstory/src/story/character/chart/characters/sunburst.ts create mode 100644 packages/vstory/src/story/character/chart/characters/treemap.ts create mode 100644 packages/vstory/src/story/character/chart/characters/wordcloud.ts create mode 100644 packages/vstory/src/story/character/chart/const.ts create mode 100644 packages/vstory/src/story/character/chart/data/interface.ts create mode 100644 packages/vstory/src/story/character/chart/data/parser/standard.ts create mode 100644 packages/vstory/src/story/character/chart/graphic/vchart-graphic-picker.ts create mode 100644 packages/vstory/src/story/character/chart/graphic/vchart-graphic-render.ts create mode 100644 packages/vstory/src/story/character/chart/graphic/vchart-graphic.ts create mode 100644 packages/vstory/src/story/character/chart/parser.ts create mode 100644 packages/vstory/src/story/character/chart/runtime/common-spec.ts create mode 100644 packages/vstory/src/story/character/chart/runtime/component-spec.ts create mode 100644 packages/vstory/src/story/character/chart/runtime/interface.ts create mode 100644 packages/vstory/src/story/character/chart/runtime/series-spec.ts create mode 100644 packages/vstory/src/story/character/chart/runtime/utils.ts create mode 100644 packages/vstory/src/story/character/chart/spec-process/data-temp-transform.ts create mode 100644 packages/vstory/src/story/character/chart/spec-process/interface.ts create mode 100644 packages/vstory/src/story/character/chart/spec-process/spec-process.ts create mode 100644 packages/vstory/src/story/character/chart/temp/constant.ts create mode 100644 packages/vstory/src/story/character/chart/temp/index.ts create mode 100644 packages/vstory/src/story/character/chart/temp/interface.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/area.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/bar.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/base-temp.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/cartesian-single.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/common.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/line.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/pie.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/polar-single.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/radar.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/rangeColumn.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/rose.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/scatter.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/sunburst.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/treemap.ts create mode 100644 packages/vstory/src/story/character/chart/temp/templates/wordcloud.ts create mode 100644 packages/vstory/src/story/character/component/character.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-image.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-line.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-qipao.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-rect.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-richtext.ts create mode 100644 packages/vstory/src/story/character/component/characters/character-text.ts create mode 100644 packages/vstory/src/story/character/component/graphic/graphic-text.ts create mode 100644 packages/vstory/src/story/character/component/graphic/graphic.ts create mode 100644 packages/vstory/src/story/character/component/graphic/image.ts create mode 100644 packages/vstory/src/story/character/component/graphic/line.ts create mode 100644 packages/vstory/src/story/character/component/graphic/qipao.ts create mode 100644 packages/vstory/src/story/character/component/graphic/rect.ts create mode 100644 packages/vstory/src/story/character/component/graphic/richtext.ts create mode 100644 packages/vstory/src/story/character/component/graphic/text.ts create mode 100644 packages/vstory/src/story/character/component/graphic/utils.ts create mode 100644 packages/vstory/src/story/character/dsl-interface.ts create mode 100644 packages/vstory/src/story/character/index.ts create mode 100644 packages/vstory/src/story/character/runtime-interface.ts create mode 100644 packages/vstory/src/story/character/visactor/character.ts create mode 100644 packages/vstory/src/story/character/visactor/data-temp-transform-base.ts create mode 100644 packages/vstory/src/story/character/visactor/interface.ts create mode 100644 packages/vstory/src/story/character/visactor/spec-process-base.ts create mode 100644 packages/vstory/src/story/factory/factory.ts create mode 100644 packages/vstory/src/story/index.ts create mode 100644 packages/vstory/src/story/interface/dsl-interface.ts create mode 100644 packages/vstory/src/story/interface/index.ts create mode 100644 packages/vstory/src/story/interface/player.ts create mode 100644 packages/vstory/src/story/interface/runtime-interface.ts create mode 100644 packages/vstory/src/story/player/encode.ts create mode 100644 packages/vstory/src/story/player/index.ts create mode 100644 packages/vstory/src/story/player/ticker.ts create mode 100644 packages/vstory/src/story/story.ts create mode 100644 packages/vstory/src/story/utils/chart.ts create mode 100644 packages/vstory/src/story/utils/layout.ts create mode 100644 packages/vstory/src/task.ts create mode 100644 packages/vstory/src/template/base-template.ts create mode 100644 packages/vstory/src/template/charts/simple-chart.ts create mode 100644 packages/vstory/src/template/ranking-bar/interface.ts create mode 100644 packages/vstory/src/template/ranking-bar/ranking-bar.ts create mode 100644 packages/vstory/src/template/ranking-bar/spec-parser.ts create mode 100644 packages/vstory/src/type/common.ts create mode 100644 packages/vstory/src/util/common.ts create mode 100644 packages/vstory/src/util/size.ts create mode 100644 packages/vstory/src/util/vchart-api.ts create mode 100644 packages/vstory/src/util/vrender-api.ts create mode 100644 packages/vstory/tsconfig.eslint.json create mode 100644 packages/vstory/tsconfig.json create mode 100644 packages/vstory/tsconfig.test.json create mode 100644 packages/vstory/vite/index.html create mode 100644 packages/vstory/vite/public/vite.svg create mode 100644 packages/vstory/vite/src/App.css create mode 100644 packages/vstory/vite/src/App.tsx create mode 100644 packages/vstory/vite/src/assets/react.svg create mode 100644 packages/vstory/vite/src/index.css create mode 100644 packages/vstory/vite/src/main.tsx create mode 100644 packages/vstory/vite/src/vite-env.d.ts create mode 100644 packages/vstory/vite/tsconfig.json create mode 100644 packages/vstory/vite/tsconfig.node.json create mode 100644 packages/vstory/vite/vite.config.ts create mode 100644 rush.json create mode 100644 share/eslint-config/package.json create mode 100644 share/eslint-config/profile/common.js create mode 100644 share/eslint-config/profile/lib.js create mode 100644 share/eslint-config/profile/react.js create mode 100644 share/jest-config/jest.base.js create mode 100644 share/jest-config/package.json create mode 100644 share/ts-config/package.json create mode 100644 share/ts-config/tsconfig.base.json create mode 100644 tools/bugserver-trigger/.bundle/config create mode 100644 tools/bugserver-trigger/.eslintrc.js create mode 100644 tools/bugserver-trigger/bundler.config.js create mode 100644 tools/bugserver-trigger/package.json create mode 100644 tools/bugserver-trigger/scripts/trigger-test.ts create mode 100644 tools/bugserver-trigger/src/index.ts create mode 100644 tools/bugserver-trigger/tsconfig.eslint.json create mode 100644 tools/bugserver-trigger/tsconfig.json create mode 100644 tools/bundler/.eslintrc.js create mode 100644 tools/bundler/README.md create mode 100755 tools/bundler/bin/index.js create mode 100644 tools/bundler/fixtures/config/.gitignore create mode 100644 tools/bundler/fixtures/config/bundler.config.js create mode 100644 tools/bundler/fixtures/config/package.json create mode 100644 tools/bundler/fixtures/config/source/custom.css create mode 100644 tools/bundler/fixtures/config/source/foo/bar/index.ts create mode 100644 tools/bundler/fixtures/config/source/foo/bar/web.png create mode 100644 tools/bundler/fixtures/config/source/foo/index.ts create mode 100644 tools/bundler/fixtures/config/source/global.d.ts create mode 100644 tools/bundler/fixtures/config/source/index.ts create mode 100644 tools/bundler/fixtures/config/source/utils/index.ts create mode 100644 tools/bundler/fixtures/config/tsconfig.json create mode 100644 tools/bundler/package.json create mode 100644 tools/bundler/src/bootstrap.ts create mode 100644 tools/bundler/src/global.d.ts create mode 100644 tools/bundler/src/index.ts create mode 100644 tools/bundler/src/logic/alias.ts create mode 100644 tools/bundler/src/logic/babel.config.ts create mode 100644 tools/bundler/src/logic/config.test.ts create mode 100644 tools/bundler/src/logic/config.ts create mode 100644 tools/bundler/src/logic/debug.ts create mode 100644 tools/bundler/src/logic/package.ts create mode 100644 tools/bundler/src/logic/rollup.config.ts create mode 100644 tools/bundler/src/tasks/clean.ts create mode 100644 tools/bundler/src/tasks/copy.ts create mode 100644 tools/bundler/src/tasks/modules.ts create mode 100644 tools/bundler/src/tasks/style.ts create mode 100644 tools/bundler/src/tasks/umd.ts create mode 100644 tools/bundler/tsconfig.json create mode 100644 tools/bundler/vitest.config.ts diff --git a/ CONTRIBUTING.zh-CN.md b/ CONTRIBUTING.zh-CN.md new file mode 100644 index 0000000..60555cf --- /dev/null +++ b/ CONTRIBUTING.zh-CN.md @@ -0,0 +1,83 @@ +# 贡献指南 + +首先非常感谢你能抽出时间为我们的开源项目做贡献。希望这份指南能够清晰地阐明贡献过程并回答你可能有的一些问题,所以请你在提 issue 或者 pull request 之前花几分钟时间阅读。 + +## 行为准则 + +我们有一份[行为准则](CODE_OF_CONDUCT.md),希望所有的贡献者都能遵守,请花时间阅读一遍全文以确保你能明白哪些是可以做的,哪些是不可以做的。 + +## 透明的开发 + +我们所有的工作都会放在 [GitHub](https://github.com/VisActor/) 上。不管是核心团队的成员还是外部贡献者的 pull request 都需要经过同样流程的 review。 + +## 版本管理 + +VStory 遵循[语义化版本控制](https://semver.org/lang/zh-CN/)。我们发布 patch 补丁版本以修复重要的错误,发布 minor 次要版本以提供新功能或非必要的更改,发布 major 主要版本以适应任何重大更改。当我们进行重大更改时,在次要版本中还会引入弃用警告,以便用户了解即将到来的更改并提前迁移代码。 + +每个重要的更改我们都会记录在对应项目 CHANGELOG 更新日志中。 + +## 发布周期 + + + +- patch 修订版本号:每周末会进行日常 bugfix 更新。(如果有紧急的 bugfix,则任何时候都可发布) +- minor 次版本号:每月发布一个带有新特性的向下兼容的版本。 +- major 主版本号:含有破坏性更新和新特性,不在发布周期内。 + +## 分支管理 + + + +**请将所有的更改提交到 `main` 主分支**。我们不使用单独的分支进行开发或即将发布的版本管理。我们尽力保持主分支良好状态,确保所有测试都能通过。 + +这里需要注意,所有进入主分支的代码必须与最新的稳定版本兼容,它可能包含其他功能,但不能有任何破坏性更改。我们应该能够随时从主分支的末端发布一个新的次要版本。 + +## Bugs 管理 + +我们使用 [GitHub Issues](todo) 来追踪所有的缺陷。无论内外部的缺陷,我们都会在 issues 上进行管理,尽量让一切公开、清晰明了。在你报告一个 bug 之前,请先确保已经搜索 +过已有的 issues。 + +如果你想要你发现的 bug 被快速解决,最好的办法就是根据我们提供的 issue 模板进行提问,只需要进入 [New issue](todo) 页面,然后选择其中任意一个开始即可,最好能使用这个[模板](todo) 来提供复现的示例代码。 + +## 提交变更建议 + +如果你有改进我们的配置项、接口或者新增功能的想法,我们同样推荐你通过 issue 进行提问,或者进入我们的 [New issue](todo) 页面,选择相应的 issue 模板进行提交, + +如果你准备帮助我们修复一个 bug,那么你可以立即提交一个 pull request 请求,但我们仍然建议你先创建一个 issue 并在 issue 中详细说明将要修复的内容,这样可以帮助我们更好得追踪问题。 + +## 你的第一个 Pull Request + +` +如果你还不清楚怎么在 GitHub 上提 Pull Request ,可以阅读下面这篇文章来学习:[如何优雅地在 GitHub 上贡献代码](https://segmentfault.com/a/1190000000736629) + +为了能帮助你开始你的第一次尝试,我们用[good first issues](todo)标记了一些比较容易修复的 bug 和小功能。这些 issue 可以很好地作为你的首次尝试。 + +如果你打算开始处理一个 issue,请先检查一下 issue 下面的留言以确保没有别人正在处理这个 issue。如果当前没有人在处理的话你可以留言告知其他人你将会处理这个 issue,以免别人重复劳动。 + +如果之前有人留言说会处理这个 issue 但是一两个星期都没有动静,那么你也可以接手处理这个 issue,当然还是需要留言告知其他人。 + +### 如何发送 Pull Request + +VisActor 团队会关注所有的 pull request,我们会 review 以及合并你的代码,也有可能要求你做一些修改或者告诉你我们为什么不能接受这样的修改。我们将尽最大努力在整个过程中提供及时的更新和反馈。 + +在**你发送 Pull Request 之前**,请确认你是按照下面的步骤来做的: + + + +1. 基于 `main` 分支做修改 +2. (如果你已经安装,请跳过此步骤)全局安装 [@microsoft/rush](https://rushjs.io/pages/intro/get_started/):`npm i --global @microsoft/rush` +3. 根目录下运行 `rush update --full` +4. 如果你修复了一个 bug 或者新增了一个功能,请确保写了相应的测试,这很重要。 +5. 确认所有的测试都是通过的 `rush test`。 小贴士:开发过程中可以用 `rush test -- --watch TestName` 来运行指定的测试。 +6. 确保你的代码通过了 lint 检查 `rush lint`. 小贴士: Lint 会在你 git commit 的时候自动运行(通过 Git Hooks)。 +7. 运行 `rush compile` 进行 ts 类型检测。 + +## 开发流程 + +在你 clone 了 VStory 的代码并且使用 `rush update --full` 安装完依赖后,你还可以运行下面几个常用的命令: + +1. `rush run -p @internal/dev-demos -s start` 在本地运行 VStory 代码的测试页面 +2. `rush eslint` 运行所有项目的 eslint 脚本 +3. `rush test` 运行所有项目的 test 脚本 +4. `rush run -p -s + + diff --git a/common/autoinstallers/create/templates/library/vite/public/vite.svg b/common/autoinstallers/create/templates/library/vite/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/common/autoinstallers/create/templates/library/vite/src/App.css b/common/autoinstallers/create/templates/library/vite/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/common/autoinstallers/create/templates/library/vite/src/App.tsx b/common/autoinstallers/create/templates/library/vite/src/App.tsx new file mode 100644 index 0000000..d6dcc83 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/App.tsx @@ -0,0 +1,31 @@ +import React, { useState } from 'react'; +import reactLogo from './assets/react.svg'; +import viteLogo from '/vite.svg'; +import './App.css'; + +function App() { + const [count, setCount] = useState(0); + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

Click on the Vite and React logos to learn more

+ + ); +} + +export default App; diff --git a/common/autoinstallers/create/templates/library/vite/src/assets/react.svg b/common/autoinstallers/create/templates/library/vite/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/common/autoinstallers/create/templates/library/vite/src/index.css b/common/autoinstallers/create/templates/library/vite/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/common/autoinstallers/create/templates/library/vite/src/main.tsx b/common/autoinstallers/create/templates/library/vite/src/main.tsx new file mode 100644 index 0000000..b3ad8a5 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/main.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App.tsx'; +import './index.css'; + +ReactDOM.render( + + + , + document.getElementById('root') as HTMLElement +); diff --git a/common/autoinstallers/create/templates/library/vite/src/vite-env.d.ts b/common/autoinstallers/create/templates/library/vite/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/common/autoinstallers/create/templates/library/vite/tsconfig.json b/common/autoinstallers/create/templates/library/vite/tsconfig.json new file mode 100644 index 0000000..4af7fee --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/common/autoinstallers/create/templates/library/vite/tsconfig.node.json b/common/autoinstallers/create/templates/library/vite/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/common/autoinstallers/create/templates/library/vite/vite.config.ts b/common/autoinstallers/create/templates/library/vite/vite.config.ts new file mode 100644 index 0000000..c8f4f28 --- /dev/null +++ b/common/autoinstallers/create/templates/library/vite/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react({ jsxRuntime: 'classic' })] +}); diff --git a/common/autoinstallers/create/tsconfig.json b/common/autoinstallers/create/tsconfig.json new file mode 100644 index 0000000..5177157 --- /dev/null +++ b/common/autoinstallers/create/tsconfig.json @@ -0,0 +1,109 @@ +{ + "include": ["src"], + "exclude": ["template"], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["esnext"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "ESNext", /* Specify what module code is generated. */ + "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": ["node"], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "module": "commonjs", + }, + } +} diff --git a/common/autoinstallers/lint/change-all.ts b/common/autoinstallers/lint/change-all.ts new file mode 100644 index 0000000..0bfdd3c --- /dev/null +++ b/common/autoinstallers/lint/change-all.ts @@ -0,0 +1,67 @@ +import path from 'path'; +import chalk from 'chalk'; +import minimist, { ParsedArgs } from 'minimist'; +import { spawnSync, execSync } from 'child_process'; + +interface RunScriptArgv extends ParsedArgs { + message?: string; + type?: string; + 'not-commit'?: boolean; +} + +function run() { + const commitLineConfigPath = path.resolve(__dirname, './commitlint.config.js'); + const commitLintBinPath = path.resolve(__dirname, './node_modules/.bin/commitlint'); + const argv: RunScriptArgv = minimist(process.argv.slice(2)); + let message = argv.message; + let bumpType = argv.type; + let notCommit = argv['not-commit'] + + if (!message) { + const lastCommitMessage = execSync('git log -1 --pretty=%B ').toString(); + + if (!lastCommitMessage) { + process.exit(1); + } + + console.log(chalk.green(`[Notice] no message is supplied, we'll use latest commit mesage: ${chalk.red.bold(lastCommitMessage)}`)); + message = lastCommitMessage; + } else { + const result = spawnSync( + 'sh', + ['-c', `echo ${message} | ${commitLintBinPath} --config ${commitLineConfigPath}`], + { + stdio: 'inherit' + } + ); + + if (result.status !== 0) { + process.exit(1); + } + } + + if (!bumpType) { + console.log(chalk.green(`[Notice] no bumpType is supplied, we'll use default bumpType: ${chalk.red.bold('patch')}`)); + bumpType = 'patch'; + } + + spawnSync('sh', ['-c', `rush change --bulk --bump-type '${bumpType}' --message '${message}'`], { + stdio: 'inherit', + shell: false, + }); + + if (!notCommit) { + spawnSync('sh', ['-c', 'git add --all'], { + stdio: 'inherit', + shell: false, + }); + + spawnSync('sh', ['-c', `git commit -m 'docs: update changlog of rush'`], { + stdio: 'inherit', + shell: false, + }); + } + +} + +run(); \ No newline at end of file diff --git a/common/autoinstallers/lint/commit-lint.js b/common/autoinstallers/lint/commit-lint.js new file mode 100644 index 0000000..75cdd71 --- /dev/null +++ b/common/autoinstallers/lint/commit-lint.js @@ -0,0 +1,24 @@ +const path = require("path"); +const fs = require("fs"); +const child_process = require("child_process"); + +const gitPath = path.resolve(__dirname, "../../../.git"); +const configPath = path.resolve(__dirname, "./commitlint.config.js"); +const commitlintBinPath = path.resolve(__dirname, "./node_modules/.bin/commitlint"); + +if (!fs.existsSync(gitPath)) { + console.error("no valid .git path"); + process.exit(1); +} + +const result = child_process.spawnSync( + "sh", + ["-c", `${commitlintBinPath} --config ${configPath} --cwd ${path.dirname(gitPath)} --edit`], + { + stdio: "inherit", + }, +); + +if (result.status !== 0) { + process.exit(1); +} diff --git a/common/autoinstallers/lint/commitlint.config.js b/common/autoinstallers/lint/commitlint.config.js new file mode 100644 index 0000000..0db15b4 --- /dev/null +++ b/common/autoinstallers/lint/commitlint.config.js @@ -0,0 +1,24 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'header-max-length': [0, 'always', 200], + 'header-min-length': [2, 'always', 16], + 'not-allowed-chars': [2, 'always'] + }, + plugins: [ + { + rules: { + 'not-allowed-chars': params => { + const { raw } = params; + const reg = + /^[a-zA-Z0-9\s`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘',。、]+$/im; + + return [ + reg.exec(raw), + 'Your commit message should only contain english characters, numbers, empty space, and special characters.' + ]; + } + } + } + ] +}; diff --git a/common/autoinstallers/lint/package.json b/common/autoinstallers/lint/package.json new file mode 100644 index 0000000..85605c2 --- /dev/null +++ b/common/autoinstallers/lint/package.json @@ -0,0 +1,22 @@ +{ + "name": "lint", + "version": "0.0.1", + "private": true, + "dependencies": { + "@commitlint/cli": "17.0.3", + "@commitlint/config-conventional": "17.0.3", + "@microsoft/rush-lib": "5.94.1", + "chalk": "4.1.2", + "commitizen": "4.2.5", + "eslint": "~8.18.0", + "lint-staged": "13.0.3", + "minimist": "1.2.6", + "prettier": "2.7.1", + "ts-node": "10.9.0" + }, + "devDependencies": { + "@types/minimist": "1.2.2", + "@types/node": "*", + "typescript": "5.0.2" + } +} diff --git a/common/autoinstallers/lint/pnpm-lock.yaml b/common/autoinstallers/lint/pnpm-lock.yaml new file mode 100644 index 0000000..1d7ad7c --- /dev/null +++ b/common/autoinstallers/lint/pnpm-lock.yaml @@ -0,0 +1,4897 @@ +lockfileVersion: '6.0' + +dependencies: + '@commitlint/cli': + specifier: 17.0.3 + version: 17.0.3 + '@commitlint/config-conventional': + specifier: 17.0.3 + version: 17.0.3 + '@microsoft/rush-lib': + specifier: 5.94.1 + version: 5.94.1(@types/node@0.0.0) + chalk: + specifier: 4.1.2 + version: 4.1.2 + commitizen: + specifier: 4.2.5 + version: 4.2.5 + eslint: + specifier: ~8.18.0 + version: 8.18.0 + lint-staged: + specifier: 13.0.3 + version: 13.0.3 + minimist: + specifier: 1.2.6 + version: 1.2.6 + prettier: + specifier: 2.7.1 + version: 2.7.1 + ts-node: + specifier: 10.9.0 + version: 10.9.0(@types/node@0.0.0)(typescript@5.0.2) + +devDependencies: + '@types/minimist': + specifier: 1.2.2 + version: 1.2.2 + '@types/node': + specifier: '*' + version: 0.0.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + +packages: + + /@azure/abort-controller@1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-auth@1.4.0: + resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + dev: false + + /@azure/core-client@1.7.2: + resolution: {integrity: sha512-ye5554gnVnXdfZ64hptUtETgacXoRWxYv1JF5MctoAzTSH5dXhDPZd9gOjDPyWMcLIk58pnP5+p5vGX6PYn1ag==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-rest-pipeline': 1.10.3 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-http@2.3.2: + resolution: {integrity: sha512-Z4dfbglV9kNZO177CNx4bo5ekFuYwwsvjLiKdZI4r84bYGv3irrbQz7JC3/rUfFH2l4T/W6OFleJaa2X0IaQqw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + '@types/node-fetch': 2.6.2 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.6.7 + process: 0.11.10 + tough-cookie: 4.1.2 + tslib: 2.5.0 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@azure/core-lro@2.5.2: + resolution: {integrity: sha512-tucUutPhBwCPu6v16KEFYML81npEL6gnT+iwewXvK5ZD55sr0/Vw2jfQETMiKVeARRrXHB2QQ3SpxxGi1zAUWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + tslib: 2.5.0 + dev: false + + /@azure/core-paging@1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-rest-pipeline@1.10.3: + resolution: {integrity: sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + form-data: 4.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-tracing@1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.4.1 + tslib: 2.5.0 + dev: false + + /@azure/core-tracing@1.0.1: + resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-util@1.3.1: + resolution: {integrity: sha512-pjfOUAb+MPLODhGuXot/Hy8wUgPD0UTqYkY3BiYcwEETrLcUCVM1t0roIvlQMgvn1lc48TGy5bsonsFpF862Jw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + dev: false + + /@azure/identity@2.1.0: + resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.2 + '@azure/core-rest-pipeline': 1.10.3 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + '@azure/msal-browser': 2.36.0 + '@azure/msal-common': 7.6.0 + '@azure/msal-node': 1.17.1 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.2 + stoppable: 1.1.0 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/logger@1.0.4: + resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/msal-browser@2.36.0: + resolution: {integrity: sha512-OrVDZ9ftO7ExqZVHripAt+doKg6G14YbP2LoSygiWQoSqoO4CejoXLRLqANc/HGg18N0p/oaRETw4IHZvwsxZw==} + engines: {node: '>=0.8.0'} + dependencies: + '@azure/msal-common': 12.1.0 + dev: false + + /@azure/msal-common@12.1.0: + resolution: {integrity: sha512-9RUiv0evSHvYtvF7r9ksShw9FgCeT6Rf6JB/SOMbMzI0VySZDUBSE+0b9e7DgL2Ph8wSARIh3m8c5pCK9TRY3w==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-common@7.6.0: + resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-node@1.17.1: + resolution: {integrity: sha512-1lC80yV+Y/gHqkYJ21Qy1Ej/cI/Kt1JcdY0xiM7/+mcEuBAkArR9B1YMY538PMZ5GfyVlYkCHYh/N0CBD5FJlQ==} + engines: {node: 10 || 12 || 14 || 16 || 18} + dependencies: + '@azure/msal-common': 12.1.0 + jsonwebtoken: 9.0.0 + uuid: 8.3.2 + dev: false + + /@azure/storage-blob@12.11.0: + resolution: {integrity: sha512-na+FisoARuaOWaHWpmdtk3FeuTWf2VWamdJ9/TJJzj5ZdXPLC3juoDgFs6XVuJIoK30yuBpyFBEDXVRK4pB7Tg==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 2.3.2 + '@azure/core-lro': 2.5.2 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.4 + events: 3.3.0 + tslib: 2.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: false + + /@babel/generator@7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: false + + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/parser@7.16.4: + resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/parser@7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + dev: false + + /@babel/traverse@7.21.4: + resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false + + /@commitlint/cli@17.0.3: + resolution: {integrity: sha512-oAo2vi5d8QZnAbtU5+0cR2j+A7PO8zuccux65R/EycwvsZrDVyW518FFrnJK2UQxbRtHFFIG+NjQ6vOiJV0Q8A==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.4.4 + '@commitlint/lint': 17.6.1 + '@commitlint/load': 17.5.0 + '@commitlint/read': 17.5.1 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: false + + /@commitlint/config-conventional@17.0.3: + resolution: {integrity: sha512-HCnzTm5ATwwwzNVq5Y57poS0a1oOOcd5pc1MmBpLbGmSysc4i7F/++JuwtdFPu16sgM3H9J/j2zznRLOSGVO2A==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: false + + /@commitlint/config-validator@17.4.4: + resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + ajv: 8.12.0 + dev: false + + /@commitlint/ensure@17.4.4: + resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: false + + /@commitlint/execute-rule@17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + engines: {node: '>=v14'} + dev: false + + /@commitlint/format@17.4.4: + resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + chalk: 4.1.2 + dev: false + + /@commitlint/is-ignored@17.4.4: + resolution: {integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.3.8 + dev: false + + /@commitlint/lint@17.6.1: + resolution: {integrity: sha512-VARJ9kxH64isgwVnC+ABPafCYzqxpsWJIpDaTuI0gh8aX4GQ0i7cn9tvxtFNfJj4ER2BAJeWJ0vURdNYjK2RQQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.4.4 + '@commitlint/parse': 17.4.4 + '@commitlint/rules': 17.6.1 + '@commitlint/types': 17.4.4 + dev: false + + /@commitlint/load@17.5.0: + resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.4 + '@commitlint/types': 17.4.4 + '@types/node': 0.0.0 + chalk: 4.1.2 + cosmiconfig: 8.1.3 + cosmiconfig-typescript-loader: 4.3.0(@types/node@0.0.0)(cosmiconfig@8.1.3)(ts-node@10.9.0)(typescript@5.0.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.0(@types/node@0.0.0)(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: false + + /@commitlint/message@17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + engines: {node: '>=v14'} + dev: false + + /@commitlint/parse@17.4.4: + resolution: {integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: false + + /@commitlint/read@17.5.1: + resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.4 + fs-extra: 11.1.1 + git-raw-commits: 2.0.11 + minimist: 1.2.6 + dev: false + + /@commitlint/resolve-extends@17.4.4: + resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/types': 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: false + + /@commitlint/rules@17.6.1: + resolution: {integrity: sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.4.4 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + dev: false + + /@commitlint/to-lines@17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + engines: {node: '>=v14'} + dev: false + + /@commitlint/top-level@17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: false + + /@commitlint/types@17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@devexpress/error-stack-parser@2.0.6: + resolution: {integrity: sha512-fneVypElGUH6Be39mlRZeAu00pccTlf4oVuzf9xPJD1cdEqI8NyAiQua/EW7lZdrbMUbgyXcJmfKPefhYius3A==} + dependencies: + stackframe: 1.3.4 + dev: false + + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/config-array@0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: false + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@microsoft/rush-lib@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-qXeqtYYe4ImyYyaAIR+ZdZEpNUeOZSaP+sbfksvDu9oa4kNH+5pCemII8NSfmQd9Dx7zPGPNiGf4zE4/Jcs6VA==} + engines: {node: '>=5.6.0'} + dependencies: + '@pnpm/link-bins': 5.3.25 + '@rushstack/heft-config-file': 0.11.9(@types/node@0.0.0) + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/package-deps-hash': 4.0.10(@types/node@0.0.0) + '@rushstack/rig-package': 0.3.18 + '@rushstack/rush-amazon-s3-build-cache-plugin': 5.94.1(@types/node@0.0.0) + '@rushstack/rush-azure-storage-build-cache-plugin': 5.94.1(@types/node@0.0.0) + '@rushstack/stream-collator': 4.0.228(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + '@rushstack/ts-command-line': 4.13.2 + '@types/node-fetch': 2.6.2 + '@yarnpkg/lockfile': 1.0.2 + builtin-modules: 3.1.0 + cli-table: 0.3.11 + colors: 1.2.5 + dependency-path: 9.2.8 + figures: 3.0.0 + git-repo-info: 2.1.1 + glob: 7.0.6 + glob-escape: 0.0.2 + https-proxy-agent: 5.0.1 + ignore: 5.1.9 + inquirer: 7.3.3 + js-yaml: 3.13.1 + jszip: 3.8.0 + lodash: 4.17.21 + node-fetch: 2.6.7 + npm-check: 6.0.1 + npm-package-arg: 6.1.1 + npm-packlist: 2.1.5 + read-package-tree: 5.1.6 + resolve: 1.22.2 + rxjs: 6.6.7 + semver: 7.3.8 + ssri: 8.0.1 + strict-uri-encode: 2.0.0 + tapable: 2.2.1 + tar: 6.1.13 + true-case-path: 2.2.1 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@opentelemetry/api@1.4.1: + resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} + engines: {node: '>=8.0.0'} + dev: false + + /@pnpm/crypto.base32-hash@1.0.1: + resolution: {integrity: sha512-pzAXNn6KxTA3kbcI3iEnYs4vtH51XEVqmK/1EiD18MaPKylhqy8UvMJK3zKG+jeP82cqQbozcTGm4yOQ8i3vNw==} + engines: {node: '>=14.6'} + dependencies: + rfc4648: 1.5.2 + dev: false + + /@pnpm/error@1.4.0: + resolution: {integrity: sha512-vxkRrkneBPVmP23kyjnYwVOtipwlSl6UfL+h+Xa3TrABJTz5rYBXemlTsU5BzST8U4pD7YDkTb3SQu+MMuIDKA==} + engines: {node: '>=10.16'} + dev: false + + /@pnpm/link-bins@5.3.25: + resolution: {integrity: sha512-9Xq8lLNRHFDqvYPXPgaiKkZ4rtdsm7izwM/cUsFDc5IMnG0QYIVBXQbgwhz2UvjUotbJrvfKLJaCfA3NGBnLDg==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/package-bins': 4.1.0 + '@pnpm/read-modules-dir': 2.0.3 + '@pnpm/read-package-json': 4.0.0 + '@pnpm/read-project-manifest': 1.1.7 + '@pnpm/types': 6.4.0 + '@zkochan/cmd-shim': 5.4.1 + is-subdir: 1.2.0 + is-windows: 1.0.2 + mz: 2.7.0 + normalize-path: 3.0.0 + p-settle: 4.1.1 + ramda: 0.27.2 + dev: false + + /@pnpm/package-bins@4.1.0: + resolution: {integrity: sha512-57/ioGYLBbVRR80Ux9/q2i3y8Q+uQADc3c+Yse8jr/60YLOi3jcWz13e2Jy+ANYtZI258Qc5wk2X077rp0Ly/Q==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/types': 6.4.0 + fast-glob: 3.2.12 + is-subdir: 1.2.0 + dev: false + + /@pnpm/read-modules-dir@2.0.3: + resolution: {integrity: sha512-i9OgRvSlxrTS9a2oXokhDxvQzDtfqtsooJ9jaGoHkznue5aFCTSrNZFQ6M18o8hC03QWfnxaKi0BtOvNkKu2+A==} + engines: {node: '>=10.13'} + dependencies: + mz: 2.7.0 + dev: false + + /@pnpm/read-package-json@4.0.0: + resolution: {integrity: sha512-1cr2tEwe4YU6SI0Hmg+wnsr6yxBt2iJtqv6wrF84On8pS9hx4A2PLw3CIgbwxaG0b+ur5wzhNogwl4qD5FLFNg==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/types': 6.4.0 + load-json-file: 6.2.0 + normalize-package-data: 3.0.3 + dev: false + + /@pnpm/read-project-manifest@1.1.7: + resolution: {integrity: sha512-tj8ExXZeDcMmMUj7D292ETe/RiEirr1X1wpT6Zy85z2MrFYoG9jfCJpps40OdZBNZBhxbuKtGPWKVSgXD0yrVw==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/types': 6.4.0 + '@pnpm/write-project-manifest': 1.1.7 + detect-indent: 6.1.0 + fast-deep-equal: 3.1.3 + graceful-fs: 4.2.4 + is-windows: 1.0.2 + json5: 2.2.3 + parse-json: 5.2.0 + read-yaml-file: 2.1.0 + sort-keys: 4.2.0 + strip-bom: 4.0.0 + dev: false + + /@pnpm/types@6.4.0: + resolution: {integrity: sha512-nco4+4sZqNHn60Y4VE/fbtlShCBqipyUO+nKRPvDHqLrecMW9pzHWMVRxk4nrMRoeowj3q0rX3GYRBa8lsHTAg==} + engines: {node: '>=10.16'} + dev: false + + /@pnpm/types@8.9.0: + resolution: {integrity: sha512-3MYHYm8epnciApn6w5Fzx6sepawmsNU7l6lvIq+ER22/DPSrr83YMhU/EQWnf4lORn2YyiXFj0FJSyJzEtIGmw==} + engines: {node: '>=14.6'} + dev: false + + /@pnpm/write-project-manifest@1.1.7: + resolution: {integrity: sha512-OLkDZSqkA1mkoPNPvLFXyI6fb0enCuFji6Zfditi/CLAo9kmIhQFmEUDu4krSB8i908EljG8YwL5Xjxzm5wsWA==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/types': 6.4.0 + json5: 2.2.3 + mz: 2.7.0 + write-file-atomic: 3.0.3 + write-yaml-file: 4.2.0 + dev: false + + /@rushstack/heft-config-file@0.11.9(@types/node@0.0.0): + resolution: {integrity: sha512-01JFmD+G44v5btO0fVIbVBJCfGWLTN2l4Y/+IVU8D9eR14+wYJjV5CO25uxydDynMr334URFcITuzG21L9L0GA==} + engines: {node: '>=10.13.0'} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rig-package': 0.3.18 + jsonpath-plus: 4.0.0 + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/node-core-library@3.55.2(@types/node@0.0.0): + resolution: {integrity: sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 0.0.0 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.2 + semver: 7.3.8 + z-schema: 5.0.5 + dev: false + + /@rushstack/package-deps-hash@4.0.10(@types/node@0.0.0): + resolution: {integrity: sha512-oW4M9olWay3qIpIULtpolh0MY1QprY2CqrrgUl7NpyMn1/r0laT8EUbkTylWRnytvXaNTDBlRz99+CdU1DKqgA==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/rig-package@0.3.18: + resolution: {integrity: sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==} + dependencies: + resolve: 1.22.2 + strip-json-comments: 3.1.1 + dev: false + + /@rushstack/rush-amazon-s3-build-cache-plugin@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-NCZ5YscW9Qi9avvgspE76dfHtCcsSMpfm3X4D9gaTcGPyE7RpWY5yMTZhO31Z5g0NM6cw6eWEfKwJvZ5nGbnBQ==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rush-sdk': 5.94.1(@types/node@0.0.0) + https-proxy-agent: 5.0.1 + node-fetch: 2.6.7 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@rushstack/rush-azure-storage-build-cache-plugin@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-uIdyoeGHyFlAnmAHF0KKDsg5KBde9nRl15x8wTr/zwzwydMMIdbfxHAMc3C78YE05SUYeIIut4qh5KCoEn9/Hw==} + dependencies: + '@azure/identity': 2.1.0 + '@azure/storage-blob': 12.11.0 + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rush-sdk': 5.94.1(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@rushstack/rush-sdk@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-T5euwYB4GzBGGCWCdk0djjHqsI7boGWKjutyNb+AguB7WsnRjDujEHC7CdosYtbsJo5caIwEdi9sspiaS4vyjA==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@types/node-fetch': 2.6.2 + tapable: 2.2.1 + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/stream-collator@4.0.228(@types/node@0.0.0): + resolution: {integrity: sha512-x7KR0IVNOEZBegdw7u2LVugD0U9uMw3IR1gPwV9bNWEC01cObc+9wk21suUxkzDtMVdKcNYoiZ814WnUqOF7pQ==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/terminal@0.5.3(@types/node@0.0.0): + resolution: {integrity: sha512-AFKlWyw6C3vWvRrkXIcchxUooNHSzZ0AS5mGbdon3tjnxhqnMitjdk0WZl2382i50Zz3WE6Fd3LFurVbrNrEyw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@types/node': 0.0.0 + wordwrap: 1.0.0 + dev: false + + /@rushstack/ts-command-line@4.13.2: + resolution: {integrity: sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.1 + dev: false + + /@sindresorhus/is@0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + dev: false + + /@szmarczak/http-timer@1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + dependencies: + defer-to-connect: 1.1.3 + dev: false + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: false + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: false + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@types/lodash@4.14.194: + resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} + dev: false + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: false + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + + /@types/node-fetch@2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 0.0.0 + form-data: 3.0.1 + dev: false + + /@types/node@0.0.0: + resolution: {integrity: sha512-WTVTibPZsmWNm4thlkPnc0QPbT4+Vw+48e4otLxwdBVZduwrZ2pDvAH9dnpOe/fQnNl84PO4XOq3dHAyjaornA==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: false + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@types/tunnel@0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: false + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.16.4 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.22 + source-map: 0.6.1 + dev: false + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: false + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + dev: false + + /@yarnpkg/lockfile@1.0.2: + resolution: {integrity: sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==} + dev: false + + /@zkochan/cmd-shim@5.4.1: + resolution: {integrity: sha512-odWb1qUzt0dIOEUPyWBEpFDYQPRjEMr/dbHHAfgBkVkYR9aO7Zo+I7oYWrXIxl+cKlC7+49ftPm8uJxL1MA9kw==} + engines: {node: '>=10.13'} + dependencies: + cmd-extension: 1.0.2 + graceful-fs: 4.2.11 + is-windows: 1.0.2 + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: false + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: false + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: false + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: false + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules@3.1.0: + resolution: {integrity: sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==} + engines: {node: '>=6'} + dev: false + + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + dev: false + + /cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: false + + /cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + dev: false + + /callsite-record@4.1.5: + resolution: {integrity: sha512-OqeheDucGKifjQRx524URgV4z4NaKjocGhygTptDea+DLROre4ZEecA4KXDq+P7qlGCohYVNOh3qr+y5XH5Ftg==} + dependencies: + '@devexpress/error-stack-parser': 2.0.6 + '@types/lodash': 4.14.194 + callsite: 1.0.0 + chalk: 2.4.2 + highlight-es: 1.0.3 + lodash: 4.17.21 + pinkie-promise: 2.0.1 + dev: false + + /callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.8.0: + resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} + engines: {node: '>=6'} + dev: false + + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + dependencies: + colors: 1.0.3 + dev: false + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: false + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: false + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /cmd-extension@1.0.2: + resolution: {integrity: sha512-iWDjmP8kvsMdBmLTHxFaqXikO8EdFRDfim7k6vUHglY/2xJ5jLrPsnQGijdfp4U+sr/BeecG0wKm02dSIAeQ1g==} + engines: {node: '>=10'} + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + dev: false + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: false + + /commitizen@4.2.5: + resolution: {integrity: sha512-9sXju8Qrz1B4Tw7kC5KhnvwYQN88qs2zbiB8oyMsnXZyJ24PPGiNM3nHr73d32dnE3i8VJEXddBFIbOgYSEXtQ==} + engines: {node: '>= 12'} + hasBin: true + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.4 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.6 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: false + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: false + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: false + + /conventional-changelog-conventionalcommits@5.0.0: + resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: false + + /conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + dev: false + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig-typescript-loader@4.3.0(@types/node@0.0.0)(cosmiconfig@8.1.3)(ts-node@10.9.0)(typescript@5.0.2): + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': 0.0.0 + cosmiconfig: 8.1.3 + ts-node: 10.9.0(@types/node@0.0.0)(typescript@5.0.2) + typescript: 5.0.2 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false + + /cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + dependencies: + chalk: 2.4.2 + commitizen: 4.2.5 + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.3 + optionalDependencies: + '@commitlint/load': 17.5.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: false + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + dev: false + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: false + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: false + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: false + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /depcheck@1.4.3: + resolution: {integrity: sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@babel/parser': 7.16.4 + '@babel/traverse': 7.21.4 + '@vue/compiler-sfc': 3.2.47 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + debug: 4.3.4 + deps-regex: 0.1.4 + ignore: 5.1.9 + is-core-module: 2.12.0 + js-yaml: 3.14.1 + json5: 2.2.3 + lodash: 4.17.21 + minimatch: 3.1.2 + multimatch: 5.0.0 + please-upgrade-node: 3.2.0 + query-ast: 1.0.5 + readdirp: 3.6.0 + require-package-name: 2.0.1 + resolve: 1.22.2 + sass: 1.62.0 + scss-parser: 1.0.6 + semver: 7.3.8 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /dependency-path@9.2.8: + resolution: {integrity: sha512-S0OhIK7sIyAsph8hVH/LMCTDL3jozKtlrPx3dMQrlE2nAlXTquTT+AcOufphDMTQqLkfn4acvfiem9I1IWZ4jQ==} + engines: {node: '>=14.6'} + dependencies: + '@pnpm/crypto.base32-hash': 1.0.1 + '@pnpm/types': 8.9.0 + encode-registry: 3.0.0 + semver: 7.3.8 + dev: false + + /deps-regex@0.1.4: + resolution: {integrity: sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==} + dev: false + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: false + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: false + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: false + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /encode-registry@3.0.0: + resolution: {integrity: sha512-2fRYji8K6FwYuQ6EPBKR/J9mcqb7kIoNqt1vGvJr3NrvKfncRiNm00Oxo6gi/YJF8R5Sp2bNFSFdGKTG0rje1Q==} + engines: {node: '>=10'} + dependencies: + mem: 8.1.1 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: false + + /eslint-utils@3.0.0(eslint@8.18.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.18.0 + eslint-visitor-keys: 2.1.0 + dev: false + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: false + + /eslint-visitor-keys@3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /eslint@8.18.0: + resolution: {integrity: sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-utils: 3.0.0(eslint@8.18.0) + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /espree@9.5.1: + resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.0 + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: false + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: false + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /execa@6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /figures@3.0.0: + resolution: {integrity: sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: false + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + dev: false + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: false + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: false + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: false + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: false + + /git-repo-info@2.1.1: + resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} + engines: {node: '>= 4.0'} + dev: false + + /giturl@1.0.1: + resolution: {integrity: sha512-wQourBdI13n8tbjcZTDl6k+ZrCRMU6p9vfp9jknZq+zfWc8xXNztpZFM4XkPHVzHcMSUZxEMYYKZjIGkPlei6Q==} + engines: {node: '>= 0.10.0'} + dev: false + + /glob-escape@0.0.2: + resolution: {integrity: sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==} + engines: {node: '>= 0.10'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@7.0.6: + resolution: {integrity: sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: false + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: false + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: false + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.0 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graceful-fs@4.2.4: + resolution: {integrity: sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==} + dev: false + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /highlight-es@1.0.3: + resolution: {integrity: sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==} + dependencies: + chalk: 2.4.2 + is-es2016-keyword: 1.0.0 + js-tokens: 3.0.2 + dev: false + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: false + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /human-signals@3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore-walk@3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + dependencies: + minimatch: 3.1.2 + dev: false + + /ignore@5.1.9: + resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} + engines: {node: '>= 4'} + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + dev: false + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: false + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.0.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: false + + /inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: false + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-es2016-keyword@1.0.0: + resolution: {integrity: sha512-JtZWPUwjdbQ1LIo9OSZ8MdkWEve198ors27vH+RzUUvZXXZkzXCxFnlUhzWYxy5IexQSRiXVw9j2q/tHMmkVYQ==} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: false + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: false + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: false + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: false + + /js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: false + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: false + + /jsonpath-plus@4.0.0: + resolution: {integrity: sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==} + engines: {node: '>=10.0'} + dev: false + + /jsonwebtoken@9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.3.8 + dev: false + + /jszip@3.8.0: + resolution: {integrity: sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + set-immediate-shim: 1.0.1 + dev: false + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + dev: false + + /keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + dependencies: + package-json: 6.5.0 + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lilconfig@2.0.5: + resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + engines: {node: '>=10'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /lint-staged@13.0.3: + resolution: {integrity: sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + commander: 9.5.0 + debug: 4.3.4 + execa: 6.1.0 + lilconfig: 2.0.5 + listr2: 4.0.5 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.2.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: false + + /listr2@4.0.5: + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} + engines: {node: '>=12'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: false + + /load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: false + + /lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: false + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: false + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: false + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: false + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: false + + /longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: false + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: false + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: false + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: false + + /mem@8.1.1: + resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} + engines: {node: '>=10'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 3.1.0 + dev: false + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: false + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: false + + /minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: false + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: false + + /npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: false + + /npm-check@6.0.1: + resolution: {integrity: sha512-tlEhXU3689VLUHYEZTS/BC61vfeN2xSSZwoWDT6WLuenZTpDmGmNT5mtl15erTR0/A15ldK06/NEKg9jYJ9OTQ==} + engines: {node: '>=10.9.0'} + hasBin: true + dependencies: + callsite-record: 4.1.5 + chalk: 4.1.2 + co: 4.6.0 + depcheck: 1.4.3 + execa: 5.1.1 + giturl: 1.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + inquirer: 7.3.3 + is-ci: 2.0.0 + lodash: 4.17.21 + meow: 9.0.0 + minimatch: 3.1.2 + node-emoji: 1.11.0 + ora: 5.4.1 + package-json: 6.5.0 + path-exists: 4.0.0 + pkg-dir: 5.0.0 + preferred-pm: 3.0.3 + rc-config-loader: 4.1.2 + semver: 7.3.8 + semver-diff: 3.1.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + throat: 6.0.2 + update-notifier: 5.1.0 + xtend: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: false + + /npm-package-arg@6.1.1: + resolution: {integrity: sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==} + dependencies: + hosted-git-info: 2.8.9 + osenv: 0.1.5 + semver: 5.7.1 + validate-npm-package-name: 3.0.0 + dev: false + + /npm-packlist@2.1.5: + resolution: {integrity: sha512-KCfK3Vi2F+PH1klYauoQzg81GQ8/GGjQRKYY6tRnpQUPKTs/1gBZSRWtTEd7jGdSn1LZL7gpAmJT+BcS55k2XQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 3.0.4 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.8.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: false + + /p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: false + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /p-reflect@2.1.0: + resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==} + engines: {node: '>=8'} + dev: false + + /p-settle@4.1.1: + resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==} + engines: {node: '>=10'} + dependencies: + p-limit: 2.3.0 + p-reflect: 2.1.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.2 + registry-url: 5.1.0 + semver: 6.3.0 + dev: false + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: false + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: false + + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + dependencies: + semver-compare: 1.0.0 + dev: false + + /postcss@8.4.22: + resolution: {integrity: sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: false + + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: false + + /prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: false + + /pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + dependencies: + escape-goat: 2.1.1 + dev: false + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: false + + /query-ast@1.0.5: + resolution: {integrity: sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw==} + dependencies: + invariant: 2.2.4 + lodash: 4.17.21 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: false + + /ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + dev: false + + /rc-config-loader@4.1.2: + resolution: {integrity: sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==} + dependencies: + debug: 4.3.4 + js-yaml: 4.1.0 + json5: 2.2.3 + require-from-string: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.6 + strip-json-comments: 2.0.1 + dev: false + + /read-package-json@2.1.2: + resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==} + dependencies: + glob: 7.2.3 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 2.5.0 + npm-normalize-package-bin: 1.0.1 + dev: false + + /read-package-tree@5.1.6: + resolution: {integrity: sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==} + deprecated: The functionality that this package provided is now in @npmcli/arborist + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + once: 1.4.0 + read-package-json: 2.1.2 + readdir-scoped-modules: 1.1.0 + dev: false + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: false + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: false + + /read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + dependencies: + js-yaml: 4.1.0 + strip-bom: 4.0.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdir-scoped-modules@1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: false + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: false + + /registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + dependencies: + rc: 1.2.8 + dev: false + + /registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + dependencies: + rc: 1.2.8 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rfc4648@1.5.2: + resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==} + dev: false + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.5.0 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sass@1.62.0: + resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /scss-parser@1.0.6: + resolution: {integrity: sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w==} + engines: {node: '>=6.0.0'} + dependencies: + invariant: 2.2.4 + lodash: 4.17.21 + dev: false + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: false + + /semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: false + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: false + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /set-immediate-shim@1.0.1: + resolution: {integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==} + engines: {node: '>=0.10.0'} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: false + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: false + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: false + + /sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + dependencies: + is-plain-obj: 2.1.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: false + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: false + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: false + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + + /tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 4.2.8 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: false + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: false + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: false + + /true-case-path@2.2.1: + resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} + dev: false + + /ts-node@10.9.0(@types/node@0.0.0)(typescript@5.0.2): + resolution: {integrity: sha512-bunW18GUyaCSYRev4DPf4SQpom3pWH29wKl0sDk5zE7ze19RImEVhCW7K4v3hHKkUyfWotU08ToE2RS+Y49aug==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 0.0.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: false + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: false + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: false + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false + + /update-notifier@5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} + engines: {node: '>=10'} + dependencies: + boxen: 5.1.2 + chalk: 4.1.2 + 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.8 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: false + + /url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: false + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: false + + /validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + dependencies: + builtins: 1.0.3 + dev: false + + /validator@13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: false + + /word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + + /write-yaml-file@4.2.0: + resolution: {integrity: sha512-LwyucHy0uhWqbrOkh9cBluZBeNVxzHjDaE9mwepZG3n3ZlbM4v3ndrFw51zW/NXYFFqP+QWZ72ihtLWTh05e4Q==} + engines: {node: '>=10.13'} + dependencies: + js-yaml: 4.1.0 + write-file-atomic: 3.0.3 + dev: false + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: false + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + engines: {node: '>= 14'} + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.9.0 + optionalDependencies: + commander: 9.5.0 + dev: false diff --git a/common/autoinstallers/lint/prettier.ts b/common/autoinstallers/lint/prettier.ts new file mode 100644 index 0000000..4748c05 --- /dev/null +++ b/common/autoinstallers/lint/prettier.ts @@ -0,0 +1,44 @@ +import minimist, { ParsedArgs } from "minimist"; +import { spawnSync } from "child_process"; +import { RushConfiguration } from "@microsoft/rush-lib"; + +interface PrettierScriptArgv extends ParsedArgs { + dir?: string; + ext?: string; +} + +function run() { + const cwd = process.cwd(); + const rushConfiguration = RushConfiguration.loadFromDefaultLocation({ startingFolder: cwd }); + + const argv: PrettierScriptArgv = minimist(process.argv.slice(2)); + const configFilePath = rushConfiguration.rushJsonFolder + "/.prettierrc.js"; + const ignoreFilePath = rushConfiguration.rushJsonFolder + "/.prettierignore"; + + let ext = "{ts,tsx,less}"; + if (argv.ext) { + const length = argv.ext.split(",").length; + ext = length === 1 ? `${argv.ext}` : `{${argv.ext}}`; + } + + let patterns = `{apps,libs}/**/src/**/**/*.${ext}`; + if (argv.dir) { + patterns = `${argv.dir}/src/**/**/*.${ext}`; + } + + console.log(patterns); + + spawnSync( + "sh", + [ + "-c", + `prettier --config ${configFilePath} --ignore-path ${ignoreFilePath} --write ${patterns}`, + ], + { + shell: false, + stdio: [0, 1, 2], + }, + ); +} + +run(); diff --git a/common/autoinstallers/lint/tsconfig.json b/common/autoinstallers/lint/tsconfig.json new file mode 100644 index 0000000..57b9dd9 --- /dev/null +++ b/common/autoinstallers/lint/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + "target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "module": "ESNext" /* Specify what module code is generated. */, + "rootDir": "./" /* Specify the root folder within your source files. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + "types": ["node"] /* Disable emitting comments. */, + "noEmit": true /* Disable emitting files from a compilation. */, + "noEmitOnError": true /* Disable emitting files if any type checking errors are reported. */, + + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied `any` type.. */, + "strictNullChecks": true /* When type checking, take into account `null` and `undefined`. */, + "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */, + "strictBindCallApply": true /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */, + "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, + "noImplicitThis": true /* Enable error reporting when `this` is given the type `any`. */, + "useUnknownInCatchVariables": true /* Type catch clause variables as 'unknown' instead of 'any'. */, + "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, + "noUnusedLocals": true /* Enable error reporting when a local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, + "exactOptionalPropertyTypes": true /* Interpret optional property types as written, rather than adding 'undefined'. */, + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, + "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an override modifier. */, + "noPropertyAccessFromIndexSignature": true /* Enforces using indexed accessors for keys declared using an indexed type */, + "allowUnusedLabels": false /* Disable error reporting for unused labels. */, + "allowUnreachableCode": false /* Disable error reporting for unreachable code. */, + + /* Completeness */ + "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "module": "commonjs" + } + } +} diff --git a/common/autoinstallers/run-script/package.json b/common/autoinstallers/run-script/package.json new file mode 100644 index 0000000..54438a9 --- /dev/null +++ b/common/autoinstallers/run-script/package.json @@ -0,0 +1,15 @@ +{ + "name": "run-script", + "version": "0.0.1", + "private": true, + "dependencies": { + "@microsoft/rush-lib": "5.94.1", + "minimist": "1.2.6", + "ts-node": "10.9.0" + }, + "devDependencies": { + "@types/node": "*", + "@types/minimist": "1.2.2", + "typescript": "5.0.2" + } +} diff --git a/common/autoinstallers/run-script/pnpm-lock.yaml b/common/autoinstallers/run-script/pnpm-lock.yaml new file mode 100644 index 0000000..3dd05e1 --- /dev/null +++ b/common/autoinstallers/run-script/pnpm-lock.yaml @@ -0,0 +1,3717 @@ +lockfileVersion: '6.0' + +dependencies: + '@microsoft/rush-lib': + specifier: 5.94.1 + version: 5.94.1(@types/node@0.0.0) + minimist: + specifier: 1.2.6 + version: 1.2.6 + ts-node: + specifier: 10.9.0 + version: 10.9.0(@types/node@0.0.0)(typescript@5.0.2) + +devDependencies: + '@types/minimist': + specifier: 1.2.2 + version: 1.2.2 + '@types/node': + specifier: '*' + version: 0.0.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + +packages: + + /@azure/abort-controller@1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-auth@1.4.0: + resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + dev: false + + /@azure/core-client@1.7.2: + resolution: {integrity: sha512-ye5554gnVnXdfZ64hptUtETgacXoRWxYv1JF5MctoAzTSH5dXhDPZd9gOjDPyWMcLIk58pnP5+p5vGX6PYn1ag==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-rest-pipeline': 1.10.3 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-http@2.3.2: + resolution: {integrity: sha512-Z4dfbglV9kNZO177CNx4bo5ekFuYwwsvjLiKdZI4r84bYGv3irrbQz7JC3/rUfFH2l4T/W6OFleJaa2X0IaQqw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + '@types/node-fetch': 2.6.2 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.6.7 + process: 0.11.10 + tough-cookie: 4.1.2 + tslib: 2.5.0 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@azure/core-lro@2.5.2: + resolution: {integrity: sha512-tucUutPhBwCPu6v16KEFYML81npEL6gnT+iwewXvK5ZD55sr0/Vw2jfQETMiKVeARRrXHB2QQ3SpxxGi1zAUWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + tslib: 2.5.0 + dev: false + + /@azure/core-paging@1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-rest-pipeline@1.10.3: + resolution: {integrity: sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + form-data: 4.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/core-tracing@1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.4.1 + tslib: 2.5.0 + dev: false + + /@azure/core-tracing@1.0.1: + resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/core-util@1.3.1: + resolution: {integrity: sha512-pjfOUAb+MPLODhGuXot/Hy8wUgPD0UTqYkY3BiYcwEETrLcUCVM1t0roIvlQMgvn1lc48TGy5bsonsFpF862Jw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + dev: false + + /@azure/identity@2.1.0: + resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.2 + '@azure/core-rest-pipeline': 1.10.3 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.3.1 + '@azure/logger': 1.0.4 + '@azure/msal-browser': 2.36.0 + '@azure/msal-common': 7.6.0 + '@azure/msal-node': 1.17.1 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.2 + stoppable: 1.1.0 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/logger@1.0.4: + resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@azure/msal-browser@2.36.0: + resolution: {integrity: sha512-OrVDZ9ftO7ExqZVHripAt+doKg6G14YbP2LoSygiWQoSqoO4CejoXLRLqANc/HGg18N0p/oaRETw4IHZvwsxZw==} + engines: {node: '>=0.8.0'} + dependencies: + '@azure/msal-common': 12.1.0 + dev: false + + /@azure/msal-common@12.1.0: + resolution: {integrity: sha512-9RUiv0evSHvYtvF7r9ksShw9FgCeT6Rf6JB/SOMbMzI0VySZDUBSE+0b9e7DgL2Ph8wSARIh3m8c5pCK9TRY3w==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-common@7.6.0: + resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-node@1.17.1: + resolution: {integrity: sha512-1lC80yV+Y/gHqkYJ21Qy1Ej/cI/Kt1JcdY0xiM7/+mcEuBAkArR9B1YMY538PMZ5GfyVlYkCHYh/N0CBD5FJlQ==} + engines: {node: 10 || 12 || 14 || 16 || 18} + dependencies: + '@azure/msal-common': 12.1.0 + jsonwebtoken: 9.0.0 + uuid: 8.3.2 + dev: false + + /@azure/storage-blob@12.11.0: + resolution: {integrity: sha512-na+FisoARuaOWaHWpmdtk3FeuTWf2VWamdJ9/TJJzj5ZdXPLC3juoDgFs6XVuJIoK30yuBpyFBEDXVRK4pB7Tg==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 2.3.2 + '@azure/core-lro': 2.5.2 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.4 + events: 3.3.0 + tslib: 2.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: false + + /@babel/generator@7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: false + + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/parser@7.16.4: + resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/parser@7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: false + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + dev: false + + /@babel/traverse@7.21.4: + resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@devexpress/error-stack-parser@2.0.6: + resolution: {integrity: sha512-fneVypElGUH6Be39mlRZeAu00pccTlf4oVuzf9xPJD1cdEqI8NyAiQua/EW7lZdrbMUbgyXcJmfKPefhYius3A==} + dependencies: + stackframe: 1.3.4 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: false + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@microsoft/rush-lib@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-qXeqtYYe4ImyYyaAIR+ZdZEpNUeOZSaP+sbfksvDu9oa4kNH+5pCemII8NSfmQd9Dx7zPGPNiGf4zE4/Jcs6VA==} + engines: {node: '>=5.6.0'} + dependencies: + '@pnpm/link-bins': 5.3.25 + '@rushstack/heft-config-file': 0.11.9(@types/node@0.0.0) + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/package-deps-hash': 4.0.10(@types/node@0.0.0) + '@rushstack/rig-package': 0.3.18 + '@rushstack/rush-amazon-s3-build-cache-plugin': 5.94.1(@types/node@0.0.0) + '@rushstack/rush-azure-storage-build-cache-plugin': 5.94.1(@types/node@0.0.0) + '@rushstack/stream-collator': 4.0.228(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + '@rushstack/ts-command-line': 4.13.2 + '@types/node-fetch': 2.6.2 + '@yarnpkg/lockfile': 1.0.2 + builtin-modules: 3.1.0 + cli-table: 0.3.11 + colors: 1.2.5 + dependency-path: 9.2.8 + figures: 3.0.0 + git-repo-info: 2.1.1 + glob: 7.0.6 + glob-escape: 0.0.2 + https-proxy-agent: 5.0.1 + ignore: 5.1.9 + inquirer: 7.3.3 + js-yaml: 3.13.1 + jszip: 3.8.0 + lodash: 4.17.21 + node-fetch: 2.6.7 + npm-check: 6.0.1 + npm-package-arg: 6.1.1 + npm-packlist: 2.1.5 + read-package-tree: 5.1.6 + resolve: 1.22.2 + rxjs: 6.6.7 + semver: 7.3.8 + ssri: 8.0.1 + strict-uri-encode: 2.0.0 + tapable: 2.2.1 + tar: 6.1.13 + true-case-path: 2.2.1 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@opentelemetry/api@1.4.1: + resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} + engines: {node: '>=8.0.0'} + dev: false + + /@pnpm/crypto.base32-hash@1.0.1: + resolution: {integrity: sha512-pzAXNn6KxTA3kbcI3iEnYs4vtH51XEVqmK/1EiD18MaPKylhqy8UvMJK3zKG+jeP82cqQbozcTGm4yOQ8i3vNw==} + engines: {node: '>=14.6'} + dependencies: + rfc4648: 1.5.2 + dev: false + + /@pnpm/error@1.4.0: + resolution: {integrity: sha512-vxkRrkneBPVmP23kyjnYwVOtipwlSl6UfL+h+Xa3TrABJTz5rYBXemlTsU5BzST8U4pD7YDkTb3SQu+MMuIDKA==} + engines: {node: '>=10.16'} + dev: false + + /@pnpm/link-bins@5.3.25: + resolution: {integrity: sha512-9Xq8lLNRHFDqvYPXPgaiKkZ4rtdsm7izwM/cUsFDc5IMnG0QYIVBXQbgwhz2UvjUotbJrvfKLJaCfA3NGBnLDg==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/package-bins': 4.1.0 + '@pnpm/read-modules-dir': 2.0.3 + '@pnpm/read-package-json': 4.0.0 + '@pnpm/read-project-manifest': 1.1.7 + '@pnpm/types': 6.4.0 + '@zkochan/cmd-shim': 5.4.1 + is-subdir: 1.2.0 + is-windows: 1.0.2 + mz: 2.7.0 + normalize-path: 3.0.0 + p-settle: 4.1.1 + ramda: 0.27.2 + dev: false + + /@pnpm/package-bins@4.1.0: + resolution: {integrity: sha512-57/ioGYLBbVRR80Ux9/q2i3y8Q+uQADc3c+Yse8jr/60YLOi3jcWz13e2Jy+ANYtZI258Qc5wk2X077rp0Ly/Q==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/types': 6.4.0 + fast-glob: 3.2.12 + is-subdir: 1.2.0 + dev: false + + /@pnpm/read-modules-dir@2.0.3: + resolution: {integrity: sha512-i9OgRvSlxrTS9a2oXokhDxvQzDtfqtsooJ9jaGoHkznue5aFCTSrNZFQ6M18o8hC03QWfnxaKi0BtOvNkKu2+A==} + engines: {node: '>=10.13'} + dependencies: + mz: 2.7.0 + dev: false + + /@pnpm/read-package-json@4.0.0: + resolution: {integrity: sha512-1cr2tEwe4YU6SI0Hmg+wnsr6yxBt2iJtqv6wrF84On8pS9hx4A2PLw3CIgbwxaG0b+ur5wzhNogwl4qD5FLFNg==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/types': 6.4.0 + load-json-file: 6.2.0 + normalize-package-data: 3.0.3 + dev: false + + /@pnpm/read-project-manifest@1.1.7: + resolution: {integrity: sha512-tj8ExXZeDcMmMUj7D292ETe/RiEirr1X1wpT6Zy85z2MrFYoG9jfCJpps40OdZBNZBhxbuKtGPWKVSgXD0yrVw==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/error': 1.4.0 + '@pnpm/types': 6.4.0 + '@pnpm/write-project-manifest': 1.1.7 + detect-indent: 6.1.0 + fast-deep-equal: 3.1.3 + graceful-fs: 4.2.4 + is-windows: 1.0.2 + json5: 2.2.3 + parse-json: 5.2.0 + read-yaml-file: 2.1.0 + sort-keys: 4.2.0 + strip-bom: 4.0.0 + dev: false + + /@pnpm/types@6.4.0: + resolution: {integrity: sha512-nco4+4sZqNHn60Y4VE/fbtlShCBqipyUO+nKRPvDHqLrecMW9pzHWMVRxk4nrMRoeowj3q0rX3GYRBa8lsHTAg==} + engines: {node: '>=10.16'} + dev: false + + /@pnpm/types@8.9.0: + resolution: {integrity: sha512-3MYHYm8epnciApn6w5Fzx6sepawmsNU7l6lvIq+ER22/DPSrr83YMhU/EQWnf4lORn2YyiXFj0FJSyJzEtIGmw==} + engines: {node: '>=14.6'} + dev: false + + /@pnpm/write-project-manifest@1.1.7: + resolution: {integrity: sha512-OLkDZSqkA1mkoPNPvLFXyI6fb0enCuFji6Zfditi/CLAo9kmIhQFmEUDu4krSB8i908EljG8YwL5Xjxzm5wsWA==} + engines: {node: '>=10.16'} + dependencies: + '@pnpm/types': 6.4.0 + json5: 2.2.3 + mz: 2.7.0 + write-file-atomic: 3.0.3 + write-yaml-file: 4.2.0 + dev: false + + /@rushstack/heft-config-file@0.11.9(@types/node@0.0.0): + resolution: {integrity: sha512-01JFmD+G44v5btO0fVIbVBJCfGWLTN2l4Y/+IVU8D9eR14+wYJjV5CO25uxydDynMr334URFcITuzG21L9L0GA==} + engines: {node: '>=10.13.0'} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rig-package': 0.3.18 + jsonpath-plus: 4.0.0 + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/node-core-library@3.55.2(@types/node@0.0.0): + resolution: {integrity: sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 0.0.0 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.2 + semver: 7.3.8 + z-schema: 5.0.5 + dev: false + + /@rushstack/package-deps-hash@4.0.10(@types/node@0.0.0): + resolution: {integrity: sha512-oW4M9olWay3qIpIULtpolh0MY1QprY2CqrrgUl7NpyMn1/r0laT8EUbkTylWRnytvXaNTDBlRz99+CdU1DKqgA==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/rig-package@0.3.18: + resolution: {integrity: sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==} + dependencies: + resolve: 1.22.2 + strip-json-comments: 3.1.1 + dev: false + + /@rushstack/rush-amazon-s3-build-cache-plugin@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-NCZ5YscW9Qi9avvgspE76dfHtCcsSMpfm3X4D9gaTcGPyE7RpWY5yMTZhO31Z5g0NM6cw6eWEfKwJvZ5nGbnBQ==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rush-sdk': 5.94.1(@types/node@0.0.0) + https-proxy-agent: 5.0.1 + node-fetch: 2.6.7 + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@rushstack/rush-azure-storage-build-cache-plugin@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-uIdyoeGHyFlAnmAHF0KKDsg5KBde9nRl15x8wTr/zwzwydMMIdbfxHAMc3C78YE05SUYeIIut4qh5KCoEn9/Hw==} + dependencies: + '@azure/identity': 2.1.0 + '@azure/storage-blob': 12.11.0 + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/rush-sdk': 5.94.1(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + - encoding + - supports-color + dev: false + + /@rushstack/rush-sdk@5.94.1(@types/node@0.0.0): + resolution: {integrity: sha512-T5euwYB4GzBGGCWCdk0djjHqsI7boGWKjutyNb+AguB7WsnRjDujEHC7CdosYtbsJo5caIwEdi9sspiaS4vyjA==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@types/node-fetch': 2.6.2 + tapable: 2.2.1 + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/stream-collator@4.0.228(@types/node@0.0.0): + resolution: {integrity: sha512-x7KR0IVNOEZBegdw7u2LVugD0U9uMw3IR1gPwV9bNWEC01cObc+9wk21suUxkzDtMVdKcNYoiZ814WnUqOF7pQ==} + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@rushstack/terminal': 0.5.3(@types/node@0.0.0) + transitivePeerDependencies: + - '@types/node' + dev: false + + /@rushstack/terminal@0.5.3(@types/node@0.0.0): + resolution: {integrity: sha512-AFKlWyw6C3vWvRrkXIcchxUooNHSzZ0AS5mGbdon3tjnxhqnMitjdk0WZl2382i50Zz3WE6Fd3LFurVbrNrEyw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 3.55.2(@types/node@0.0.0) + '@types/node': 0.0.0 + wordwrap: 1.0.0 + dev: false + + /@rushstack/ts-command-line@4.13.2: + resolution: {integrity: sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.1 + dev: false + + /@sindresorhus/is@0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + dev: false + + /@szmarczak/http-timer@1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + dependencies: + defer-to-connect: 1.1.3 + dev: false + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: false + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: false + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@types/lodash@4.14.194: + resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} + dev: false + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: false + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + + /@types/node-fetch@2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 0.0.0 + form-data: 3.0.1 + dev: false + + /@types/node@0.0.0: + resolution: {integrity: sha512-WTVTibPZsmWNm4thlkPnc0QPbT4+Vw+48e4otLxwdBVZduwrZ2pDvAH9dnpOe/fQnNl84PO4XOq3dHAyjaornA==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: false + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@types/tunnel@0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 0.0.0 + dev: false + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: false + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.16.4 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.22 + source-map: 0.6.1 + dev: false + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + dev: false + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.4 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: false + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + dev: false + + /@yarnpkg/lockfile@1.0.2: + resolution: {integrity: sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==} + dev: false + + /@zkochan/cmd-shim@5.4.1: + resolution: {integrity: sha512-odWb1qUzt0dIOEUPyWBEpFDYQPRjEMr/dbHHAfgBkVkYR9aO7Zo+I7oYWrXIxl+cKlC7+49ftPm8uJxL1MA9kw==} + engines: {node: '>=10.13'} + dependencies: + cmd-extension: 1.0.2 + graceful-fs: 4.2.11 + is-windows: 1.0.2 + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: false + + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: false + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules@3.1.0: + resolution: {integrity: sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==} + engines: {node: '>=6'} + dev: false + + /builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + dev: false + + /cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: false + + /callsite-record@4.1.5: + resolution: {integrity: sha512-OqeheDucGKifjQRx524URgV4z4NaKjocGhygTptDea+DLROre4ZEecA4KXDq+P7qlGCohYVNOh3qr+y5XH5Ftg==} + dependencies: + '@devexpress/error-stack-parser': 2.0.6 + '@types/lodash': 4.14.194 + callsite: 1.0.0 + chalk: 2.4.2 + highlight-es: 1.0.3 + lodash: 4.17.21 + pinkie-promise: 2.0.1 + dev: false + + /callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: false + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.8.0: + resolution: {integrity: sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==} + engines: {node: '>=6'} + dev: false + + /cli-table@0.3.11: + resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} + engines: {node: '>= 0.2.0'} + dependencies: + colors: 1.0.3 + dev: false + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /cmd-extension@1.0.2: + resolution: {integrity: sha512-iWDjmP8kvsMdBmLTHxFaqXikO8EdFRDfim7k6vUHglY/2xJ5jLrPsnQGijdfp4U+sr/BeecG0wKm02dSIAeQ1g==} + engines: {node: '>=10'} + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + dev: false + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: false + optional: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /debuglog@1.0.1: + resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + dev: false + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: false + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: false + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /depcheck@1.4.3: + resolution: {integrity: sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@babel/parser': 7.16.4 + '@babel/traverse': 7.21.4 + '@vue/compiler-sfc': 3.2.47 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + debug: 4.3.4 + deps-regex: 0.1.4 + ignore: 5.1.9 + is-core-module: 2.12.0 + js-yaml: 3.14.1 + json5: 2.2.3 + lodash: 4.17.21 + minimatch: 3.1.2 + multimatch: 5.0.0 + please-upgrade-node: 3.2.0 + query-ast: 1.0.5 + readdirp: 3.6.0 + require-package-name: 2.0.1 + resolve: 1.22.2 + sass: 1.62.0 + scss-parser: 1.0.6 + semver: 7.3.8 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /dependency-path@9.2.8: + resolution: {integrity: sha512-S0OhIK7sIyAsph8hVH/LMCTDL3jozKtlrPx3dMQrlE2nAlXTquTT+AcOufphDMTQqLkfn4acvfiem9I1IWZ4jQ==} + engines: {node: '>=14.6'} + dependencies: + '@pnpm/crypto.base32-hash': 1.0.1 + '@pnpm/types': 8.9.0 + encode-registry: 3.0.0 + semver: 7.3.8 + dev: false + + /deps-regex@0.1.4: + resolution: {integrity: sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==} + dev: false + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: false + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: false + + /duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /encode-registry@3.0.0: + resolution: {integrity: sha512-2fRYji8K6FwYuQ6EPBKR/J9mcqb7kIoNqt1vGvJr3NrvKfncRiNm00Oxo6gi/YJF8R5Sp2bNFSFdGKTG0rje1Q==} + engines: {node: '>=10'} + dependencies: + mem: 8.1.1 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /figures@3.0.0: + resolution: {integrity: sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /git-repo-info@2.1.1: + resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} + engines: {node: '>= 4.0'} + dev: false + + /giturl@1.0.1: + resolution: {integrity: sha512-wQourBdI13n8tbjcZTDl6k+ZrCRMU6p9vfp9jknZq+zfWc8xXNztpZFM4XkPHVzHcMSUZxEMYYKZjIGkPlei6Q==} + engines: {node: '>= 0.10.0'} + dev: false + + /glob-escape@0.0.2: + resolution: {integrity: sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==} + engines: {node: '>= 0.10'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@7.0.6: + resolution: {integrity: sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: false + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: false + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.0 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graceful-fs@4.2.4: + resolution: {integrity: sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==} + dev: false + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /highlight-es@1.0.3: + resolution: {integrity: sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==} + dependencies: + chalk: 2.4.2 + is-es2016-keyword: 1.0.0 + js-tokens: 3.0.2 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: false + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore-walk@3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + dependencies: + minimatch: 3.1.2 + dev: false + + /ignore@5.1.9: + resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} + engines: {node: '>= 4'} + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + dev: false + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: false + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.0.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: false + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-es2016-keyword@1.0.0: + resolution: {integrity: sha512-JtZWPUwjdbQ1LIo9OSZ8MdkWEve198ors27vH+RzUUvZXXZkzXCxFnlUhzWYxy5IexQSRiXVw9j2q/tHMmkVYQ==} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: false + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: false + + /js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonpath-plus@4.0.0: + resolution: {integrity: sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==} + engines: {node: '>=10.0'} + dev: false + + /jsonwebtoken@9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.3.8 + dev: false + + /jszip@3.8.0: + resolution: {integrity: sha512-cnpQrXvFSLdsR9KR5/x7zdf6c3m8IhZfZzSblFEHSqBaVwD2nvJ4CuCKLyvKvwBgZm08CgfSoiTBQLm5WW9hGw==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + set-immediate-shim: 1.0.1 + dev: false + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + dev: false + + /keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + dependencies: + package-json: 6.5.0 + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 5.2.0 + strip-bom: 4.0.0 + type-fest: 0.6.0 + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: false + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: false + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: false + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: false + + /mem@8.1.1: + resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} + engines: {node: '>=10'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 3.1.0 + dev: false + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + dev: false + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: false + + /minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: false + + /npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: false + + /npm-check@6.0.1: + resolution: {integrity: sha512-tlEhXU3689VLUHYEZTS/BC61vfeN2xSSZwoWDT6WLuenZTpDmGmNT5mtl15erTR0/A15ldK06/NEKg9jYJ9OTQ==} + engines: {node: '>=10.9.0'} + hasBin: true + dependencies: + callsite-record: 4.1.5 + chalk: 4.1.2 + co: 4.6.0 + depcheck: 1.4.3 + execa: 5.1.1 + giturl: 1.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + inquirer: 7.3.3 + is-ci: 2.0.0 + lodash: 4.17.21 + meow: 9.0.0 + minimatch: 3.1.2 + node-emoji: 1.11.0 + ora: 5.4.1 + package-json: 6.5.0 + path-exists: 4.0.0 + pkg-dir: 5.0.0 + preferred-pm: 3.0.3 + rc-config-loader: 4.1.2 + semver: 7.3.8 + semver-diff: 3.1.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + throat: 6.0.2 + update-notifier: 5.1.0 + xtend: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: false + + /npm-package-arg@6.1.1: + resolution: {integrity: sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==} + dependencies: + hosted-git-info: 2.8.9 + osenv: 0.1.5 + semver: 5.7.1 + validate-npm-package-name: 3.0.0 + dev: false + + /npm-packlist@2.1.5: + resolution: {integrity: sha512-KCfK3Vi2F+PH1klYauoQzg81GQ8/GGjQRKYY6tRnpQUPKTs/1gBZSRWtTEd7jGdSn1LZL7gpAmJT+BcS55k2XQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + glob: 7.2.3 + ignore-walk: 3.0.4 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.8.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: false + + /p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: false + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-reflect@2.1.0: + resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==} + engines: {node: '>=8'} + dev: false + + /p-settle@4.1.1: + resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==} + engines: {node: '>=10'} + dependencies: + p-limit: 2.3.0 + p-reflect: 2.1.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.2 + registry-url: 5.1.0 + semver: 6.3.0 + dev: false + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: false + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: false + + /please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + dependencies: + semver-compare: 1.0.0 + dev: false + + /postcss@8.4.22: + resolution: {integrity: sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: false + + /pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + dependencies: + escape-goat: 2.1.1 + dev: false + + /query-ast@1.0.5: + resolution: {integrity: sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw==} + dependencies: + invariant: 2.2.4 + lodash: 4.17.21 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: false + + /ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + dev: false + + /rc-config-loader@4.1.2: + resolution: {integrity: sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==} + dependencies: + debug: 4.3.4 + js-yaml: 4.1.0 + json5: 2.2.3 + require-from-string: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.6 + strip-json-comments: 2.0.1 + dev: false + + /read-package-json@2.1.2: + resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==} + dependencies: + glob: 7.2.3 + json-parse-even-better-errors: 2.3.1 + normalize-package-data: 2.5.0 + npm-normalize-package-bin: 1.0.1 + dev: false + + /read-package-tree@5.1.6: + resolution: {integrity: sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==} + deprecated: The functionality that this package provided is now in @npmcli/arborist + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + once: 1.4.0 + read-package-json: 2.1.2 + readdir-scoped-modules: 1.1.0 + dev: false + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: false + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: false + + /read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + dependencies: + js-yaml: 4.1.0 + strip-bom: 4.0.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdir-scoped-modules@1.1.0: + resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + debuglog: 1.0.1 + dezalgo: 1.0.4 + graceful-fs: 4.2.11 + once: 1.4.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: false + + /registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + dependencies: + rc: 1.2.8 + dev: false + + /registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + dependencies: + rc: 1.2.8 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rfc4648@1.5.2: + resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==} + dev: false + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sass@1.62.0: + resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /scss-parser@1.0.6: + resolution: {integrity: sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w==} + engines: {node: '>=6.0.0'} + dependencies: + invariant: 2.2.4 + lodash: 4.17.21 + dev: false + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: false + + /semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: false + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: false + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /set-immediate-shim@1.0.1: + resolution: {integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==} + engines: {node: '>=0.10.0'} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /sort-keys@4.2.0: + resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} + engines: {node: '>=8'} + dependencies: + is-plain-obj: 2.1.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: false + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: false + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + + /tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 4.2.8 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: false + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: false + + /true-case-path@2.2.1: + resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} + dev: false + + /ts-node@10.9.0(@types/node@0.0.0)(typescript@5.0.2): + resolution: {integrity: sha512-bunW18GUyaCSYRev4DPf4SQpom3pWH29wKl0sDk5zE7ze19RImEVhCW7K4v3hHKkUyfWotU08ToE2RS+Y49aug==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 0.0.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: false + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: false + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: false + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /update-notifier@5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} + engines: {node: '>=10'} + dependencies: + boxen: 5.1.2 + chalk: 4.1.2 + 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.8 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: false + + /url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: false + + /validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + dependencies: + builtins: 1.0.3 + dev: false + + /validator@13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + + /write-yaml-file@4.2.0: + resolution: {integrity: sha512-LwyucHy0uhWqbrOkh9cBluZBeNVxzHjDaE9mwepZG3n3ZlbM4v3ndrFw51zW/NXYFFqP+QWZ72ihtLWTh05e4Q==} + engines: {node: '>=10.13'} + dependencies: + js-yaml: 4.1.0 + write-file-atomic: 3.0.3 + dev: false + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: false + + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.9.0 + optionalDependencies: + commander: 9.5.0 + dev: false diff --git a/common/autoinstallers/run-script/run.ts b/common/autoinstallers/run-script/run.ts new file mode 100644 index 0000000..0b3895b --- /dev/null +++ b/common/autoinstallers/run-script/run.ts @@ -0,0 +1,27 @@ +import minimist, { ParsedArgs } from "minimist"; +import { RushConfiguration } from "@microsoft/rush-lib"; +import { spawnSync } from "child_process"; + +interface RunScriptArgv extends ParsedArgs { + project?: string; + script?: string; +} + +function run() { + const argv: RunScriptArgv = minimist(process.argv.slice(2)); + const projects = RushConfiguration.loadFromDefaultLocation({ + startingFolder: process.cwd(), + }); + + const targetProject = projects.findProjectByShorthandName(argv.project!); + + if (targetProject) { + spawnSync("sh", ["-c", `rushx ${argv.script}`], { + cwd: targetProject?.projectFolder, + shell: false, + stdio: [0, 1, 2], + }); + } +} + +run(); diff --git a/common/autoinstallers/run-script/start.ts b/common/autoinstallers/run-script/start.ts new file mode 100644 index 0000000..e9dc447 --- /dev/null +++ b/common/autoinstallers/run-script/start.ts @@ -0,0 +1,27 @@ +import { RushConfiguration } from "@microsoft/rush-lib"; +import { spawn } from "child_process"; + +function run() { + const projects = RushConfiguration.loadFromDefaultLocation({ + startingFolder: process.cwd(), + }); + + const server = projects.findProjectByShorthandName("@bit-cloud/api"); + const fe = projects.findProjectByShorthandName("@bit-cloud/fe"); + + if (server && fe) { + spawn("sh", ["-c", "rushx dev"], { + cwd: server.projectFolder, + shell: false, + stdio: [0, 1, 2], + }); + + spawn("sh", ["-c", "rushx dev"], { + cwd: fe.projectFolder, + shell: false, + stdio: [0, 1, 2], + }); + } +} + +run(); diff --git a/common/autoinstallers/run-script/tsconfig.json b/common/autoinstallers/run-script/tsconfig.json new file mode 100644 index 0000000..57b9dd9 --- /dev/null +++ b/common/autoinstallers/run-script/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + "target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "module": "ESNext" /* Specify what module code is generated. */, + "rootDir": "./" /* Specify the root folder within your source files. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + "types": ["node"] /* Disable emitting comments. */, + "noEmit": true /* Disable emitting files from a compilation. */, + "noEmitOnError": true /* Disable emitting files if any type checking errors are reported. */, + + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied `any` type.. */, + "strictNullChecks": true /* When type checking, take into account `null` and `undefined`. */, + "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */, + "strictBindCallApply": true /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */, + "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, + "noImplicitThis": true /* Enable error reporting when `this` is given the type `any`. */, + "useUnknownInCatchVariables": true /* Type catch clause variables as 'unknown' instead of 'any'. */, + "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, + "noUnusedLocals": true /* Enable error reporting when a local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, + "exactOptionalPropertyTypes": true /* Interpret optional property types as written, rather than adding 'undefined'. */, + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, + "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an override modifier. */, + "noPropertyAccessFromIndexSignature": true /* Enforces using indexed accessors for keys declared using an indexed type */, + "allowUnusedLabels": false /* Disable error reporting for unused labels. */, + "allowUnreachableCode": false /* Disable error reporting for unreachable code. */, + + /* Completeness */ + "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "module": "commonjs" + } + } +} diff --git a/common/config/rush/.npmrc b/common/config/rush/.npmrc new file mode 100644 index 0000000..a0df294 --- /dev/null +++ b/common/config/rush/.npmrc @@ -0,0 +1,22 @@ +# Rush uses this file to configure the NPM package registry during installation. It is applicable +# to PNPM, NPM, and Yarn package managers. It is used by operations such as "rush install", +# "rush update", and the "install-run.js" scripts. +# +# NOTE: The "rush publish" command uses .npmrc-publish instead. +# +# Before invoking the package manager, Rush will copy this file to the folder where installation +# is performed. The copied file will omit any config lines that reference environment variables +# that are undefined in that session; this avoids problems that would otherwise result due to +# a missing variable being replaced by an empty string. +# +# * * * SECURITY WARNING * * * +# +# It is NOT recommended to store authentication tokens in a text file on a lab machine, because +# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, +# for example if the machine loses power. A safer practice is to pass the token via an +# environment variable, which can be referenced from .npmrc using ${} expansion. For example: +# +# //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} +# +registry=https://registry.npmjs.org/ +always-auth=false \ No newline at end of file diff --git a/common/config/rush/.npmrc-publish b/common/config/rush/.npmrc-publish new file mode 100644 index 0000000..a3607cd --- /dev/null +++ b/common/config/rush/.npmrc-publish @@ -0,0 +1,21 @@ +# This config file is very similar to common/config/rush/.npmrc, except that .npmrc-publish +# is used by the "rush publish" command, as publishing often involves different credentials +# and registries than other operations. +# +# Before invoking the package manager, Rush will copy this file to "common/temp/publish-home/.npmrc" +# and then temporarily map that folder as the "home directory" for the current user account. +# This enables the same settings to apply for each project folder that gets published. The copied file +# will omit any config lines that reference environment variables that are undefined in that session; +# this avoids problems that would otherwise result due to a missing variable being replaced by +# an empty string. +# +# * * * SECURITY WARNING * * * +# +# It is NOT recommended to store authentication tokens in a text file on a lab machine, because +# other unrelated processes may be able to read the file. Also, the file may persist indefinitely, +# for example if the machine loses power. A safer practice is to pass the token via an +# environment variable, which can be referenced from .npmrc using ${} expansion. For example: +# +# +//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN} +# diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs new file mode 100644 index 0000000..b13d6ca --- /dev/null +++ b/common/config/rush/.pnpmfile.cjs @@ -0,0 +1,38 @@ +'use strict'; + +/** + * When using the PNPM package manager, you can use pnpmfile.js to workaround + * dependencies that have mistakes in their package.json file. (This feature is + * functionally similar to Yarn's "resolutions".) + * + * For details, see the PNPM documentation: + * https://pnpm.js.org/docs/en/hooks.html + * + * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE + * ANY CACHED DEPENDENCY ANALYSIS. After any modification to pnpmfile.js, it's recommended to run + * "rush update --full" so that PNPM will recalculate all version selections. + */ +module.exports = { + hooks: { + readPackage + } +}; + +/** + * This hook is invoked during installation before a package's dependencies + * are selected. + * The `packageJson` parameter is the deserialized package.json + * contents for the package that is about to be installed. + * The `context` parameter provides a log() function. + * The return value is the updated object. + */ +function readPackage(packageJson, context) { + + // // The karma types have a missing dependency on typings from the log4js package. + // if (packageJson.name === '@types/karma') { + // context.log('Fixed up dependencies for @types/karma'); + // packageJson.dependencies['log4js'] = '0.6.38'; + // } + + return packageJson; +} diff --git a/common/config/rush/artifactory.json b/common/config/rush/artifactory.json new file mode 100644 index 0000000..2680654 --- /dev/null +++ b/common/config/rush/artifactory.json @@ -0,0 +1,109 @@ +/** + * This configuration file manages Rush integration with JFrog Artifactory services. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/artifactory.schema.json", + + "packageRegistry": { + /** + * (Required) Set this to "true" to enable Rush to manage tokens for an Artifactory NPM registry. + * When enabled, "rush install" will automatically detect when the user's ~/.npmrc + * authentication token is missing or expired. And "rush setup" will prompt the user to + * renew their token. + * + * The default value is false. + */ + "enabled": false, + + /** + * (Required) Specify the URL of your NPM registry. This is the same URL that appears in + * your .npmrc file. It should look something like this example: + * + * https://your-company.jfrog.io/your-project/api/npm/npm-private/ + */ + "registryUrl": "", + + /** + * A list of custom strings that "rush setup" should add to the user's ~/.npmrc file at the time + * when the token is updated. This could be used for example to configure the company registry + * to be used whenever NPM is invoked as a standalone command (but it's not needed for Rush + * operations like "rush add" and "rush install", which get their mappings from the monorepo's + * common/config/rush/.npmrc file). + * + * NOTE: The ~/.npmrc settings are global for the user account on a given machine, so be careful + * about adding settings that may interfere with other work outside the monorepo. + */ + "userNpmrcLinesToAdd": [ + // "@example:registry=https://your-company.jfrog.io/your-project/api/npm/npm-private/" + ], + + /** + * (Required) Specifies the URL of the Artifactory control panel where the user can generate + * an API key. This URL is printed after the "visitWebsite" message. + * It should look something like this example: https://your-company.jfrog.io/ + * Specify an empty string to suppress this line entirely. + */ + "artifactoryWebsiteUrl": "", + + /** + * Uncomment this line to specify the type of credential to save in the user's ~/.npmrc file. + * The default is "password", which means the user's API token will be traded in for an + * npm password specific to that registry. Optionally you can specify "authToken", which + * will save the user's API token as credentials instead. + */ + // "credentialType": "password", + + /** + * These settings allow the "rush setup" interactive prompts to be customized, for + * example with messages specific to your team or configuration. Specify an empty string + * to suppress that message entirely. + */ + "messageOverrides": { + /** + * Overrides the message that normally says: + * "This monorepo consumes packages from an Artifactory private NPM registry." + */ + // "introduction": "", + + /** + * Overrides the message that normally says: + * "Please contact the repository maintainers for help with setting up an Artifactory user account." + */ + // "obtainAnAccount": "", + + /** + * Overrides the message that normally says: + * "Please open this URL in your web browser:" + * + * The "artifactoryWebsiteUrl" string is printed after this message. + */ + // "visitWebsite": "", + + /** + * Overrides the message that normally says: + * "Your user name appears in the upper-right corner of the JFrog website." + */ + // "locateUserName": "", + + /** + * Overrides the message that normally says: + * "Click 'Edit Profile' on the JFrog website. Click the 'Generate API Key' + * button if you haven't already done so previously." + */ + // "locateApiKey": "" + + /** + * Overrides the message that normally prompts: + * "What is your Artifactory user name?" + */ + // "userNamePrompt": "" + + /** + * Overrides the message that normally prompts: + * "What is your Artifactory API key?" + */ + // "apiKeyPrompt": "" + } + } +} diff --git a/common/config/rush/build-cache.json b/common/config/rush/build-cache.json new file mode 100644 index 0000000..45571cb --- /dev/null +++ b/common/config/rush/build-cache.json @@ -0,0 +1,100 @@ +/** + * This configuration file manages Rush's build cache feature. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/build-cache.schema.json", + + /** + * (Required) EXPERIMENTAL - Set this to true to enable the build cache feature. + * + * See https://rushjs.io/pages/maintainer/build_cache/ for details about this experimental feature. + */ + "buildCacheEnabled": false, + + /** + * (Required) Choose where project build outputs will be cached. + * + * Possible values: "local-only", "azure-blob-storage", "amazon-s3" + */ + "cacheProvider": "local-only", + + /** + * Setting this property overrides the cache entry ID. If this property is set, it must contain + * a [hash] token. + * + * Other available tokens: + * - [projectName] + * - [projectName:normalize] + * - [phaseName] + * - [phaseName:normalize] + * - [phaseName:trimPrefix] + */ + // "cacheEntryNamePattern": "[projectName:normalize]-[phaseName:normalize]-[hash]" + + /** + * Use this configuration with "cacheProvider"="azure-blob-storage" + */ + "azureBlobStorageConfiguration": { + /** + * (Required) The name of the the Azure storage account to use for build cache. + */ + // "storageAccountName": "example", + + /** + * (Required) The name of the container in the Azure storage account to use for build cache. + */ + // "storageContainerName": "my-container", + + /** + * The Azure environment the storage account exists in. Defaults to AzurePublicCloud. + * + * Possible values: "AzurePublicCloud", "AzureChina", "AzureGermany", "AzureGovernment" + */ + // "azureEnvironment": "AzurePublicCloud", + + /** + * An optional prefix for cache item blob names. + */ + // "blobPrefix": "my-prefix", + + /** + * If set to true, allow writing to the cache. Defaults to false. + */ + // "isCacheWriteAllowed": true + }, + + /** + * Use this configuration with "cacheProvider"="amazon-s3" + */ + "amazonS3Configuration": { + /** + * (Required unless s3Endpoint is specified) The name of the bucket to use for build cache. + * Example: "my-bucket" + */ + // "s3Bucket": "my-bucket", + + /** + * (Required unless s3Bucket is specified) The Amazon S3 endpoint of the bucket to use for build cache. + * This should not include any path; use the s3Prefix to set the path. + * Examples: "my-bucket.s3.us-east-2.amazonaws.com" or "http://localhost:9000" + */ + // "s3Endpoint": "https://my-bucket.s3.us-east-2.amazonaws.com", + + /** + * (Required) The Amazon S3 region of the bucket to use for build cache. + * Example: "us-east-1" + */ + // "s3Region": "us-east-1", + + /** + * An optional prefix ("folder") for cache items. It should not start with "/". + */ + // "s3Prefix": "my-prefix", + + /** + * If set to true, allow writing to the cache. Defaults to false. + */ + // "isCacheWriteAllowed": true + } +} diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json new file mode 100644 index 0000000..50cdf26 --- /dev/null +++ b/common/config/rush/command-line.json @@ -0,0 +1,191 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json", + "commands": [ + { + "name": "rebuild", + "summary": "", + "enableParallelism": false, + "commandKind": "bulk", + "ignoreMissingScript": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "name": "build", + "summary": "", + "enableParallelism": false, + "commandKind": "bulk", + "ignoreMissingScript": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "name": "eslint", + "summary": "", + "enableParallelism": false, + "commandKind": "bulk", + "ignoreMissingScript": true, + "ignoreDependencyOrder": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "name": "test", + "summary": "", + "enableParallelism": false, + "commandKind": "bulk", + "ignoreMissingScript": true, + "ignoreDependencyOrder": true, + "allowWarningsInSuccessfulBuild": true + }, + { + "name": "run", + "summary": "", + "commandKind": "global", + "autoinstallerName": "run-script", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "ts-node common/autoinstallers/run-script/run.ts" + }, + { + "commandKind": "global", + "name": "docs", + "summary": "Start the document development server", + "description": "Run this command to start document development server", + "shellCommand": "rush run -p @internal/docs -s start" + }, + { + "name": "commitlint", + "commandKind": "global", + "summary": "Used by the commit-msg Git hook. This command invokes commitlint to lint commit message.", + "autoinstallerName": "lint", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "node common/autoinstallers/lint/commit-lint.js" + }, + { + "name": "lint-staged", + "commandKind": "global", + "summary": "Used by the pre-commit Git hook. This command invokes eslint to lint staged changes.", + "autoinstallerName": "lint", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "lint-staged" + }, + { + "name": "prettier", + "commandKind": "global", + "summary": "Used by the pre-commit Git hook. This command invokes Prettier to reformat staged changes.", + "safeForSimultaneousRushProcesses": true, + "autoinstallerName": "lint", + "shellCommand": "ts-node common/autoinstallers/lint/prettier.ts" + }, + { + "name": "create", + "commandKind": "global", + "summary": "Create a project in 'packages' dir", + "autoinstallerName": "create", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "ts-node common/autoinstallers/create/src/cli.ts" + }, + { + "commandKind": "global", + "name": "story", + "summary": "Start the development server", + "description": "Run this command to start vstory development server", + "shellCommand": "rush run -p @visactor/vstory -s start" + }, + { + "name": "start", + "commandKind": "global", + "summary": "Start the development server", + "description": "Run this command to start VStory development server", + "shellCommand": "rush run -p @visactor/vstory -s start" + }, + { + "name": "change-all", + "commandKind": "global", + "autoinstallerName": "run-script", + "summary": "Run rush change width lint", + "description": "Run this command to start VStory development server", + "safeForSimultaneousRushProcesses": true, + "shellCommand": "ts-node common/autoinstallers/lint/change-all.ts" + }, + { + "name": "compile", + "summary": "", + "enableParallelism": false, + "commandKind": "bulk", + "ignoreMissingScript": true, + "allowWarningsInSuccessfulBuild": true + } + ], + "parameters": [ + { + "parameterKind": "string", + "longName": "--dir", + "description": "Specify which dir will handle", + "associatedCommands": ["prettier"], + "argumentName": "DIR", + "required": false + }, + { + "parameterKind": "string", + "longName": "--ext", + "description": "Specify which file type will handle, example `rush prettier --ext 'tsx,scss'`", + "associatedCommands": ["prettier"], + "argumentName": "EXT", + "required": false + }, + { + "parameterKind": "string", + "longName": "--project", + "shortName": "-p", + "description": "Specify the name of the main Rush project to be run", + "associatedCommands": ["run"], + "argumentName": "PROJECT_NAME", + "required": true + }, + { + "parameterKind": "string", + "longName": "--script", + "shortName": "-s", + "description": "Specify script name in project", + "associatedCommands": ["run"], + "argumentName": "SCRIPT_NAME", + "required": true + }, + { + "parameterKind": "string", + "longName": "--message", + "shortName": "-m", + "description": "Write a message for change", + "associatedCommands": ["change-all"], + "argumentName": "MESSAGE", + "required": false + }, + { + "parameterKind": "flag", + "longName": "--not-commit", + "shortName": "-n", + "description": "not commit after run rush change", + "associatedCommands": ["change-all"], + "required": false + }, + { + "parameterKind": "choice", + "longName": "--type", + "shortName": "-t", + "description": "The bump type of change: major, minor, patch, none", + "associatedCommands": ["change-all"], + "alternatives": [ + { + "name": "patch", + "description": "A patch change" + }, + { + "name": "minor", + "description": "A minor change" + }, + { + "name": "major", + "description": "A major change" + } + ] + } + ] +} diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json new file mode 100644 index 0000000..548de12 --- /dev/null +++ b/common/config/rush/common-versions.json @@ -0,0 +1,62 @@ +/** + * This configuration file specifies NPM dependency version selections that affect all projects + * in a Rush repo. More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", + + /** + * A table that specifies a "preferred version" for a given NPM package. This feature is typically used + * to hold back an indirect dependency to a specific older version, or to reduce duplication of indirect dependencies. + * + * The "preferredVersions" value can be any SemVer range specifier (e.g. "~1.2.3"). Rush injects these values into + * the "dependencies" field of the top-level common/temp/package.json, which influences how the package manager + * will calculate versions. The specific effect depends on your package manager. Generally it will have no + * effect on an incompatible or already constrained SemVer range. If you are using PNPM, similar effects can be + * achieved using the pnpmfile.js hook. See the Rush documentation for more details. + * + * After modifying this field, it's recommended to run "rush update --full" so that the package manager + * will recalculate all version selections. + */ + "preferredVersions": { + /** + * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, + * instead of the latest version. + */ + // "some-library": "1.2.3" + }, + + /** + * When set to true, for all projects in the repo, all dependencies will be automatically added as preferredVersions, + * except in cases where different projects specify different version ranges for a given dependency. For older + * package managers, this tended to reduce duplication of indirect dependencies. However, it can sometimes cause + * trouble for indirect dependencies with incompatible peerDependencies ranges. + * + * The default value is true. If you're encountering installation errors related to peer dependencies, + * it's recommended to set this to false. + * + * After modifying this field, it's recommended to run "rush update --full" so that the package manager + * will recalculate all version selections. + */ + // "implicitlyPreferredVersions": false, + + /** + * The "rush check" command can be used to enforce that every project in the repo must specify + * the same SemVer range for a given dependency. However, sometimes exceptions are needed. + * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be + * accepted by "rush check" for a given dependency. + * + * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE + * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). + * This design avoids unnecessary churn in this file. + */ + "allowedAlternativeVersions": { + /** + * For example, allow some projects to use an older TypeScript compiler + * (in addition to whatever "usual" version is being used by other projects in the repo): + */ + // "typescript": [ + // "4.0.2" + // ] + } +} diff --git a/common/config/rush/experiments.json b/common/config/rush/experiments.json new file mode 100644 index 0000000..498d812 --- /dev/null +++ b/common/config/rush/experiments.json @@ -0,0 +1,50 @@ +/** + * This configuration file allows repo maintainers to enable and disable experimental + * Rush features. More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json", + + /** + * By default, 'rush install' passes --no-prefer-frozen-lockfile to 'pnpm install'. + * Set this option to true to pass '--frozen-lockfile' instead for faster installs. + */ + // "usePnpmFrozenLockfileForRushInstall": true, + + /** + * By default, 'rush update' passes --no-prefer-frozen-lockfile to 'pnpm install'. + * Set this option to true to pass '--prefer-frozen-lockfile' instead to minimize shrinkwrap changes. + */ + // "usePnpmPreferFrozenLockfileForRushUpdate": true, + + /** + * If using the 'preventManualShrinkwrapChanges' option, restricts the hash to only include the layout of external dependencies. + * Used to allow links between workspace projects or the addition/removal of references to existing dependency versions to not + * cause hash changes. + */ + // "omitImportersFromPreventManualShrinkwrapChanges": true, + + /** + * If true, the chmod field in temporary project tar headers will not be normalized. + * This normalization can help ensure consistent tarball integrity across platforms. + */ + // "noChmodFieldInTarHeaderNormalization": true, + + /** + * If true, build caching will respect the allowWarningsInSuccessfulBuild flag and cache builds with warnings. + * This will not replay warnings from the cached build. + */ + // "buildCacheWithAllowWarningsInSuccessfulBuild": true, + + /** + * If true, the phased commands feature is enabled. To use this feature, create a "phased" command + * in common/config/rush/command-line.json. + */ + // "phasedCommands": true, + + /** + * If true, perform a clean install after when running `rush install` or `rush update` if the + * `.npmrc` file has changed since the last install. + */ + // "cleanInstallAfterNpmrcChanges": true +} diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json new file mode 100644 index 0000000..ca3a5c8 --- /dev/null +++ b/common/config/rush/pnpm-config.json @@ -0,0 +1,205 @@ +/** + * This configuration file provides settings specific to the PNPM package manager. + * More documentation is available on the Rush website: https://rushjs.io + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/pnpm-config.schema.json", + + /** + * If true, then `rush install` and `rush update` will use the PNPM workspaces feature + * to perform the install, instead of the old model where Rush generated the symlinks + * for each projects's node_modules folder. + * + * When using workspaces, Rush will generate a `common/temp/pnpm-workspace.yaml` file referencing + * all local projects to install. Rush will also generate a `.pnpmfile.cjs` shim which implements + * Rush-specific features such as preferred versions. The user's `common/config/rush/.pnpmfile.cjs` + * is invoked by the shim. + * + * This option is strongly recommended. The default value is false. + */ + "useWorkspaces": true, + + /** + * If true, then Rush will add the `--strict-peer-dependencies` command-line parameter when + * invoking PNPM. This causes `rush update` to fail if there are unsatisfied peer dependencies, + * which is an invalid state that can cause build failures or incompatible dependency versions. + * (For historical reasons, JavaScript package managers generally do not treat this invalid + * state as an error.) + * + * PNPM documentation: https://pnpm.io/npmrc#strict-peer-dependencies + * + * The default value is false to avoid legacy compatibility issues. + * It is strongly recommended to set `strictPeerDependencies=true`. + */ + // "strictPeerDependencies": true, + + /** + * Environment variables that will be provided to PNPM. + */ + // "environmentVariables": { + // "NODE_OPTIONS": { + // "value": "--max-old-space-size=4096", + // "override": false + // } + // }, + + /** + * Specifies the location of the PNPM store. There are two possible values: + * + * - `local` - use the `pnpm-store` folder in the current configured temp folder: + * `common/temp/pnpm-store` by default. + * - `global` - use PNPM's global store, which has the benefit of being shared + * across multiple repo folders, but the disadvantage of less isolation for builds + * (for example, bugs or incompatibilities when two repos use different releases of PNPM) + * + * In both cases, the store path can be overridden by the environment variable `RUSH_PNPM_STORE_PATH`. + * + * The default value is `local`. + */ + // "pnpmStore": "global", + + /** + * If true, then `rush install` will report an error if manual modifications + * were made to the PNPM shrinkwrap file without running `rush update` afterwards. + * + * This feature protects against accidental inconsistencies that may be introduced + * if the PNPM shrinkwrap file (`pnpm-lock.yaml`) is manually edited. When this + * feature is enabled, `rush update` will append a hash to the file as a YAML comment, + * and then `rush update` and `rush install` will validate the hash. Note that this + * does not prohibit manual modifications, but merely requires `rush update` be run + * afterwards, ensuring that PNPM can report or repair any potential inconsistencies. + * + * To temporarily disable this validation when invoking `rush install`, use the + * `--bypass-policy` command-line parameter. + * + * The default value is false. + */ + // "preventManualShrinkwrapChanges": true, + + /** + * The "globalOverrides" setting provides a simple mechanism for overriding version selections + * for all dependencies of all projects in the monorepo workspace. The settings are copied + * into the `pnpm.overrides` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmoverrides + */ + "globalOverrides": { + // "example1": "^1.0.0", + // "example2": "npm:@company/example2@^1.0.0" + }, + + /** + * The `globalPeerDependencyRules` setting provides various settings for suppressing validation errors + * that are reported during installation with `strictPeerDependencies=true`. The settings are copied + * into the `pnpm.peerDependencyRules` field of the `common/temp/package.json` file that is generated + * by Rush during installation. + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * https://pnpm.io/package_json#pnpmpeerdependencyrules + */ + "globalPeerDependencyRules": { + // "ignoreMissing": ["@eslint/*"], + // "allowedVersions": { "react": "17" }, + // "allowAny": ["@babel/*"] + }, + + /** + * The `globalPackageExtension` setting provides a way to patch arbitrary package.json fields + * for any PNPM dependency of the monorepo. The settings are copied into the `pnpm.packageExtensions` + * field of the `common/temp/package.json` file that is generated by Rush during installation. + * The `globalPackageExtension` setting has similar capabilities as `.pnpmfile.cjs` but without + * the downsides of an executable script (nondeterminism, unreliable caching, performance concerns). + * + * Order of precedence: `.pnpmfile.cjs` has the highest precedence, followed by + * `unsupportedPackageJsonSettings`, `globalPeerDependencyRules`, `globalPackageExtensions`, + * and `globalOverrides` has lowest precedence. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpackageextensions + */ + "globalPackageExtensions": { + // "fork-ts-checker-webpack-plugin": { + // "dependencies": { + // "@babel/core": "1" + // }, + // "peerDependencies": { + // "eslint": ">= 6" + // }, + // "peerDependenciesMeta": { + // "eslint": { + // "optional": true + // } + // } + // } + }, + + /** + * The `globalNeverBuiltDependencies` setting suppresses the `preinstall`, `install`, and `postinstall` + * lifecycle events for the specified NPM dependencies. This is useful for scripts with poor practices + * such as downloading large binaries without retries or attempting to invoke OS tools such as + * a C++ compiler. (PNPM's terminology refers to these lifecycle events as "building" a package; + * it has nothing to do with build system operations such as `rush build` or `rushx build`.) + * The settings are copied into the `pnpm.neverBuiltDependencies` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmneverbuiltdependencies + */ + "globalNeverBuiltDependencies": [ + // "fsevents" + ], + + /** + * The `globalAllowedDeprecatedVersions` setting suppresses installation warnings for package + * versions that the NPM registry reports as being deprecated. This is useful if the + * deprecated package is an indirect dependency of an external package that has not released a fix. + * The settings are copied into the `pnpm.allowedDeprecatedVersions` field of the `common/temp/package.json` + * file that is generated by Rush during installation. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmalloweddeprecatedversions + * + * If you are working to eliminate a deprecated version, it's better to specify `allowedDeprecatedVersions` + * in the package.json file for individual Rush projects. + */ + "globalAllowedDeprecatedVersions": { + // "request": "*" + }, + + + /** + * (THIS FIELD IS MACHINE GENERATED) The "globalPatchedDependencies" field is updated automatically + * by the `rush-pnpm patch-commit` command. It is a dictionary, where the key is an NPM package name + * and exact version, and the value is a relative path to the associated patch file. + * + * PNPM documentation: https://pnpm.io/package_json#pnpmpatcheddependencies + */ + "globalPatchedDependencies": { }, + + /** + * (USE AT YOUR OWN RISK) This is a free-form property bag that will be copied into + * the `common/temp/package.json` file that is generated by Rush during installation. + * This provides a way to experiment with new PNPM features. These settings will override + * any other Rush configuration associated with a given JSON field except for `.pnpmfile.cjs`. + * + * USAGE OF THIS SETTING IS NOT SUPPORTED BY THE RUSH MAINTAINERS AND MAY CAUSE RUSH + * TO MALFUNCTION. If you encounter a missing PNPM setting that you believe should + * be supported, please create a GitHub issue or PR. Note that Rush does not aim to + * support every possible PNPM setting, but rather to promote a battle-tested installation + * strategy that is known to provide a good experience for large teams with lots of projects. + */ + "unsupportedPackageJsonSettings": { + // "dependencies": { + // "not-a-good-practice": "*" + // }, + // "scripts": { + // "do-something": "echo Also not a good practice" + // }, + // "pnpm": { "futurePnpmFeature": true } + } +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml new file mode 100644 index 0000000..07cdad1 --- /dev/null +++ b/common/config/rush/pnpm-lock.yaml @@ -0,0 +1,11854 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: {} + + ../../docs: + specifiers: + '@arco-design/web-react': 2.46.1 + '@types/highlightjs': ^9.12.0 + '@types/markdown-it': ^13.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + '@visactor/vstory': workspace:0.0.1 + '@vitejs/plugin-react': 3.1.0 + axios: ^1.4.0 + chalk: ^3.0.0 + chokidar: ^3.5.0 + fs-extra: 10.1.0 + globby: 11.1.0 + highlight.js: ^11.8.0 + htmlparser2: ^4.1.0 + lodash: 4.17.21 + markdown-it: ^13.0.0 + marked: ^0.3.19 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: 6.9.0 + typescript: 4.9.5 + vite: 3.2.6 + yargs: ^17.1.1 + dependencies: + '@arco-design/web-react': 2.46.1_xf5tafcwmz3mrkdht7bbxbjgqa + '@visactor/vstory': link:../packages/vstory + axios: 1.7.2 + highlight.js: 11.9.0 + lodash: 4.17.21 + markdown-it: 13.0.2 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + react-router-dom: 6.9.0_nnrd3gsncyragczmpvfhocinkq + devDependencies: + '@types/highlightjs': 9.12.6 + '@types/markdown-it': 13.0.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + '@vitejs/plugin-react': 3.1.0_vite@3.2.6 + chalk: 3.0.0 + chokidar: 3.6.0 + fs-extra: 10.1.0 + globby: 11.1.0 + htmlparser2: 4.1.0 + marked: 0.3.19 + typescript: 4.9.5 + vite: 3.2.6 + yargs: 17.7.2 + + ../../packages/vstory: + specifiers: + '@ffmpeg/core': ^0.11.0 + '@ffmpeg/ffmpeg': ^0.11.6 + '@internal/bundler': workspace:* + '@internal/eslint-config': workspace:* + '@internal/ts-config': workspace:* + '@rushstack/eslint-patch': ~1.1.4 + '@types/jest': ^26.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + '@visactor/vchart': 1.11.1 + '@visactor/vrender-components': 0.19.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vutils': ~0.18.4 + '@vitejs/plugin-react': 3.1.0 + canvas: 2.11.2 + eslint: ~8.18.0 + jest: ^26.0.0 + jest-electron: ^0.1.12 + jest-extended: ^1.2.1 + react: ^18.0.0 + react-dom: ^18.0.0 + ts-jest: ^26.0.0 + typescript: 4.9.5 + vite: 3.2.6 + dependencies: + '@visactor/vchart': 1.11.1 + '@visactor/vrender-components': 0.19.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + devDependencies: + '@ffmpeg/core': 0.11.0 + '@ffmpeg/ffmpeg': 0.11.6 + '@internal/bundler': link:../../tools/bundler + '@internal/eslint-config': link:../../share/eslint-config + '@internal/ts-config': link:../../share/ts-config + '@rushstack/eslint-patch': 1.1.4 + '@types/jest': 26.0.24 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + '@visactor/vutils': 0.18.8 + '@vitejs/plugin-react': 3.1.0_vite@3.2.6 + canvas: 2.11.2 + eslint: 8.18.0 + jest: 26.6.3_canvas@2.11.2 + jest-electron: 0.1.12_jest@26.6.3 + jest-extended: 1.2.1 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai + typescript: 4.9.5 + vite: 3.2.6 + + ../../share/eslint-config: + specifiers: + '@typescript-eslint/eslint-plugin': 5.30.0 + '@typescript-eslint/parser': 5.30.0 + eslint: ~8.18.0 + eslint-config-prettier: 8.5.0 + eslint-plugin-promise: 6.0.0 + eslint-plugin-react: 7.30.1 + eslint-plugin-react-hooks: 4.6.0 + typescript: 4.9.5 + dependencies: + '@typescript-eslint/eslint-plugin': 5.30.0_cow5zg7tx6c3eisi5a4ud5kwia + '@typescript-eslint/parser': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq + eslint-config-prettier: 8.5.0_eslint@8.18.0 + eslint-plugin-promise: 6.0.0_eslint@8.18.0 + eslint-plugin-react: 7.30.1_eslint@8.18.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.18.0 + devDependencies: + eslint: 8.18.0 + typescript: 4.9.5 + + ../../share/jest-config: + specifiers: + '@jest/globals': ^26.0.0 + '@types/jest': ^26.0.0 + jest: ^26.0.0 + ts-jest: ^26.0.0 + typescript: 4.9.5 + dependencies: + '@jest/globals': 26.6.2 + ts-jest: 26.5.6_xuote2qreek47x2di7kesslrai + devDependencies: + '@types/jest': 26.0.24 + jest: 26.6.3 + typescript: 4.9.5 + + ../../share/ts-config: + specifiers: {} + + ../../tools/bugserver-trigger: + specifiers: + '@internal/bundler': workspace:* + '@internal/eslint-config': workspace:* + '@internal/ts-config': workspace:* + '@rushstack/eslint-patch': ~1.1.4 + '@types/node': '*' + '@types/node-fetch': 2.6.4 + '@visactor/vstory': workspace:0.0.1 + eslint: ~8.18.0 + form-data: ~4.0.0 + node-fetch: 2.6.6 + ts-node: 10.9.0 + typescript: 4.9.5 + dependencies: + '@visactor/vstory': link:../../packages/vstory + devDependencies: + '@internal/bundler': link:../bundler + '@internal/eslint-config': link:../../share/eslint-config + '@internal/ts-config': link:../../share/ts-config + '@rushstack/eslint-patch': 1.1.4 + '@types/node': 20.12.12 + '@types/node-fetch': 2.6.4 + eslint: 8.18.0 + form-data: 4.0.0 + node-fetch: 2.6.6 + ts-node: 10.9.0_tei2piaewgwz3rqboli3bdgchy + typescript: 4.9.5 + + ../../tools/bundler: + specifiers: + '@babel/core': 7.20.12 + '@babel/generator': 7.21.1 + '@babel/plugin-proposal-class-properties': 7.18.6 + '@babel/plugin-proposal-export-default-from': 7.18.10 + '@babel/preset-env': 7.20.2 + '@babel/preset-react': 7.18.6 + '@babel/preset-typescript': 7.18.6 + '@internal/eslint-config': workspace:* + '@internal/ts-config': workspace:* + '@rollup/plugin-alias': 5.0.0 + '@rollup/plugin-babel': 6.0.3 + '@rollup/plugin-commonjs': 24.1.0 + '@rollup/plugin-node-resolve': 15.0.2 + '@rollup/plugin-replace': 5.0.2 + '@rollup/plugin-terser': 0.4.1 + '@rollup/plugin-typescript': 11.1.0 + '@rollup/plugin-url': 8.0.1 + '@rushstack/eslint-patch': ~1.1.4 + '@trufflesuite/spinnies': 0.1.1 + '@types/babel__core': 7.20.0 + '@types/clean-css': 4.2.6 + '@types/debug': 4.1.7 + '@types/fs-extra': 9.0.13 + '@types/glob-watcher': 5.0.2 + '@types/gulp': 4.0.10 + '@types/gulp-if': 0.0.34 + '@types/gulp-match': 1.1.2 + '@types/gulp-sourcemaps': 0.0.35 + '@types/less': 3.0.3 + '@types/lodash': 4.14.182 + '@types/merge2': 1.4.0 + '@types/minimist': 1.2.2 + '@types/ms': 0.7.31 + '@types/node': '*' + '@types/semver': 7.3.12 + '@types/terser': 3.12.0 + '@types/through2': 2.0.38 + '@types/undertaker': 1.2.8 + '@types/vinyl': 2.0.7 + '@types/yargs-parser': 21.0.0 + autoprefixer: 10.4.13 + babel-plugin-import: 1.13.6 + clean-css: 5.3.2 + debug: 4.3.4 + eslint: ~8.18.0 + fs-extra: 10.1.0 + glob-watcher: 5.0.5 + globby: 11.1.0 + gulp: 4.0.2 + gulp-clean: 0.4.0 + gulp-if: 3.0.0 + gulp-match: 1.1.0 + gulp-replace: 1.1.4 + gulp-sourcemaps: 3.0.0 + gulp-typescript: 6.0.0-alpha.1 + less: 4.1.3 + lodash: 4.17.21 + merge2: 1.4.1 + ms: 2.1.3 + postcss: 8.4.21 + rollup: 3.20.5 + rollup-plugin-visualizer: 5.9.2 + semver: 7.3.4 + terser: 5.17.1 + through2: 4.0.2 + ts-node: 10.9.0 + typescript: 4.9.5 + undertaker: 1.3.0 + vinyl: 2.2.1 + vitest: 0.30.1 + yargs-parser: 21.1.1 + dependencies: + '@babel/core': 7.20.12 + '@babel/generator': 7.21.1 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-export-default-from': 7.18.10_@babel+core@7.20.12 + '@babel/preset-env': 7.20.2_@babel+core@7.20.12 + '@babel/preset-react': 7.18.6_@babel+core@7.20.12 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 + '@rollup/plugin-alias': 5.0.0_rollup@3.20.5 + '@rollup/plugin-babel': 6.0.3_i2zi3w2axzphgkbxj6nc7ioafa + '@rollup/plugin-commonjs': 24.1.0_rollup@3.20.5 + '@rollup/plugin-node-resolve': 15.0.2_rollup@3.20.5 + '@rollup/plugin-replace': 5.0.2_rollup@3.20.5 + '@rollup/plugin-terser': 0.4.1_rollup@3.20.5 + '@rollup/plugin-typescript': 11.1.0_ivokygnvpraqsbyfg47pib5bri + '@rollup/plugin-url': 8.0.1_rollup@3.20.5 + '@trufflesuite/spinnies': 0.1.1 + autoprefixer: 10.4.13_postcss@8.4.21 + babel-plugin-import: 1.13.6 + clean-css: 5.3.2 + debug: 4.3.4 + fs-extra: 10.1.0 + glob-watcher: 5.0.5 + globby: 11.1.0 + gulp: 4.0.2 + gulp-clean: 0.4.0 + gulp-if: 3.0.0 + gulp-match: 1.1.0 + gulp-replace: 1.1.4 + gulp-sourcemaps: 3.0.0 + gulp-typescript: 6.0.0-alpha.1_typescript@4.9.5 + less: 4.1.3 + lodash: 4.17.21 + merge2: 1.4.1 + ms: 2.1.3 + postcss: 8.4.21 + rollup: 3.20.5 + rollup-plugin-visualizer: 5.9.2_rollup@3.20.5 + semver: 7.3.4 + terser: 5.17.1 + through2: 4.0.2 + undertaker: 1.3.0 + vinyl: 2.2.1 + yargs-parser: 21.1.1 + devDependencies: + '@internal/eslint-config': link:../../share/eslint-config + '@internal/ts-config': link:../../share/ts-config + '@rushstack/eslint-patch': 1.1.4 + '@types/babel__core': 7.20.0 + '@types/clean-css': 4.2.6 + '@types/debug': 4.1.7 + '@types/fs-extra': 9.0.13 + '@types/glob-watcher': 5.0.2 + '@types/gulp': 4.0.10 + '@types/gulp-if': 0.0.34 + '@types/gulp-match': 1.1.2 + '@types/gulp-sourcemaps': 0.0.35 + '@types/less': 3.0.3 + '@types/lodash': 4.14.182 + '@types/merge2': 1.4.0 + '@types/minimist': 1.2.2 + '@types/ms': 0.7.31 + '@types/node': 20.12.12 + '@types/semver': 7.3.12 + '@types/terser': 3.12.0 + '@types/through2': 2.0.38 + '@types/undertaker': 1.2.8 + '@types/vinyl': 2.0.7 + '@types/yargs-parser': 21.0.0 + eslint: 8.18.0 + ts-node: 10.9.0_tei2piaewgwz3rqboli3bdgchy + typescript: 4.9.5 + vitest: 0.30.1_less@4.1.3+terser@5.17.1 + +packages: + + /@ampproject/remapping/2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@arco-design/color/0.4.0: + resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==} + dependencies: + color: 3.2.1 + dev: false + + /@arco-design/web-react/2.46.1_xf5tafcwmz3mrkdht7bbxbjgqa: + resolution: {integrity: sha512-XjG44rODJklDu++OApvxjt/TbRrgkNqVq6grt/H+9skysm46jFn2SwhuSljBHmjo11LtIeB1m/OMPMaFtafeYg==} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + '@arco-design/color': 0.4.0 + '@babel/runtime': 7.24.5 + b-tween: 0.3.3 + b-validate: 1.5.3 + compute-scroll-into-view: 1.0.20 + dayjs: 1.11.11 + lodash: 4.17.21 + number-precision: 1.6.0 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + react-focus-lock: 2.12.1_2eeaxkqdcvbrwk75oeh4jz4him + react-transition-group: 4.4.5_nnrd3gsncyragczmpvfhocinkq + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.20 + shallowequal: 1.1.0 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@babel/code-frame/7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.1 + + /@babel/compat-data/7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + /@babel/core/7.20.12: + resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.21.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5_@babel+core@7.20.12 + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator/7.21.1: + resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + /@babel/generator/7.24.5: + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure/7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-builder-binary-assignment-operator-visitor/7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-compilation-targets/7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1_@babel+core@7.20.12 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + semver: 6.3.1 + dev: false + + /@babel/helper-create-regexp-features-plugin/7.22.15_@babel+core@7.20.12: + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-environment-visitor/7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name/7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + + /@babel/helper-hoist-variables/7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + + /@babel/helper-member-expression-to-functions/7.24.5: + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-module-imports/7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + + /@babel/helper-module-transforms/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + + /@babel/helper-optimise-call-expression/7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-plugin-utils/7.24.5: + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator/7.22.20_@babel+core@7.20.12: + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.24.5 + dev: false + + /@babel/helper-replace-supers/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + + /@babel/helper-simple-access/7.24.5: + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + + /@babel/helper-skip-transparent-expression-wrappers/7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-split-export-declaration/7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + + /@babel/helper-string-parser/7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function/7.24.5: + resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + dev: false + + /@babel/helpers/7.24.5: + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + transitivePeerDependencies: + - supports-color + + /@babel/highlight/7.24.5: + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + /@babel/parser/7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.24.5_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-remap-async-to-generator': 7.22.20_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.20.12: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead. + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-export-default-from/7.18.10_@babel+core@7.20.12: + resolution: {integrity: sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-export-default-from': 7.24.1_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.24.5_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.20.12: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-proposal-private-property-in-object/7.21.11_@babel+core@7.20.12: + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + dev: false + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.22.15_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-export-default-from/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-import-assertions/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-jsx/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + + /@babel/plugin-syntax-typescript/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-arrow-functions/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-async-to-generator/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-remap-async-to-generator': 7.22.20_@babel+core@7.20.12 + dev: false + + /@babel/plugin-transform-block-scoped-functions/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-block-scoping/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-classes/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-replace-supers': 7.24.1_@babel+core@7.20.12 + '@babel/helper-split-export-declaration': 7.24.5 + globals: 11.12.0 + dev: false + + /@babel/plugin-transform-computed-properties/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/template': 7.24.0 + dev: false + + /@babel/plugin-transform-destructuring/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-dotall-regex/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.22.15_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-duplicate-keys/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-exponentiation-operator/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-for-of/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-function-name/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-literals/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-member-expression-literals/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-modules-amd/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-modules-commonjs/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-simple-access': 7.24.5 + dev: false + + /@babel/plugin-transform-modules-systemjs/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + dev: false + + /@babel/plugin-transform-modules-umd/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex/7.22.5_@babel+core@7.20.12: + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.22.15_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-new-target/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-object-super/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-replace-supers': 7.24.1_@babel+core@7.20.12 + dev: false + + /@babel/plugin-transform-optional-chaining/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + dev: false + + /@babel/plugin-transform-parameters/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-property-literals/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-react-display-name/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.20.12: + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx': 7.23.4_@babel+core@7.20.12 + dev: false + + /@babel/plugin-transform-react-jsx-self/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: true + + /@babel/plugin-transform-react-jsx/7.23.4_@babel+core@7.20.12: + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-jsx': 7.24.1_@babel+core@7.20.12 + '@babel/types': 7.24.5 + dev: false + + /@babel/plugin-transform-react-pure-annotations/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-regenerator/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-reserved-words/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-shorthand-properties/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-spread/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-sticky-regex/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-template-literals/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-typeof-symbol/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-typescript/7.24.5_@babel+core@7.20.12: + resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-typescript': 7.24.1_@babel+core@7.20.12 + dev: false + + /@babel/plugin-transform-unicode-escapes/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/plugin-transform-unicode-regex/7.24.1_@babel+core@7.20.12: + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.22.15_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + dev: false + + /@babel/preset-env/7.20.2_@babel+core@7.20.12: + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.20.12 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.20.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-private-property-in-object': 7.21.11_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-import-assertions': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-async-to-generator': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoped-functions': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-computed-properties': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-duplicate-keys': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-exponentiation-operator': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-function-name': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-literals': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-member-expression-literals': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-amd': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-commonjs': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-systemjs': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-modules-umd': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5_@babel+core@7.20.12 + '@babel/plugin-transform-new-target': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-object-super': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-property-literals': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-regenerator': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-reserved-words': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-shorthand-properties': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-sticky-regex': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-template-literals': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-typeof-symbol': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-escapes': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-regex': 7.24.1_@babel+core@7.20.12 + '@babel/preset-modules': 0.1.6_@babel+core@7.20.12 + '@babel/types': 7.24.5 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 + core-js-compat: 3.37.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-modules/0.1.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.24.1_@babel+core@7.20.12 + '@babel/types': 7.24.5 + esutils: 2.0.3 + dev: false + + /@babel/preset-react/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.24.1_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.23.4_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.20.12 + '@babel/plugin-transform-react-pure-annotations': 7.24.1_@babel+core@7.20.12 + dev: false + + /@babel/preset-typescript/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-typescript': 7.24.5_@babel+core@7.20.12 + dev: false + + /@babel/regjsgen/0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: false + + /@babel/runtime/7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template/7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + /@babel/traverse/7.24.5: + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types/7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + /@cnakazawa/watch/1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.8 + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@electron/get/1.14.1: + resolution: {integrity: sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==} + engines: {node: '>=8.6'} + dependencies: + debug: 4.3.4 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 9.6.0 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + global-tunnel-ng: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@esbuild/android-arm/0.15.18: + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.18: + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@ffmpeg/core/0.11.0: + resolution: {integrity: sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA==} + dev: true + + /@ffmpeg/ffmpeg/0.11.6: + resolution: {integrity: sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==} + engines: {node: '>=12.16.1'} + dependencies: + is-url: 1.2.4 + node-fetch: 2.6.6 + regenerator-runtime: 0.13.11 + resolve-url: 0.2.1 + dev: true + + /@gulp-sourcemaps/identity-map/2.0.1: + resolution: {integrity: sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q==} + engines: {node: '>= 0.10'} + dependencies: + acorn: 6.4.2 + normalize-path: 3.0.0 + postcss: 7.0.39 + source-map: 0.6.1 + through2: 3.0.2 + dev: false + + /@gulp-sourcemaps/map-sources/1.0.0: + resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} + engines: {node: '>= 0.10'} + dependencies: + normalize-path: 2.1.1 + through2: 2.0.5 + dev: false + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + /@jest/console/24.9.0: + resolution: {integrity: sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/source-map': 24.9.0 + chalk: 2.4.2 + slash: 2.0.0 + dev: true + + /@jest/console/26.6.2: + resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + jest-message-util: 26.6.2 + jest-util: 26.6.2 + slash: 3.0.0 + + /@jest/core/26.6.3: + resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/reporters': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 26.6.2 + jest-config: 26.6.3 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-resolve-dependencies: 26.6.3 + jest-runner: 26.6.3 + jest-runtime: 26.6.3 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + jest-watcher: 26.6.2 + micromatch: 4.0.7 + p-each-series: 2.2.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/core/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/reporters': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 26.6.2 + jest-config: 26.6.3_canvas@2.11.2 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-resolve-dependencies: 26.6.3 + jest-runner: 26.6.3_canvas@2.11.2 + jest-runtime: 26.6.3_canvas@2.11.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + jest-watcher: 26.6.2 + micromatch: 4.0.7 + p-each-series: 2.2.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /@jest/environment/24.9.0: + resolution: {integrity: sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/fake-timers': 24.9.0 + '@jest/transform': 24.9.0 + '@jest/types': 24.9.0 + jest-mock: 24.9.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/environment/26.6.2: + resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + jest-mock: 26.6.2 + + /@jest/fake-timers/24.9.0: + resolution: {integrity: sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + jest-message-util: 24.9.0 + jest-mock: 24.9.0 + dev: true + + /@jest/fake-timers/26.6.2: + resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@sinonjs/fake-timers': 6.0.1 + '@types/node': 20.12.12 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-util: 26.6.2 + + /@jest/globals/26.6.2: + resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/types': 26.6.2 + expect: 26.6.2 + + /@jest/reporters/26.6.2: + resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-haste-map: 26.6.2 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 7.1.2 + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - supports-color + + /@jest/source-map/24.9.0: + resolution: {integrity: sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==} + engines: {node: '>= 6'} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/source-map/26.6.2: + resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} + engines: {node: '>= 10.14.2'} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + + /@jest/test-result/24.9.0: + resolution: {integrity: sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==} + engines: {node: '>= 6'} + dependencies: + '@jest/console': 24.9.0 + '@jest/types': 24.9.0 + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@jest/test-result/26.6.2: + resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/types': 26.6.2 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + /@jest/test-sequencer/24.9.0: + resolution: {integrity: sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==} + engines: {node: '>= 6'} + dependencies: + '@jest/test-result': 24.9.0 + jest-haste-map: 24.9.0 + jest-runner: 24.9.0 + jest-runtime: 24.9.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/test-sequencer/26.6.3: + resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + graceful-fs: 4.2.11 + jest-haste-map: 26.6.2 + jest-runner: 26.6.3 + jest-runtime: 26.6.3 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/test-sequencer/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + graceful-fs: 4.2.11 + jest-haste-map: 26.6.2 + jest-runner: 26.6.3_canvas@2.11.2 + jest-runtime: 26.6.3_canvas@2.11.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /@jest/transform/24.9.0: + resolution: {integrity: sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==} + engines: {node: '>= 6'} + dependencies: + '@babel/core': 7.20.12 + '@jest/types': 24.9.0 + babel-plugin-istanbul: 5.2.0 + chalk: 2.4.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 24.9.0 + jest-regex-util: 24.9.0 + jest-util: 24.9.0 + micromatch: 3.1.10 + pirates: 4.0.6 + realpath-native: 1.1.0 + slash: 2.0.0 + source-map: 0.6.1 + write-file-atomic: 2.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform/26.6.2: + resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/core': 7.20.12 + '@jest/types': 26.6.2 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 26.6.2 + jest-regex-util: 26.0.0 + jest-util: 26.6.2 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + + /@jest/types/24.9.0: + resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} + engines: {node: '>= 6'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 1.1.2 + '@types/yargs': 13.0.12 + dev: true + + /@jest/types/26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.12 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + + /@jridgewell/gen-mapping/0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri/3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array/1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map/0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping/0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mapbox/node-pre-gyp/1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.2 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + /@remix-run/router/1.4.0: + resolution: {integrity: sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==} + engines: {node: '>=14'} + dev: false + + /@resvg/resvg-js-android-arm-eabi/2.4.1: + resolution: {integrity: sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-android-arm64/2.4.1: + resolution: {integrity: sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-darwin-arm64/2.4.1: + resolution: {integrity: sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-darwin-x64/2.4.1: + resolution: {integrity: sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-linux-arm-gnueabihf/2.4.1: + resolution: {integrity: sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-linux-arm64-gnu/2.4.1: + resolution: {integrity: sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-linux-arm64-musl/2.4.1: + resolution: {integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-linux-x64-gnu/2.4.1: + resolution: {integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-linux-x64-musl/2.4.1: + resolution: {integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-win32-arm64-msvc/2.4.1: + resolution: {integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-win32-ia32-msvc/2.4.1: + resolution: {integrity: sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js-win32-x64-msvc/2.4.1: + resolution: {integrity: sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@resvg/resvg-js/2.4.1: + resolution: {integrity: sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A==} + engines: {node: '>= 10'} + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 2.4.1 + '@resvg/resvg-js-android-arm64': 2.4.1 + '@resvg/resvg-js-darwin-arm64': 2.4.1 + '@resvg/resvg-js-darwin-x64': 2.4.1 + '@resvg/resvg-js-linux-arm-gnueabihf': 2.4.1 + '@resvg/resvg-js-linux-arm64-gnu': 2.4.1 + '@resvg/resvg-js-linux-arm64-musl': 2.4.1 + '@resvg/resvg-js-linux-x64-gnu': 2.4.1 + '@resvg/resvg-js-linux-x64-musl': 2.4.1 + '@resvg/resvg-js-win32-arm64-msvc': 2.4.1 + '@resvg/resvg-js-win32-ia32-msvc': 2.4.1 + '@resvg/resvg-js-win32-x64-msvc': 2.4.1 + dev: false + + /@rollup/plugin-alias/5.0.0_rollup@3.20.5: + resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.20.5 + slash: 4.0.0 + dev: false + + /@rollup/plugin-babel/6.0.3_i2zi3w2axzphgkbxj6nc7ioafa: + resolution: {integrity: sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-imports': 7.24.3 + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + '@types/babel__core': 7.20.0 + rollup: 3.20.5 + dev: false + + /@rollup/plugin-commonjs/24.1.0_rollup@3.20.5: + resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 3.20.5 + dev: false + + /@rollup/plugin-node-resolve/15.0.2_rollup@3.20.5: + resolution: {integrity: sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 3.20.5 + dev: false + + /@rollup/plugin-replace/5.0.2_rollup@3.20.5: + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + magic-string: 0.27.0 + rollup: 3.20.5 + dev: false + + /@rollup/plugin-terser/0.4.1_rollup@3.20.5: + resolution: {integrity: sha512-aKS32sw5a7hy+fEXVy+5T95aDIwjpGHCTv833HXVtyKMDoVS7pBr5K3L9hEQoNqbJFjfANPrNpIXlTQ7is00eA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.20.5 + serialize-javascript: 6.0.2 + smob: 0.0.6 + terser: 5.17.1 + dev: false + + /@rollup/plugin-typescript/11.1.0_ivokygnvpraqsbyfg47pib5bri: + resolution: {integrity: sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + resolve: 1.22.8 + rollup: 3.20.5 + typescript: 4.9.5 + dev: false + + /@rollup/plugin-url/8.0.1_rollup@3.20.5: + resolution: {integrity: sha512-8ajztphXb5e19dk3Iwjtm2eSYJR8jFQubZ8pJ1GG2MBMM7/qUedLnZAN+Vt4jqbcT/m27jfjIBocvrzV0giNRw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0_rollup@3.20.5 + make-dir: 3.1.0 + mime: 3.0.0 + rollup: 3.20.5 + dev: false + + /@rollup/pluginutils/5.1.0_rollup@3.20.5: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.20.5 + dev: false + + /@rushstack/eslint-patch/1.1.4: + resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==} + dev: true + + /@sindresorhus/is/0.14.0: + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + dev: true + + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/fake-timers/6.0.1: + resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + dependencies: + '@sinonjs/commons': 1.8.6 + + /@szmarczak/http-timer/1.1.2: + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + dependencies: + defer-to-connect: 1.1.3 + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + /@trufflesuite/spinnies/0.1.1: + resolution: {integrity: sha512-jltEtmFJj6xmQqr85gP8OqBHCEiId+zw+uAsb3DyLLRD17O6sySW6Afa2Z/jpzSafj+32ssDfLJ+c0of1NLqcA==} + dependencies: + chalk: 4.1.2 + cli-cursor: 3.1.0 + strip-ansi: 6.0.1 + dev: false + + /@tsconfig/node10/1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@turf/boolean-clockwise/6.5.0: + resolution: {integrity: sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/invariant': 6.5.0 + dev: false + + /@turf/clone/6.5.0: + resolution: {integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==} + dependencies: + '@turf/helpers': 6.5.0 + dev: false + + /@turf/flatten/6.5.0: + resolution: {integrity: sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: false + + /@turf/helpers/6.5.0: + resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} + + /@turf/invariant/6.5.0: + resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==} + dependencies: + '@turf/helpers': 6.5.0 + + /@turf/meta/3.14.0: + resolution: {integrity: sha512-OtXqLQuR9hlQ/HkAF/OdzRea7E0eZK1ay8y8CBXkoO2R6v34CsDrWYLMSo0ZzMsaQDpKo76NPP2GGo+PyG1cSg==} + dev: false + + /@turf/meta/6.5.0: + resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + dependencies: + '@turf/helpers': 6.5.0 + dev: false + + /@turf/rewind/6.5.0: + resolution: {integrity: sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==} + dependencies: + '@turf/boolean-clockwise': 6.5.0 + '@turf/clone': 6.5.0 + '@turf/helpers': 6.5.0 + '@turf/invariant': 6.5.0 + '@turf/meta': 6.5.0 + dev: false + + /@types/babel__core/7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + /@types/babel__generator/7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.5 + + /@types/babel__template/7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + /@types/babel__traverse/7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.24.5 + + /@types/chai-subset/1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.16 + dev: true + + /@types/chai/4.3.16: + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + dev: true + + /@types/clean-css/4.2.6: + resolution: {integrity: sha512-Ze1tf+LnGPmG6hBFMi0B4TEB0mhF7EiMM5oyjLDNPE9hxrPU0W+5+bHvO+eFPA+bt0iC1zkQMoU/iGdRVjcRbw==} + dependencies: + '@types/node': 20.12.12 + source-map: 0.6.1 + dev: true + + /@types/debug/4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: true + + /@types/estree/1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/expect/1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + + /@types/fs-extra/9.0.13: + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + dependencies: + '@types/node': 20.12.12 + dev: true + + /@types/glob-stream/8.0.2: + resolution: {integrity: sha512-kyuRfGE+yiSJWzSO3t74rXxdZNdYfLcllO0IUha4eX1fl40pm9L02Q/TEc3mykTLjoWz4STBNwYnUWdFu3I0DA==} + dependencies: + '@types/node': 20.12.12 + '@types/picomatch': 2.3.3 + '@types/streamx': 2.9.5 + dev: true + + /@types/glob-watcher/5.0.2: + resolution: {integrity: sha512-MZeh2nIzibl/euv5UV0femkGzcKTSE4G2+zv48d6ymeitWwCx52+4X+FqzML9oH2mQnPs+N/JHp3CsBPj1x1Ug==} + dependencies: + '@types/node': 20.12.12 + dev: true + + /@types/graceful-fs/4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.12.12 + + /@types/gulp-if/0.0.34: + resolution: {integrity: sha512-r2A04hHDC+ZWMRAm+3q6/UeC3ggvl+TZm9P1+2umnp4q9bOlBmUQnR178Io3c0DkZPQAwup8VNtOvmvaWCpP5w==} + dependencies: + '@types/node': 20.12.12 + '@types/vinyl': 2.0.7 + dev: true + + /@types/gulp-match/1.1.2: + resolution: {integrity: sha512-R/yI2NT2NJk2e8F5G0BAUM/f4c03QcxE7oWOGOgCccy1ABbkoH8NUBEuEnd1/MKr0lqO0EyGWJtgH5kqWf6zNA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/vinyl': 2.0.7 + dev: true + + /@types/gulp-sourcemaps/0.0.35: + resolution: {integrity: sha512-vUBuizwA4CAV3Mke0DJYHQxyN4YOB1aAql284qAO7Et7fe0hmnPi/R9Fhu2UhxMuSxAwFktsJUOQk5dJHOU1eA==} + dependencies: + '@types/node': 20.12.12 + '@types/vinyl': 2.0.7 + dev: true + + /@types/gulp/4.0.10: + resolution: {integrity: sha512-spgZHJFqiEJGwqGlf7T/k4nkBpBcLgP7T0EfN6G2vvnhUfvd4uO1h8RwpXOE8x/54DVYUs1XCAtBHkX/R3axAQ==} + dependencies: + '@types/undertaker': 1.2.8 + '@types/vinyl-fs': 3.0.5 + chokidar: 3.6.0 + dev: true + + /@types/highlightjs/9.12.6: + resolution: {integrity: sha512-Qfd1DUrwE851Hc3tExADJY4qY8yeZMt06Xw9AJm/UtpneepJS3MZY29c33BY0wP899veaaHD4gZzYiSuQm84Fg==} + dev: true + + /@types/istanbul-lib-coverage/2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + /@types/istanbul-lib-report/3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + /@types/istanbul-reports/1.1.2: + resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/istanbul-reports/3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + /@types/jest/26.0.24: + resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} + dependencies: + jest-diff: 26.6.2 + pretty-format: 26.6.2 + dev: true + + /@types/json-schema/7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/less/3.0.3: + resolution: {integrity: sha512-1YXyYH83h6We1djyoUEqTlVyQtCfJAFXELSKW2ZRtjHD4hQ82CC4lvrv5D0l0FLcKBaiPbXyi3MpMsI9ZRgKsw==} + dev: true + + /@types/linkify-it/3.0.5: + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + dev: true + + /@types/lodash/4.14.182: + resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} + dev: true + + /@types/markdown-it/13.0.8: + resolution: {integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==} + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 1.0.5 + dev: true + + /@types/mdurl/1.0.5: + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + dev: true + + /@types/merge2/1.4.0: + resolution: {integrity: sha512-MRHDvln2ldZELrUC8n1PGaQzZ33aNh8uDcsGehREW0zR1Fr818a4/JTZjO9eloHPPxnpUp8fz/YFTRc5CWm7Xw==} + dependencies: + '@types/node': 20.12.12 + dev: true + + /@types/minimatch/5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/ms/0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true + + /@types/node-fetch/2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.12.12 + form-data: 3.0.1 + dev: true + + /@types/node/12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node/20.12.12: + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + dependencies: + undici-types: 5.26.5 + + /@types/normalize-package-data/2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + /@types/picomatch/2.3.3: + resolution: {integrity: sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==} + dev: true + + /@types/prettier/2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + /@types/prop-types/15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + /@types/react-dom/18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + dependencies: + '@types/react': 18.3.2 + dev: true + + /@types/react/18.3.2: + resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + /@types/resolve/1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: false + + /@types/semver/7.3.12: + resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==} + dev: true + + /@types/stack-utils/1.0.1: + resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} + dev: true + + /@types/stack-utils/2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + /@types/streamx/2.9.5: + resolution: {integrity: sha512-IHYsa6jYrck8VEdSwpY141FTTf6D7boPeMq9jy4qazNrFMA4VbRz/sw5LSsfR7jwdDcx0QKWkUexZvsWBC2eIQ==} + dependencies: + '@types/node': 20.12.12 + dev: true + + /@types/terser/3.12.0: + resolution: {integrity: sha512-J0Wy8A7ULEqVJftkWhrXZbH0iBk4tYuTj0gBiiveKaY9deNi6cCsxl0ApJ27ojqwYv51bvEw85lOb8Wt4ng9zA==} + deprecated: This is a stub types definition. terser provides its own type definitions, so you do not need this installed. + dependencies: + terser: 5.17.1 + dev: true + + /@types/through2/2.0.38: + resolution: {integrity: sha512-YFu+nHmjxMurkH1BSzA0Z1WrKDAY8jUKPZctNQn7mc+/KKtp2XxnclHFXxdB1m7Iqnzb5aywgP8TMK283LezGQ==} + dependencies: + '@types/node': 20.12.12 + dev: true + + /@types/undertaker-registry/1.0.4: + resolution: {integrity: sha512-tW77pHh2TU4uebWXWeEM5laiw8BuJ7pyJYDh6xenOs75nhny2kVgwYbegJ4BoLMYsIrXaBpKYaPdYO3/udG+hg==} + dev: true + + /@types/undertaker/1.2.8: + resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} + dependencies: + '@types/node': 20.12.12 + '@types/undertaker-registry': 1.0.4 + async-done: 1.3.2 + dev: true + + /@types/vinyl-fs/3.0.5: + resolution: {integrity: sha512-ckYz9giHgV6U10RFuf9WsDQ3X86EFougapxHmmoxLK7e6ICQqO8CE+4V/3lBN148V5N1pb4nQMmMjyScleVsig==} + dependencies: + '@types/glob-stream': 8.0.2 + '@types/node': 20.12.12 + '@types/vinyl': 2.0.7 + dev: true + + /@types/vinyl/2.0.7: + resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} + dependencies: + '@types/expect': 1.20.4 + '@types/node': 20.12.12 + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + + /@types/yargs/13.0.12: + resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yargs/15.0.19: + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + dependencies: + '@types/yargs-parser': 21.0.0 + + /@typescript-eslint/eslint-plugin/5.30.0_cow5zg7tx6c3eisi5a4ud5kwia: + resolution: {integrity: sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq + '@typescript-eslint/scope-manager': 5.30.0 + '@typescript-eslint/type-utils': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq + '@typescript-eslint/utils': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq + debug: 4.3.4 + eslint: 8.18.0 + functional-red-black-tree: 1.0.1 + ignore: 5.3.1 + regexpp: 3.2.0 + semver: 7.6.2 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser/5.30.0_vwud3sodsb5zxmzckoj7rdwdbq: + resolution: {integrity: sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.30.0 + '@typescript-eslint/types': 5.30.0 + '@typescript-eslint/typescript-estree': 5.30.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.18.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager/5.30.0: + resolution: {integrity: sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.30.0 + '@typescript-eslint/visitor-keys': 5.30.0 + dev: false + + /@typescript-eslint/type-utils/5.30.0_vwud3sodsb5zxmzckoj7rdwdbq: + resolution: {integrity: sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.30.0_vwud3sodsb5zxmzckoj7rdwdbq + debug: 4.3.4 + eslint: 8.18.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types/5.30.0: + resolution: {integrity: sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /@typescript-eslint/typescript-estree/5.30.0_typescript@4.9.5: + resolution: {integrity: sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.30.0 + '@typescript-eslint/visitor-keys': 5.30.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.2 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils/5.30.0_vwud3sodsb5zxmzckoj7rdwdbq: + resolution: {integrity: sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/scope-manager': 5.30.0 + '@typescript-eslint/types': 5.30.0 + '@typescript-eslint/typescript-estree': 5.30.0_typescript@4.9.5 + eslint: 8.18.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.18.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys/5.30.0: + resolution: {integrity: sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.30.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@visactor/vchart/1.11.1: + resolution: {integrity: sha512-Ew9syACTP+x2oeQmXhdOo+HBUuVRVdnR58ucpMrEVWrwUxhAhOY5O58J00UQwcF4JpuHIM9V34PlRSZXVfaCcg==} + dependencies: + '@visactor/vdataset': 0.18.9 + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-hierarchy': 0.13.4 + '@visactor/vgrammar-projection': 0.13.4 + '@visactor/vgrammar-sankey': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vgrammar-venn': 0.13.4 + '@visactor/vgrammar-wordcloud': 0.13.4 + '@visactor/vgrammar-wordcloud-shape': 0.13.4 + '@visactor/vrender-components': 0.19.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vscale': 0.18.9 + '@visactor/vutils': 0.18.8 + '@visactor/vutils-extension': 1.11.1_qjeid3zku5l552zdh46sqjm6c4 + dev: false + + /@visactor/vdataset/0.18.9: + resolution: {integrity: sha512-qQBOGKbB4W1+0aUQ95y9q4Nu56VAiC01Pijhkje0EUHpO8EIy17tUc0xtjpHE4iO8ym/02c4cGv4FKtuiewIrA==} + dependencies: + '@turf/flatten': 6.5.0 + '@turf/helpers': 6.5.0 + '@turf/rewind': 6.5.0 + '@visactor/vutils': 0.18.9 + d3-dsv: 2.0.0 + d3-geo: 1.12.1 + d3-hexbin: 0.2.2 + d3-hierarchy: 3.1.2 + eventemitter3: 4.0.7 + geobuf: 3.0.2 + geojson-dissolve: 3.1.0 + path-browserify: 1.0.1 + pbf: 3.2.1 + point-at-length: 1.1.0 + simple-statistics: 7.8.3 + simplify-geojson: 1.0.5 + topojson-client: 3.1.0 + dev: false + + /@visactor/vgrammar-coordinate/0.13.4: + resolution: {integrity: sha512-8tKb4t8dQI0LhaVJMj4gjKnA5JRjeEuXiw/x5cyKgrILm5EgzImbFkEB4I+3Y1wxRfqbi+opbu9x5taJtVNqJA==} + dependencies: + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-core/0.13.4: + resolution: {integrity: sha512-MgqS6FQuLrwpc7Q4kQEcHYRAhGA6hCOoVVMfc0inIF8Wd7IohHl+4S8pppjh4mhvVmcMCULYv/pn0nzm4XsHBQ==} + dependencies: + '@visactor/vdataset': 0.18.9 + '@visactor/vgrammar-coordinate': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-components': 0.19.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vscale': 0.18.9 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-hierarchy/0.13.4: + resolution: {integrity: sha512-Coo9fsI4Cn0RVjPtpgSTyuMzZ4L4COeKu0wyiUiDW5lwrLWJfVfa0RYqu226m/eHdxTbOx/5e2jtRtPM8/Mf/A==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-projection/0.13.4: + resolution: {integrity: sha512-owCEp2S+U5EgWgI/QmkG9Kac3LwoDrW7FbPaMj3Cu3w874reElZMD+UBhSP9oQ93t/r4G9f9LSbwRmmnE4gVFQ==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vutils': 0.18.9 + d3-geo: 1.12.1 + dev: false + + /@visactor/vgrammar-sankey/0.13.4: + resolution: {integrity: sha512-FXurFa1pYMTGiq1vybA5jZoibVrh0IALMGmjFWYZFzA1eug7pewkHGuT1biNTBxwT1bJNvlyrxnvfcu5PsBKwg==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-util/0.13.4: + resolution: {integrity: sha512-sEVzg2xUh/NtRvkwnsQ+olelZpKJLkArPOJ4+JQnsCu7CmYbC+06r0ofh1o2UWHw+q+7cpcYDGKWk5skdcnPMA==} + dependencies: + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-venn/0.13.4: + resolution: {integrity: sha512-vwkZat3aDHR2BbodAndTDCZ6oOv+CdYrU5CcQvUrra1at8icOl6Yx7sJPfVJE8S5+Zf4OBRSWsia6oG5VEWcuA==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-wordcloud-shape/0.13.4: + resolution: {integrity: sha512-vTrnkGssIT+0mFwz4elneeMmvVAVeE5rBBlrfKMtmgKkZ2g/LaoEfmr7nMAxzHVs19C810eoYc12QTpwwtJNfg==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vscale': 0.18.9 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vgrammar-wordcloud/0.13.4: + resolution: {integrity: sha512-yWdJjD45VOWIDuFBCi+vj1hHwsngJ0BP4UH+HS+ZETUy2A5L53pRDNmSLtlb+KVRzqvZuGKm5adp9fFRYmDqOg==} + dependencies: + '@visactor/vgrammar-core': 0.13.4 + '@visactor/vgrammar-util': 0.13.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vrender-components/0.19.4: + resolution: {integrity: sha512-dwXghJUioqme1xWPEDEV0vP5qHPg1AQFC4ydKPWRLSQQf45+3P7GZTDnT+BHvzL2bTcT47M42728R9NT8ntnIQ==} + dependencies: + '@visactor/vrender-core': 0.19.4 + '@visactor/vrender-kits': 0.19.4 + '@visactor/vscale': 0.17.5 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vrender-core/0.19.4: + resolution: {integrity: sha512-XWiPy7jeUtoFbnjJ9WQHGkA1XwyZByeAD9PfGn3QYlfSjHppiZefZX4nHu1BWKl8giR7uOhKAb8+BzgSZpdvIg==} + dependencies: + '@visactor/vutils': 0.18.9 + color-convert: 2.0.1 + dev: false + + /@visactor/vrender-kits/0.19.4: + resolution: {integrity: sha512-w+9kkCaZ6uWUPCrjuf2V4LJW4uQEqLxsdWTW1yPvRcfkUiDqgyNw1kwA0bah+E7q4soDuaAFXn33ZTNqg7DS0A==} + dependencies: + '@resvg/resvg-js': 2.4.1 + '@visactor/vrender-core': 0.19.4 + '@visactor/vutils': 0.18.9 + roughjs: 4.5.2 + dev: false + + /@visactor/vscale/0.17.5: + resolution: {integrity: sha512-2dkS1IlAJ/IdTp8JElbctOOv6lkHKBKPDm8KvwBo0NuGWQeYAebSeyN3QCdwKbj76gMlCub4zc+xWrS5YiA2zA==} + dependencies: + '@visactor/vutils': 0.17.5 + dev: false + + /@visactor/vscale/0.18.9: + resolution: {integrity: sha512-rglOQQGhkamtjGtbFxY5pcfqsBXDyYU6NiQuBdVSeYRQvB9YpLLk455HpvQcEEhC+bRopNQsQgQV5276Pd0sfQ==} + dependencies: + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vutils-extension/1.11.1_qjeid3zku5l552zdh46sqjm6c4: + resolution: {integrity: sha512-sJhJXdIY1cgty/mYMlZEnVm1Fa56KeC7CcW2GXSE72KlXEcqsTg+MVYYrtzWwxST8Rhe6Dg9KhMFouCI3BMFLw==} + peerDependencies: + '@visactor/vrender-components': '>=0.18' + '@visactor/vrender-core': '>=0.18' + dependencies: + '@visactor/vdataset': 0.18.9 + '@visactor/vrender-components': 0.19.4 + '@visactor/vrender-core': 0.19.4 + '@visactor/vscale': 0.18.9 + '@visactor/vutils': 0.18.9 + dev: false + + /@visactor/vutils/0.17.5: + resolution: {integrity: sha512-HFN6Pk1Wc1RK842g02MeKOlvdri5L7/nqxMVTqxIvi0XMhHXpmoqN4+/9H+h8LmJpVohyrI/MT85TRBV/rManw==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/invariant': 6.5.0 + eventemitter3: 4.0.7 + dev: false + + /@visactor/vutils/0.18.8: + resolution: {integrity: sha512-9+YODg9msVyObDbamt94lsEF/idV8gyW3lf31DhuKsLKbuB/ajvSg6jNKD/FTMoXpmCNwfZgZ0F6wXLwI5aIpw==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/invariant': 6.5.0 + eventemitter3: 4.0.7 + + /@visactor/vutils/0.18.9: + resolution: {integrity: sha512-+CPwBATTQUPtXQ0KVXFRz8SCwAY9m5aR9QmtsVqya+mgaay3moFaAPNTbdkLBuZM5ewRYVcv/3fsDxuH+NXfFg==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/invariant': 6.5.0 + eventemitter3: 4.0.7 + dev: false + + /@vitejs/plugin-react/3.1.0_vite@3.2.6: + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.24.5_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.24.1_@babel+core@7.20.12 + magic-string: 0.27.0 + react-refresh: 0.14.2 + vite: 3.2.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect/0.30.1: + resolution: {integrity: sha512-c3kbEtN8XXJSeN81iDGq29bUzSjQhjES2WR3aColsS4lPGbivwLtas4DNUe0jD9gg/FYGIteqOenfU95EFituw==} + dependencies: + '@vitest/spy': 0.30.1 + '@vitest/utils': 0.30.1 + chai: 4.4.1 + dev: true + + /@vitest/runner/0.30.1: + resolution: {integrity: sha512-W62kT/8i0TF1UBCNMRtRMOBWJKRnNyv9RrjIgdUryEe0wNpGZvvwPDLuzYdxvgSckzjp54DSpv1xUbv4BQ0qVA==} + dependencies: + '@vitest/utils': 0.30.1 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot/0.30.1: + resolution: {integrity: sha512-fJZqKrE99zo27uoZA/azgWyWbFvM1rw2APS05yB0JaLwUIg9aUtvvnBf4q7JWhEcAHmSwbrxKFgyBUga6tq9Tw==} + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy/0.30.1: + resolution: {integrity: sha512-YfJeIf37GvTZe04ZKxzJfnNNuNSmTEGnla2OdL60C8od16f3zOfv9q9K0nNii0NfjDJRt/CVN/POuY5/zTS+BA==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils/0.30.1: + resolution: {integrity: sha512-/c8Xv2zUVc+rnNt84QF0Y0zkfxnaGhp87K2dYJMLtLOIckPzuxLVzAtFCicGFdB4NeBHNzTRr1tNn7rCtQcWFA==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.7 + pretty-format: 27.5.1 + dev: true + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + /abs-svg-path/0.1.1: + resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + dev: false + + /acorn-globals/4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + dev: true + + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + + /acorn-jsx/5.3.2_acorn@8.11.3: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + + /acorn-walk/6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + /acorn-walk/8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn/8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-colors/1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: false + + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-cyan/0.1.1: + resolution: {integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: false + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-gray/0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: false + + /ansi-red/0.1.1: + resolution: {integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: false + + /ansi-regex/2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: false + + /ansi-regex/4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-wrap/0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} + dev: false + + /anymatch/2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /append-buffer/1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + dependencies: + buffer-equal: 1.0.1 + dev: false + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + /archy/1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: false + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /arr-diff/1.1.0: + resolution: {integrity: sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-slice: 0.2.3 + dev: false + + /arr-diff/4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + /arr-filter/1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: false + + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + /arr-map/2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: false + + /arr-union/2.1.0: + resolution: {integrity: sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==} + engines: {node: '>=0.10.0'} + dev: false + + /arr-union/3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + /array-buffer-byte-length/1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + /array-each/1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + dev: false + + /array-equal/1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + dev: true + + /array-includes/3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: false + + /array-initial/1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} + engines: {node: '>=0.10.0'} + dependencies: + array-slice: 1.1.0 + is-number: 4.0.0 + dev: false + + /array-last/1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 4.0.0 + dev: false + + /array-slice/0.2.3: + resolution: {integrity: sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==} + engines: {node: '>=0.10.0'} + dev: false + + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: false + + /array-sort/1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + dependencies: + default-compare: 1.0.0 + get-value: 2.0.6 + kind-of: 5.1.0 + dev: false + + /array-source/0.0.4: + resolution: {integrity: sha512-frNdc+zBn80vipY+GdcJkLEbMWj3xmzArYApmUGxoiV8uAu/ygcs9icPdsGdA26h0MkHUMW6EN2piIvVx+M5Mw==} + dev: false + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /array-unique/0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + /array.prototype.flat/1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: false + + /array.prototype.flatmap/1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: false + + /array.prototype.reduce/1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-array-method-boxes-properly: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + is-string: 1.0.7 + dev: true + + /arraybuffer.prototype.slice/1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus/1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /assign-symbols/1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + /async-done/1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + + /async-each/1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + dev: false + + /async-limiter/1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: true + + /async-settle/1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} + engines: {node: '>= 0.10'} + dependencies: + async-done: 1.3.2 + dev: false + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + /autoprefixer/10.4.13_postcss@8.4.21: + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001621 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + + /available-typed-arrays/1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + + /aws-sign2/0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4/1.13.0: + resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + dev: true + + /axios/1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /b-tween/0.3.3: + resolution: {integrity: sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==} + dev: false + + /b-validate/1.5.3: + resolution: {integrity: sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==} + dev: false + + /babel-jest/24.9.0_@babel+core@7.20.12: + resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} + engines: {node: '>= 6'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@jest/transform': 24.9.0 + '@jest/types': 24.9.0 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 5.2.0 + babel-preset-jest: 24.9.0_@babel+core@7.20.12 + chalk: 2.4.2 + slash: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest/26.6.3_@babel+core@7.20.12: + resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} + engines: {node: '>= 10.14.2'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 26.6.2_@babel+core@7.20.12 + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-import/1.13.6: + resolution: {integrity: sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==} + dependencies: + '@babel/helper-module-imports': 7.24.3 + dev: false + + /babel-plugin-istanbul/5.2.0: + resolution: {integrity: sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==} + engines: {node: '>=6'} + dependencies: + '@babel/helper-plugin-utils': 7.24.5 + find-up: 3.0.0 + istanbul-lib-instrument: 3.3.0 + test-exclude: 5.2.3 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.24.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-jest-hoist/24.9.0: + resolution: {integrity: sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==} + engines: {node: '>= 6'} + dependencies: + '@types/babel__traverse': 7.20.6 + dev: true + + /babel-plugin-jest-hoist/26.6.2: + resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.20.6 + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + core-js-compat: 3.37.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.12: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 + + /babel-preset-jest/24.9.0_@babel+core@7.20.12: + resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} + engines: {node: '>= 6'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + babel-plugin-jest-hoist: 24.9.0 + dev: true + + /babel-preset-jest/26.6.2_@babel+core@7.20.12: + resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} + engines: {node: '>= 10.14.2'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + babel-plugin-jest-hoist: 26.6.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.12 + + /bach/1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} + engines: {node: '>= 0.10'} + dependencies: + arr-filter: 1.1.2 + arr-flatten: 1.1.0 + arr-map: 2.0.2 + array-each: 1.0.1 + array-initial: 1.1.0 + array-last: 1.3.0 + async-done: 1.3.2 + async-settle: 1.0.0 + now-and-later: 2.0.1 + dev: false + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: false + + /binary-extensions/2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /binaryextensions/2.3.0: + resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} + engines: {node: '>=0.8'} + dev: false + + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + /blueimp-md5/2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /boolean/3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: true + optional: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + 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.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + + /braces/3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + /browser-resolve/1.11.3: + resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} + dependencies: + resolve: 1.1.7 + dev: true + + /browserslist/4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001621 + electron-to-chromium: 1.4.779 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16_browserslist@4.23.0 + + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-equal/1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + dev: false + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: false + + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + /cacheable-request/6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + dev: true + + /call-bind/1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase/3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: false + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /caniuse-lite/1.0.30001621: + resolution: {integrity: sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==} + + /canvas/2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.19.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + + /capture-exit/2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + + /caseless/0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chai/4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + /check-error/1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar/2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + dev: false + + /chokidar/3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + /ci-info/2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + /cjs-module-lexer/0.6.0: + resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} + + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + /clean-css/5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: false + + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cliui/3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: false + + /cliui/5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: true + + /cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone-buffer/1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + dev: false + + /clone-response/1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone-stats/1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + dev: false + + /clone/2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + + /cloneable-readable/1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: false + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + /code-point-at/1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: false + + /collect-v8-coverage/1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + /collection-map/1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-map: 2.0.2 + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: false + + /collection-visit/1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + /color/3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: false + + /component-emitter/1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + /compute-scroll-into-view/1.0.11: + resolution: {integrity: sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A==} + dev: false + + /compute-scroll-into-view/1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream/1.4.11: + resolution: {integrity: sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==} + engines: {'0': node >= 0.8} + dependencies: + inherits: 2.0.4 + readable-stream: 1.1.14 + typedarray: 0.0.7 + dev: false + + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: false + + /concordance/5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.3.4 + well-known-symbols: 2.0.0 + dev: true + + /confbox/0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + dev: true + + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + optional: true + + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /copy-anything/2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + + /copy-descriptor/0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + /copy-props/2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + dependencies: + each-props: 1.3.2 + is-plain-object: 5.0.0 + dev: false + + /core-js-compat/3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + dependencies: + browserslist: 4.23.0 + dev: false + + /core-util-is/1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css/3.0.0: + resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} + dependencies: + inherits: 2.0.4 + source-map: 0.6.1 + source-map-resolve: 0.6.0 + dev: false + + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + /cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + + /cssstyle/1.4.0: + resolution: {integrity: sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==} + dependencies: + cssom: 0.3.8 + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + + /csstype/3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /d/1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dependencies: + es5-ext: 0.10.64 + type: 2.7.2 + dev: false + + /d3-array/1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + dev: false + + /d3-dsv/2.0.0: + resolution: {integrity: sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==} + hasBin: true + dependencies: + commander: 2.20.3 + iconv-lite: 0.4.24 + rw: 1.3.3 + dev: false + + /d3-geo/1.12.1: + resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} + dependencies: + d3-array: 1.2.4 + dev: false + + /d3-hexbin/0.2.2: + resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==} + dev: false + + /d3-hierarchy/3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false + + /dashdash/1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-urls/1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + dev: true + + /data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + + /data-view-buffer/1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-length/1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /data-view-byte-offset/1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + /date-time/3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /dayjs/1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dev: false + + /debug-fabulous/1.1.0: + resolution: {integrity: sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==} + dependencies: + debug: 3.2.7 + memoizee: 0.4.15 + object-assign: 4.1.1 + dev: false + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + dependencies: + ms: 2.0.0 + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + dependencies: + ms: 2.1.3 + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + /decode-uri-component/0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + /decompress-response/3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: true + + /decompress-response/4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + dependencies: + mimic-response: 2.1.0 + + /deep-eql/4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-compare/1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 5.1.0 + dev: false + + /default-resolution/2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} + engines: {node: '>= 0.10'} + dev: false + + /defer-to-connect/1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: true + + /define-data-property/1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + + /define-properties/1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + /define-property/0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + + /define-property/1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + /detect-file/1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: false + + /detect-libc/2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + /detect-newline/2.1.0: + resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} + engines: {node: '>=0.10.0'} + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + /detect-node-es/1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + optional: true + + /diff-sequences/24.9.0: + resolution: {integrity: sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==} + engines: {node: '>= 6'} + dev: true + + /diff-sequences/26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: false + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-helpers/5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.24.5 + csstype: 3.1.3 + dev: false + + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception/1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 4.0.2 + dev: true + + /domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + + /domhandler/3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /duplexer3/0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: true + + /duplexify/3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + dev: false + + /duplexify/4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + dev: false + + /each-props/1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + dependencies: + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + dev: false + + /ecc-jsbn/0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /electron-to-chromium/1.4.779: + resolution: {integrity: sha512-oaTiIcszNfySXVJzKcjxd2YjPxziAd+GmXyb2HbidCeFo6Z88ygOT7EimlrEQhM2U08VhSrbKhLOXP0kKUCZ6g==} + + /electron/11.5.0: + resolution: {integrity: sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg==} + engines: {node: '>= 8.6'} + hasBin: true + requiresBuild: true + dependencies: + '@electron/get': 1.14.1 + '@types/node': 12.20.55 + extract-zip: 1.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /emittery/0.7.2: + resolution: {integrity: sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==} + engines: {node: '>=10'} + + /emoji-regex/7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + optional: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities/3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + optional: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract/1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + /es-array-method-boxes-properly/1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-define-property/1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors/1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-object-atoms/1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag/2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-shim-unscopables/1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: false + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /es5-ext/0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: false + + /es6-error/4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + optional: true + + /es6-iterator/2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + dev: false + + /es6-symbol/3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + dependencies: + d: 1.0.2 + ext: 1.7.0 + dev: false + + /es6-weak-map/2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + dev: false + + /esbuild-android-64/0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + dev: true + + /escalade/3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen/1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /escodegen/2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + /eslint-config-prettier/8.5.0_eslint@8.18.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.18.0 + dev: false + + /eslint-plugin-promise/6.0.0_eslint@8.18.0: + resolution: {integrity: sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.18.0 + dev: false + + /eslint-plugin-react-hooks/4.6.0_eslint@8.18.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.18.0 + dev: false + + /eslint-plugin-react/7.30.1_eslint@8.18.0: + resolution: {integrity: sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + doctrine: 2.1.0 + eslint: 8.18.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + dev: false + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + + /eslint-scope/7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-utils/3.0.0_eslint@8.18.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.18.0 + eslint-visitor-keys: 2.1.0 + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + /eslint-visitor-keys/3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint/8.18.0: + resolution: {integrity: sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-utils: 3.0.0_eslint@8.18.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 + transitivePeerDependencies: + - supports-color + + /esniff/2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: false + + /espree/9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2_acorn@8.11.3 + eslint-visitor-keys: 3.4.3 + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /event-emitter/0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + dev: false + + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /exec-sh/0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + + /execa/1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + /execa/4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + /expand-brackets/2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + + /expand-tilde/2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /expect/24.9.0: + resolution: {integrity: sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + ansi-styles: 3.2.1 + jest-get-type: 24.9.0 + jest-matcher-utils: 24.9.0 + jest-message-util: 24.9.0 + jest-regex-util: 24.9.0 + dev: true + + /expect/26.6.2: + resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + ansi-styles: 4.3.0 + jest-get-type: 26.3.0 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + + /ext/1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: false + + /extend-shallow/1.1.4: + resolution: {integrity: sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 1.1.0 + dev: false + + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + + /extend-shallow/3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + 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.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + + /extract-zip/1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + dependencies: + concat-stream: 1.6.2 + debug: 2.6.9 + mkdirp: 0.5.6 + yauzl: 2.10.0 + dev: true + + /extsprintf/1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fancy-log/1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + dependencies: + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff/1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob/3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein/1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} + dev: false + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq/1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + + /file-source/0.6.1: + resolution: {integrity: sha512-1R1KneL7eTXmXfKxC10V/9NeGOdbsAXJ+lQ//fvvcHUgtaZcZDWNJNblxAoVOyV1cj45pOtUrR3vZTBwqcW8XA==} + dependencies: + stream-source: 0.3.5 + dev: false + + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + optional: true + + /fill-range/4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + /fill-range/7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up/1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: false + + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /findup-sync/2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + dev: false + + /findup-sync/3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + dev: false + + /fined/1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: false + + /flagged-respawn/1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + dev: false + + /flat-cache/3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted/3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + /flush-write-stream/1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: false + + /focus-lock/1.3.5: + resolution: {integrity: sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /follow-redirects/1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in/1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + /for-own/1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: false + + /forever-agent/0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /fork-stream/0.0.4: + resolution: {integrity: sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==} + dev: false + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fraction.js/4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /fragment-cache/0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /fs-mkdirp-stream/1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + dependencies: + graceful-fs: 4.2.11 + through2: 2.0.5 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.19.0 + optional: true + + /fsevents/2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name/1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /geobuf/3.0.2: + resolution: {integrity: sha512-ASgKwEAQQRnyNFHNvpd5uAwstbVYmiTW0Caw3fBb509tNTqXyAAPMyFs5NNihsLZhLxU1j/kjFhkhLWA9djuVg==} + hasBin: true + dependencies: + concat-stream: 2.0.0 + pbf: 3.2.1 + shapefile: 0.6.6 + dev: false + + /geojson-dissolve/3.1.0: + resolution: {integrity: sha512-JXHfn+A3tU392HA703gJbjmuHaQOAE/C1KzbELCczFRFux+GdY6zt1nKb1VMBHp4LWeE7gUY2ql+g06vJqhiwQ==} + dependencies: + '@turf/meta': 3.14.0 + geojson-flatten: 0.2.4 + geojson-linestring-dissolve: 0.0.1 + topojson-client: 3.1.0 + topojson-server: 3.0.1 + dev: false + + /geojson-flatten/0.2.4: + resolution: {integrity: sha512-LiX6Jmot8adiIdZ/fthbcKKPOfWjTQchX/ggHnwMZ2e4b0I243N1ANUos0LvnzepTEsj0+D4fIJ5bKhBrWnAHA==} + hasBin: true + dependencies: + get-stdin: 6.0.0 + minimist: 1.2.0 + dev: false + + /geojson-linestring-dissolve/0.0.1: + resolution: {integrity: sha512-Y8I2/Ea28R/Xeki7msBcpMvJL2TaPfaPKP8xqueJfQ9/jEhps+iOJxOR2XCBGgVb12Z6XnDb1CMbaPfLepsLaw==} + dev: false + + /get-caller-file/1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: false + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name/2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic/1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + /get-stdin/6.0.0: + resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} + engines: {node: '>=4'} + dev: false + + /get-stream/4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-symbol-description/1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + /get-value/2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + /getpass/0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /glob-parent/3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-stream/6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + dependencies: + extend: 3.0.2 + glob: 7.2.3 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + dev: false + + /glob-watcher/5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + dependencies: + anymatch: 2.0.0 + async-done: 1.3.2 + chokidar: 2.1.8 + is-negated-glob: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 + object.defaults: 1.1.0 + dev: false + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob/8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + + /global-agent/3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.3.4 + serialize-error: 7.0.1 + dev: true + optional: true + + /global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-prefix/1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /global-tunnel-ng/2.7.1: + resolution: {integrity: sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + encodeurl: 1.0.2 + lodash: 4.17.21 + npm-conf: 1.1.3 + tunnel: 0.0.6 + dev: true + optional: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals/13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globalthis/1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + /glogg/1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + dependencies: + sparkles: 1.0.1 + dev: false + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + + /got/9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /growly/1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + optional: true + + /gulp-clean/0.4.0: + resolution: {integrity: sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==} + engines: {node: '>=0.9'} + dependencies: + fancy-log: 1.3.3 + plugin-error: 0.1.2 + rimraf: 2.7.1 + through2: 2.0.5 + vinyl: 2.2.1 + dev: false + + /gulp-cli/2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + ansi-colors: 1.1.0 + archy: 1.0.0 + array-sort: 1.0.0 + color-support: 1.1.3 + concat-stream: 1.6.2 + copy-props: 2.0.5 + fancy-log: 1.3.3 + gulplog: 1.0.0 + interpret: 1.4.0 + isobject: 3.0.1 + liftoff: 3.1.0 + matchdep: 2.0.0 + mute-stdout: 1.0.1 + pretty-hrtime: 1.0.3 + replace-homedir: 1.0.0 + semver-greatest-satisfied-range: 1.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 + dev: false + + /gulp-if/3.0.0: + resolution: {integrity: sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==} + dependencies: + gulp-match: 1.1.0 + ternary-stream: 3.0.0 + through2: 3.0.2 + dev: false + + /gulp-match/1.1.0: + resolution: {integrity: sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==} + dependencies: + minimatch: 3.1.2 + dev: false + + /gulp-replace/1.1.4: + resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} + engines: {node: '>=10'} + dependencies: + '@types/node': 20.12.12 + '@types/vinyl': 2.0.7 + istextorbinary: 3.3.0 + replacestream: 4.0.3 + yargs-parser: 21.1.1 + dev: false + + /gulp-sourcemaps/3.0.0: + resolution: {integrity: sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ==} + engines: {node: '>= 6'} + dependencies: + '@gulp-sourcemaps/identity-map': 2.0.1 + '@gulp-sourcemaps/map-sources': 1.0.0 + acorn: 6.4.2 + convert-source-map: 1.9.0 + css: 3.0.0 + debug-fabulous: 1.1.0 + detect-newline: 2.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + strip-bom-string: 1.0.0 + through2: 2.0.5 + dev: false + + /gulp-typescript/6.0.0-alpha.1_typescript@4.9.5: + resolution: {integrity: sha512-KoT0TTfjfT7w3JItHkgFH1T/zK4oXWC+a8xxKfniRfVcA0Fa1bKrIhztYelYmb+95RB80OLMBreknYkdwzdi2Q==} + engines: {node: '>= 8'} + peerDependencies: + typescript: '~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev ' + dependencies: + ansi-colors: 4.1.3 + plugin-error: 1.0.1 + source-map: 0.7.4 + through2: 3.0.2 + typescript: 4.9.5 + vinyl: 2.2.1 + vinyl-fs: 3.0.3 + dev: false + + /gulp/4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 + vinyl-fs: 3.0.3 + dev: false + + /gulplog/1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} + engines: {node: '>= 0.10'} + dependencies: + glogg: 1.0.2 + dev: false + + /har-schema/2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors/1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + + /has-proto/1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag/1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + /has-value/0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + /has-value/1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + /has-values/0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + /has-values/1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + /hasown/2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /highlight.js/11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: false + + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + /html-encoding-sniffer/1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + /htmlparser2/4.1.0: + resolution: {integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==} + dependencies: + domelementtype: 2.3.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /http-signature/1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /human-signals/1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + optional: true + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore/5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + /image-size/0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + optional: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /internal-slot/1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + /interpret/1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: false + + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /invert-kv/1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-absolute/1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: false + + /is-accessor-descriptor/1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.2 + + /is-array-buffer/3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path/1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: false + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: false + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci/2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + + /is-core-module/2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + + /is-data-descriptor/1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-view/1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-descriptor/0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + /is-descriptor/1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point/1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: false + + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + /is-glob/3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: false + + /is-negated-glob/1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + dev: false + + /is-negative-zero/2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-number/3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + + /is-number/4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + /is-promise/2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: false + + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + /is-relative/1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: false + + /is-shared-array-buffer/1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-typed-array/1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-unc-path/1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: false + + /is-url/1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-utf8/0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: false + + /is-valid-glob/1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + + /is-what/3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject/2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + /isstream/0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /istanbul-lib-coverage/2.0.5: + resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} + engines: {node: '>=6'} + dev: true + + /istanbul-lib-coverage/3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + /istanbul-lib-instrument/3.3.0: + resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} + engines: {node: '>=6'} + dependencies: + '@babel/generator': 7.21.1 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + istanbul-lib-coverage: 2.0.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument/4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.20.12 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.20.12 + '@babel/parser': 7.24.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /istanbul-lib-report/3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + /istanbul-reports/3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /istextorbinary/3.3.0: + resolution: {integrity: sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==} + engines: {node: '>=8'} + dependencies: + binaryextensions: 2.3.0 + textextensions: 3.3.0 + dev: false + + /jest-changed-files/26.6.2: + resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + execa: 4.1.0 + throat: 5.0.0 + + /jest-cli/26.6.3: + resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + is-ci: 2.0.0 + jest-config: 26.6.3 + jest-util: 26.6.2 + jest-validate: 26.6.2 + prompts: 2.4.2 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-cli/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3_canvas@2.11.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + is-ci: 2.0.0 + jest-config: 26.6.3_canvas@2.11.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + prompts: 2.4.2 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jest-config/24.9.0: + resolution: {integrity: sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==} + engines: {node: '>= 6'} + dependencies: + '@babel/core': 7.20.12 + '@jest/test-sequencer': 24.9.0 + '@jest/types': 24.9.0 + babel-jest: 24.9.0_@babel+core@7.20.12 + chalk: 2.4.2 + glob: 7.2.3 + jest-environment-jsdom: 24.9.0 + jest-environment-node: 24.9.0 + jest-get-type: 24.9.0 + jest-jasmine2: 24.9.0 + jest-regex-util: 24.9.0 + jest-resolve: 24.9.0 + jest-util: 24.9.0 + jest-validate: 24.9.0 + micromatch: 3.1.10 + pretty-format: 24.9.0 + realpath-native: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config/26.6.3: + resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} + engines: {node: '>= 10.14.2'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.12 + '@jest/test-sequencer': 26.6.3 + '@jest/types': 26.6.2 + babel-jest: 26.6.3_@babel+core@7.20.12 + chalk: 4.1.2 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-environment-jsdom: 26.6.2 + jest-environment-node: 26.6.2 + jest-get-type: 26.3.0 + jest-jasmine2: 26.6.3 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + micromatch: 4.0.7 + pretty-format: 26.6.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-config/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} + engines: {node: '>= 10.14.2'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.12 + '@jest/test-sequencer': 26.6.3_canvas@2.11.2 + '@jest/types': 26.6.2 + babel-jest: 26.6.3_@babel+core@7.20.12 + chalk: 4.1.2 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-environment-jsdom: 26.6.2_canvas@2.11.2 + jest-environment-node: 26.6.2 + jest-get-type: 26.3.0 + jest-jasmine2: 26.6.3_canvas@2.11.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + micromatch: 4.0.7 + pretty-format: 26.6.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + /jest-diff/24.9.0: + resolution: {integrity: sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==} + engines: {node: '>= 6'} + dependencies: + chalk: 2.4.2 + diff-sequences: 24.9.0 + jest-get-type: 24.9.0 + pretty-format: 24.9.0 + dev: true + + /jest-diff/26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock/24.9.0: + resolution: {integrity: sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==} + engines: {node: '>= 6'} + dependencies: + detect-newline: 2.1.0 + dev: true + + /jest-docblock/26.0.0: + resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} + engines: {node: '>= 10.14.2'} + dependencies: + detect-newline: 3.1.0 + + /jest-each/24.9.0: + resolution: {integrity: sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + chalk: 2.4.2 + jest-get-type: 24.9.0 + jest-util: 24.9.0 + pretty-format: 24.9.0 + dev: true + + /jest-each/26.6.2: + resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + chalk: 4.1.2 + jest-get-type: 26.3.0 + jest-util: 26.6.2 + pretty-format: 26.6.2 + + /jest-electron/0.1.12_jest@26.6.3: + resolution: {integrity: sha512-10Hjr1kpyWz5cj9Xs/Xfb8yvF1LZPVmyEMHu/A/VhgvIV5yiP9uD8FHNc4HAfEnZHM+wvpR5YfveBTUAiNfwnA==} + peerDependencies: + jest: ^24.0.0 + dependencies: + electron: 11.5.0 + jest: 26.6.3_canvas@2.11.2 + jest-haste-map: 24.9.0 + jest-message-util: 24.9.0 + jest-mock: 24.9.0 + jest-resolve: 24.9.0 + jest-runner: 24.9.0 + jest-runtime: 24.9.0 + jest-util: 24.9.0 + throat: 5.0.0 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-environment-jsdom/24.9.0: + resolution: {integrity: sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==} + engines: {node: '>= 6'} + dependencies: + '@jest/environment': 24.9.0 + '@jest/fake-timers': 24.9.0 + '@jest/types': 24.9.0 + jest-mock: 24.9.0 + jest-util: 24.9.0 + jsdom: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-environment-jsdom/26.6.2: + resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + jest-mock: 26.6.2 + jest-util: 26.6.2 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-jsdom/26.6.2_canvas@2.11.2: + resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + jest-mock: 26.6.2 + jest-util: 26.6.2 + jsdom: 16.7.0_canvas@2.11.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + /jest-environment-node/24.9.0: + resolution: {integrity: sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==} + engines: {node: '>= 6'} + dependencies: + '@jest/environment': 24.9.0 + '@jest/fake-timers': 24.9.0 + '@jest/types': 24.9.0 + jest-mock: 24.9.0 + jest-util: 24.9.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-environment-node/26.6.2: + resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + jest-mock: 26.6.2 + jest-util: 26.6.2 + + /jest-extended/1.2.1: + resolution: {integrity: sha512-eKZR5iDpyTkcDesj16FpIPnjAWQNUB81ZFQW08EIddM6iqO7DjRIi39td9qol+1dpJS4Mqr9Qzp8ZMhanbSeug==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + expect: 26.6.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + dev: true + + /jest-get-type/24.9.0: + resolution: {integrity: sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==} + engines: {node: '>= 6'} + dev: true + + /jest-get-type/26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map/24.9.0: + resolution: {integrity: sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + anymatch: 2.0.0 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-serializer: 24.9.0 + jest-util: 24.9.0 + jest-worker: 24.9.0 + micromatch: 3.1.10 + sane: 4.1.0 + walker: 1.0.8 + optionalDependencies: + fsevents: 1.2.13 + dev: true + + /jest-haste-map/26.6.2: + resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.12.12 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 26.0.0 + jest-serializer: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + micromatch: 4.0.7 + sane: 4.1.0 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + /jest-jasmine2/24.9.0: + resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} + engines: {node: '>= 6'} + dependencies: + '@babel/traverse': 7.24.5 + '@jest/environment': 24.9.0 + '@jest/test-result': 24.9.0 + '@jest/types': 24.9.0 + chalk: 2.4.2 + co: 4.6.0 + expect: 24.9.0 + is-generator-fn: 2.1.0 + jest-each: 24.9.0 + jest-matcher-utils: 24.9.0 + jest-message-util: 24.9.0 + jest-runtime: 24.9.0 + jest-snapshot: 24.9.0 + jest-util: 24.9.0 + pretty-format: 24.9.0 + throat: 4.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-jasmine2/26.6.3: + resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/traverse': 7.24.5 + '@jest/environment': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + co: 4.6.0 + expect: 26.6.2 + is-generator-fn: 2.1.0 + jest-each: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-runtime: 26.6.3 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + pretty-format: 26.6.2 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-jasmine2/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/traverse': 7.24.5 + '@jest/environment': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + co: 4.6.0 + expect: 26.6.2 + is-generator-fn: 2.1.0 + jest-each: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-runtime: 26.6.3_canvas@2.11.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + pretty-format: 26.6.2 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jest-leak-detector/24.9.0: + resolution: {integrity: sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==} + engines: {node: '>= 6'} + dependencies: + jest-get-type: 24.9.0 + pretty-format: 24.9.0 + dev: true + + /jest-leak-detector/26.6.2: + resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} + engines: {node: '>= 10.14.2'} + dependencies: + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + /jest-matcher-utils/24.9.0: + resolution: {integrity: sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==} + engines: {node: '>= 6'} + dependencies: + chalk: 2.4.2 + jest-diff: 24.9.0 + jest-get-type: 24.9.0 + pretty-format: 24.9.0 + dev: true + + /jest-matcher-utils/26.6.2: + resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util/24.9.0: + resolution: {integrity: sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==} + engines: {node: '>= 6'} + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/test-result': 24.9.0 + '@jest/types': 24.9.0 + '@types/stack-utils': 1.0.1 + chalk: 2.4.2 + micromatch: 3.1.10 + slash: 2.0.0 + stack-utils: 1.0.5 + dev: true + + /jest-message-util/26.6.2: + resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 26.6.2 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 26.6.2 + slash: 3.0.0 + stack-utils: 2.0.6 + + /jest-mock/24.9.0: + resolution: {integrity: sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + dev: true + + /jest-mock/26.6.2: + resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + + /jest-pnp-resolver/1.2.3_jest-resolve@24.9.0: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 24.9.0 + dev: true + + /jest-pnp-resolver/1.2.3_jest-resolve@26.6.2: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 26.6.2 + + /jest-regex-util/24.9.0: + resolution: {integrity: sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==} + engines: {node: '>= 6'} + dev: true + + /jest-regex-util/26.0.0: + resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} + engines: {node: '>= 10.14.2'} + + /jest-resolve-dependencies/26.6.3: + resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + jest-regex-util: 26.0.0 + jest-snapshot: 26.6.2 + + /jest-resolve/24.9.0: + resolution: {integrity: sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + browser-resolve: 1.11.3 + chalk: 2.4.2 + jest-pnp-resolver: 1.2.3_jest-resolve@24.9.0 + realpath-native: 1.1.0 + dev: true + + /jest-resolve/26.6.2: + resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-pnp-resolver: 1.2.3_jest-resolve@26.6.2 + jest-util: 26.6.2 + read-pkg-up: 7.0.1 + resolve: 1.22.8 + slash: 3.0.0 + + /jest-runner/24.9.0: + resolution: {integrity: sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==} + engines: {node: '>= 6'} + dependencies: + '@jest/console': 24.9.0 + '@jest/environment': 24.9.0 + '@jest/test-result': 24.9.0 + '@jest/types': 24.9.0 + chalk: 2.4.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 24.9.0 + jest-docblock: 24.9.0 + jest-haste-map: 24.9.0 + jest-jasmine2: 24.9.0 + jest-leak-detector: 24.9.0 + jest-message-util: 24.9.0 + jest-resolve: 24.9.0 + jest-runtime: 24.9.0 + jest-util: 24.9.0 + jest-worker: 24.9.0 + source-map-support: 0.5.21 + throat: 4.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runner/26.6.3: + resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + emittery: 0.7.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 26.6.3 + jest-docblock: 26.0.0 + jest-haste-map: 26.6.2 + jest-leak-detector: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + jest-runtime: 26.6.3 + jest-util: 26.6.2 + jest-worker: 26.6.2 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-runner/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + emittery: 0.7.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 26.6.3_canvas@2.11.2 + jest-docblock: 26.0.0 + jest-haste-map: 26.6.2 + jest-leak-detector: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + jest-runtime: 26.6.3_canvas@2.11.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jest-runtime/24.9.0: + resolution: {integrity: sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==} + engines: {node: '>= 6'} + hasBin: true + dependencies: + '@jest/console': 24.9.0 + '@jest/environment': 24.9.0 + '@jest/source-map': 24.9.0 + '@jest/transform': 24.9.0 + '@jest/types': 24.9.0 + '@types/yargs': 13.0.12 + chalk: 2.4.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 24.9.0 + jest-haste-map: 24.9.0 + jest-message-util: 24.9.0 + jest-mock: 24.9.0 + jest-regex-util: 24.9.0 + jest-resolve: 24.9.0 + jest-snapshot: 24.9.0 + jest-util: 24.9.0 + jest-validate: 24.9.0 + realpath-native: 1.1.0 + slash: 2.0.0 + strip-bom: 3.0.0 + yargs: 13.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime/26.6.3: + resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/globals': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + cjs-module-lexer: 0.6.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 26.6.3 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-runtime/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/globals': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + cjs-module-lexer: 0.6.0 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-config: 26.6.3_canvas@2.11.2 + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jest-serializer/24.9.0: + resolution: {integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==} + engines: {node: '>= 6'} + dev: true + + /jest-serializer/26.6.2: + resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/node': 20.12.12 + graceful-fs: 4.2.11 + + /jest-snapshot/24.9.0: + resolution: {integrity: sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==} + engines: {node: '>= 6'} + dependencies: + '@babel/types': 7.24.5 + '@jest/types': 24.9.0 + chalk: 2.4.2 + expect: 24.9.0 + jest-diff: 24.9.0 + jest-get-type: 24.9.0 + jest-matcher-utils: 24.9.0 + jest-message-util: 24.9.0 + jest-resolve: 24.9.0 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + pretty-format: 24.9.0 + semver: 6.3.1 + dev: true + + /jest-snapshot/26.6.2: + resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/types': 7.24.5 + '@jest/types': 26.6.2 + '@types/babel__traverse': 7.20.6 + '@types/prettier': 2.7.3 + chalk: 4.1.2 + expect: 26.6.2 + graceful-fs: 4.2.11 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + jest-haste-map: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + natural-compare: 1.4.0 + pretty-format: 26.6.2 + semver: 7.3.4 + + /jest-util/24.9.0: + resolution: {integrity: sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==} + engines: {node: '>= 6'} + dependencies: + '@jest/console': 24.9.0 + '@jest/fake-timers': 24.9.0 + '@jest/source-map': 24.9.0 + '@jest/test-result': 24.9.0 + '@jest/types': 24.9.0 + callsites: 3.1.0 + chalk: 2.4.2 + graceful-fs: 4.2.11 + is-ci: 2.0.0 + mkdirp: 0.5.6 + slash: 2.0.0 + source-map: 0.6.1 + dev: true + + /jest-util/26.6.2: + resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + chalk: 4.1.2 + graceful-fs: 4.2.11 + is-ci: 2.0.0 + micromatch: 4.0.7 + + /jest-validate/24.9.0: + resolution: {integrity: sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + camelcase: 5.3.1 + chalk: 2.4.2 + jest-get-type: 24.9.0 + leven: 3.1.0 + pretty-format: 24.9.0 + dev: true + + /jest-validate/26.6.2: + resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 26.3.0 + leven: 3.1.0 + pretty-format: 26.6.2 + + /jest-watcher/26.6.2: + resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 20.12.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 26.6.2 + string-length: 4.0.2 + + /jest-worker/24.9.0: + resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} + engines: {node: '>= 6'} + dependencies: + merge-stream: 2.0.0 + supports-color: 6.1.0 + dev: true + + /jest-worker/26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.12.12 + merge-stream: 2.0.0 + supports-color: 7.2.0 + + /jest/26.6.3: + resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3 + import-local: 3.1.0 + jest-cli: 26.6.3 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest/26.6.3_canvas@2.11.2: + resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3_canvas@2.11.2 + import-local: 3.1.0 + jest-cli: 26.6.3_canvas@2.11.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /js-string-escape/1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn/0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsdom/11.12.0: + resolution: {integrity: sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==} + dependencies: + abab: 2.0.6 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 1.4.0 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwsapi: 2.2.10 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9_request@2.88.2 + sax: 1.3.0 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 5.2.3 + xml-name-validator: 3.0.0 + dev: true + + /jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.10 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsdom/16.7.0_canvas@2.11.2: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 6.0.0 + canvas: 2.11.2 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.10 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: false + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer/3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + dev: true + + /json-buffer/3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsprim/1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jsx-ast-utils/3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + dev: false + + /just-debounce/1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + dev: false + + /keyv/3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + dependencies: + json-buffer: 3.0.0 + dev: true + + /keyv/4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /kind-of/1.1.0: + resolution: {integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==} + engines: {node: '>=0.10.0'} + dev: false + + /kind-of/3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of/4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: false + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /last-run/1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} + engines: {node: '>= 0.10'} + dependencies: + default-resolution: 2.0.0 + es6-weak-map: 2.0.3 + dev: false + + /lazystream/1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: false + + /lcid/1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: false + + /lead/1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + dependencies: + flush-write-stream: 1.1.1 + dev: false + + /left-pad/1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + dev: true + + /less/4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /liftoff/3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + dependencies: + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.22.8 + dev: false + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /linkify-it/4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: false + + /load-json-file/1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: false + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /local-pkg/0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe/2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lowercase-keys/1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: true + + /lowercase-keys/2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-queue/0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.64 + dev: false + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /magic-string/0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + + /make-dir/4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.2 + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + /make-iterator/1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: false + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + + /map-cache/0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + /map-visit/1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + + /markdown-it/13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: false + + /marked/0.3.19: + resolution: {integrity: sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /matchdep/2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} + engines: {node: '>= 0.10.0'} + dependencies: + findup-sync: 2.0.0 + micromatch: 3.1.10 + resolve: 1.22.8 + stack-trace: 0.0.10 + dev: false + + /matcher/3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 4.0.0 + dev: true + optional: true + + /md5-hex/3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mdurl/1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: false + + /memoizee/0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: false + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch/3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + + /micromatch/4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + optional: true + + /mime/3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response/1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response/2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist/1.2.0: + resolution: {integrity: sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==} + dev: false + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass/3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass/5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mlly/1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /mute-stdout/1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + dev: false + + /nan/2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + + /nanoid/3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + 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.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /needle/3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + sax: 1.3.0 + optional: true + + /next-tick/1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + /node-fetch/2.6.6: + resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch/2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + /node-notifier/8.0.2: + resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} + requiresBuild: true + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.3.4 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + optional: true + + /node-releases/2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + /normalize-path/2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url/4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + dev: true + + /now-and-later/2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + dependencies: + once: 1.4.0 + dev: false + + /npm-conf/1.1.3: + resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==} + engines: {node: '>=4'} + dependencies: + config-chain: 1.1.13 + pify: 3.0.0 + dev: true + optional: true + + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + /number-is-nan/1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: false + + /number-precision/1.6.0: + resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==} + dev: false + + /nwsapi/2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy/0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + /object-inspect/1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit/1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /object.assign/4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.defaults/1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: false + + /object.entries/1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: false + + /object.fromentries/2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: false + + /object.getownpropertydescriptors/2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.7 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + gopd: 1.0.1 + safe-array-concat: 1.1.2 + dev: true + + /object.hasown/1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: false + + /object.map/1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: false + + /object.pick/1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /object.reduce/1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: false + + /object.values/1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: true + + /optionator/0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + /ordered-read-streams/1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + dependencies: + readable-stream: 2.3.8 + dev: false + + /os-locale/1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: false + + /p-cancelable/1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + dev: true + + /p-each-series/2.2.0: + resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} + engines: {node: '>=8'} + + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-filepath/1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: false + + /parse-json/2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: false + + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + /parse-passwd/1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /parse-svg-path/0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + dev: false + + /parse5/4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + dev: true + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + /pascalcase/0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + /path-browserify/1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false + + /path-data-parser/0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + dev: false + + /path-dirname/1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: false + + /path-exists/2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: false + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-root-regex/0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + dev: false + + /path-root/0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: false + + /path-source/0.1.3: + resolution: {integrity: sha512-dWRHm5mIw5kw0cs3QZLNmpUWty48f5+5v9nWD2dw3Y0Hf+s01Ag8iJEWV0Sm0kocE8kK27DrIowha03e1YR+Qw==} + dependencies: + array-source: 0.0.4 + file-source: 0.6.1 + dev: false + + /path-type/1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: false + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathe/1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /pbf/3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: false + + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now/2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors/0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: false + + /picocolors/1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + optional: true + + /pinkie-promise/2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: false + + /pinkie/2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false + + /pirates/4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + + /pkg-types/1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + dependencies: + confbox: 0.1.7 + mlly: 1.7.0 + pathe: 1.1.2 + dev: true + + /plugin-error/0.1.2: + resolution: {integrity: sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-cyan: 0.1.1 + ansi-red: 0.1.1 + arr-diff: 1.1.0 + arr-union: 2.1.0 + extend-shallow: 1.1.4 + dev: false + + /plugin-error/1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} + dependencies: + ansi-colors: 1.1.0 + arr-diff: 4.0.0 + arr-union: 3.1.0 + extend-shallow: 3.0.2 + dev: false + + /pn/1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + dev: true + + /point-at-length/1.1.0: + resolution: {integrity: sha512-nNHDk9rNEh/91o2Y8kHLzBLNpLf80RYd2gCun9ss+V0ytRSf6XhryBTx071fesktjbachRmGuUbId+JQmzhRXw==} + dependencies: + abs-svg-path: 0.1.1 + isarray: 0.0.1 + parse-svg-path: 0.1.2 + dev: false + + /points-on-curve/0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + dev: false + + /points-on-path/0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + dev: false + + /posix-character-classes/0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + /possible-typed-array-names/1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss/7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + dev: false + + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + /prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prepend-http/2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + dev: true + + /pretty-format/24.9.0: + resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==} + engines: {node: '>= 6'} + dependencies: + '@jest/types': 24.9.0 + ansi-regex: 4.1.1 + ansi-styles: 3.2.1 + react-is: 16.13.1 + dev: true + + /pretty-format/26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-hrtime/1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: false + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /proto-list/1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + optional: true + + /protocol-buffers-schema/3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: false + + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /prr/1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + optional: true + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + /pump/2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /pumpify/1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: false + + /punycode/2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-clientside-effect/1.2.6_react@18.3.1: + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.24.5 + react: 18.3.1 + dev: false + + /react-dom/18.3.1_react@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + /react-focus-lock/2.12.1_2eeaxkqdcvbrwk75oeh4jz4him: + resolution: {integrity: sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.2 + focus-lock: 1.3.5 + prop-types: 15.8.1 + react: 18.3.1 + react-clientside-effect: 1.2.6_react@18.3.1 + use-callback-ref: 1.3.2_2eeaxkqdcvbrwk75oeh4jz4him + use-sidecar: 1.1.2_2eeaxkqdcvbrwk75oeh4jz4him + dev: false + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + /react-refresh/0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react-router-dom/6.9.0_nnrd3gsncyragczmpvfhocinkq: + resolution: {integrity: sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.4.0 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + react-router: 6.9.0_react@18.3.1 + dev: false + + /react-router/6.9.0_react@18.3.1: + resolution: {integrity: sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.4.0 + react: 18.3.1 + dev: false + + /react-transition-group/4.4.5_nnrd3gsncyragczmpvfhocinkq: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.24.5 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + dev: false + + /react/18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up/1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: false + + /read-pkg-up/4.0.0: + resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + /read-pkg/1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: false + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + /readable-stream/1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream/3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp/2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + dev: false + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /realpath-native/1.1.0: + resolution: {integrity: sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==} + engines: {node: '>=4'} + dependencies: + util.promisify: 1.1.2 + dev: true + + /rechoir/0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: false + + /regenerate-unicode-properties/10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regenerator-runtime/0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /regenerator-transform/0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.24.5 + dev: false + + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + /regexp.prototype.flags/1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + /regexpu-core/5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + + /remove-bom-buffer/3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + dev: false + + /remove-bom-stream/1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + dev: false + + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + /repeat-string/1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + /replace-ext/1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: false + + /replace-homedir/1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + is-absolute: 1.0.0 + remove-trailing-separator: 1.1.0 + dev: false + + /replacestream/4.0.3: + resolution: {integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + readable-stream: 2.3.8 + dev: false + + /request-promise-core/1.1.4_request@2.88.2: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + dependencies: + lodash: 4.17.21 + request: 2.88.2 + dev: true + + /request-promise-native/1.0.9_request@2.88.2: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4_request@2.88.2 + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + dev: true + + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-main-filename/1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: false + + /require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /resize-observer-polyfill/1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + + /resolve-dir/1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-options/1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + dependencies: + value-or-function: 3.0.0 + dev: false + + /resolve-protobuf-schema/2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: false + + /resolve-url/0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + /resolve/1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true + + /resolve/1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve/2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /responselike/1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + dependencies: + lowercase-keys: 1.0.1 + dev: true + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /roarr/2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + dev: true + optional: true + + /rollup-plugin-visualizer/5.9.2_rollup@3.20.5: + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 3.20.5 + source-map: 0.7.4 + yargs: 17.7.2 + dev: false + + /rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup/3.20.5: + resolution: {integrity: sha512-Mx6NE3nLPIP6a9ReV4dTPOYYmDiyarJNtSbc37Jx0jvh8SHySoFPgyZAp9aDP3LnYvaJOrz+fclcwq3oZDzlnA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /roughjs/4.5.2: + resolution: {integrity: sha512-2xSlLDKdsWyFxrveYWk9YQ/Y9UfK38EAMRNkYkMqYBJvPX8abCa9PN0x3w02H8Oa6/0bcZICJU+U95VumPqseg==} + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + dev: false + + /rsvp/4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw/1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /safe-array-concat/1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test/1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + /safe-regex/1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sane/4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.2 + micromatch: 3.1.10 + minimist: 1.2.8 + walker: 1.0.8 + + /sax/1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + /saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + + /scheduler/0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + + /scroll-into-view-if-needed/2.2.20: + resolution: {integrity: sha512-P9kYMrhi9f6dvWwTGpO5I3HgjSU/8Mts7xL3lkoH5xlewK7O9Obdc5WmMCzppln7bCVGNmf3qfoZXrpCeyNJXw==} + dependencies: + compute-scroll-into-view: 1.0.11 + dev: false + + /semver-compare/1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: true + optional: true + + /semver-greatest-satisfied-range/1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} + engines: {node: '>= 0.10'} + dependencies: + sver-compat: 1.5.0 + dev: false + + /semver/5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver/6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver/7.3.4: + resolution: {integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver/7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + /serialize-error/7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + dev: true + optional: true + + /serialize-javascript/6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: false + + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + /set-function-length/1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + /set-function-name/2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + /shallowequal/1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: false + + /shapefile/0.6.6: + resolution: {integrity: sha512-rLGSWeK2ufzCVx05wYd+xrWnOOdSV7xNUW5/XFgx3Bc02hBkpMlrd2F1dDII7/jhWzv0MSyBFh5uJIy9hLdfuw==} + hasBin: true + dependencies: + array-source: 0.0.4 + commander: 2.20.3 + path-source: 0.1.3 + slice-source: 0.4.1 + stream-source: 0.3.5 + text-encoding: 0.6.4 + dev: false + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shellwords/0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + optional: true + + /side-channel/1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + /siginfo/2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + /simple-get/3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + + /simple-statistics/7.8.3: + resolution: {integrity: sha512-JFvMY00t6SBGtwMuJ+nqgsx9ylkMiJ5JlK9bkj8AdvniIe5615wWQYkKHXe84XtSuc40G/tlrPu0A5/NlJvv8A==} + dev: false + + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /simplify-geojson/1.0.5: + resolution: {integrity: sha512-02l1W4UipP5ivNVq6kX15mAzCRIV1oI3tz0FUEyOsNiv1ltuFDjbNhO+nbv/xhbDEtKqWLYuzpWhUsJrjR/ypA==} + hasBin: true + dependencies: + concat-stream: 1.4.11 + minimist: 1.2.6 + simplify-geometry: 0.0.2 + dev: false + + /simplify-geometry/0.0.2: + resolution: {integrity: sha512-ZEyrplkqgCqDlL7V8GbbYgTLlcnNF+MWWUdy8s8ZeJru50bnI71rDew/I+HG36QS2mPOYAq1ZjwNXxHJ8XOVBw==} + dev: false + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slash/4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: false + + /slice-source/0.4.1: + resolution: {integrity: sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==} + dev: false + + /smob/0.0.6: + resolution: {integrity: sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==} + dev: false + + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + + /snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + + /source-map-js/1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + /source-map-resolve/0.6.0: + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + dev: false + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /sparkles/1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + dev: false + + /spdx-correct/3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + /spdx-exceptions/2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + /spdx-license-ids/3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /sprintf-js/1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + dev: true + optional: true + + /sshpk/1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stack-trace/0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /stack-utils/1.0.5: + resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + + /stackback/0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /static-extend/0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + /std-env/3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /stealthy-require/1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + dev: true + + /stream-exhaust/1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + + /stream-shift/1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: false + + /stream-source/0.3.5: + resolution: {integrity: sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==} + dev: false + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + /string-width/1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: false + + /string-width/3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string.prototype.matchall/4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: false + + /string.prototype.trim/1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + /string.prototype.trimend/1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + /string.prototype.trimstart/1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + /string_decoder/0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi/3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: false + + /strip-ansi/5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom-string/1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom/2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: false + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-literal/1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: true + + /sumchecker/3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color/6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /sver-compat/1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + dev: false + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + /tar/6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + + /ternary-stream/3.0.0: + resolution: {integrity: sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==} + dependencies: + duplexify: 4.1.3 + fork-stream: 0.0.4 + merge-stream: 2.0.0 + through2: 3.0.2 + dev: false + + /terser/5.17.1: + resolution: {integrity: sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude/5.2.3: + resolution: {integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==} + engines: {node: '>=6'} + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + read-pkg-up: 4.0.0 + require-main-filename: 2.0.0 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + /text-encoding/0.6.4: + resolution: {integrity: sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==} + deprecated: no longer maintained + dev: false + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /textextensions/3.3.0: + resolution: {integrity: sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==} + engines: {node: '>=8'} + dev: false + + /throat/4.1.0: + resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} + dev: true + + /throat/5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + /through2-filter/3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + dev: false + + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: false + + /through2/3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: false + + /time-stamp/1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} + dev: false + + /time-zone/1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /timers-ext/0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + dev: false + + /tinybench/2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + dev: true + + /tinypool/0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy/2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + /to-absolute-glob/2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + dev: false + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path/0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + + /to-readable-stream/1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + dev: true + + /to-regex-range/2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + 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: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + dependencies: + through2: 2.0.5 + dev: false + + /topojson-client/3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: false + + /topojson-server/3.0.1: + resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: false + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + dev: true + + /tough-cookie/4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + + /ts-jest/26.5.6_xuote2qreek47x2di7kesslrai: + resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} + engines: {node: '>= 10'} + hasBin: true + peerDependencies: + jest: '>=26 <27' + typescript: '>=3.8 <5.0' + dependencies: + bs-logger: 0.2.6 + buffer-from: 1.1.2 + fast-json-stable-stringify: 2.1.0 + jest: 26.6.3_canvas@2.11.2 + jest-util: 26.6.2 + json5: 2.2.3 + lodash: 4.17.21 + make-error: 1.3.6 + mkdirp: 1.0.4 + semver: 7.3.4 + typescript: 4.9.5 + yargs-parser: 20.2.9 + + /ts-node/10.9.0_tei2piaewgwz3rqboli3bdgchy: + resolution: {integrity: sha512-bunW18GUyaCSYRev4DPf4SQpom3pWH29wKl0sDk5zE7ze19RImEVhCW7K4v3hHKkUyfWotU08ToE2RS+Y49aug==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.12.12 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib/2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils/3.21.0_typescript@4.9.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: false + + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tunnel/0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: true + optional: true + + /tweetnacl/0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + /type-fest/0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + optional: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + /type/2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + + /typed-array-buffer/1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + /typed-array-byte-length/1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-byte-offset/1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + /typed-array-length/1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + /typedarray/0.0.7: + resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} + dev: false + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + /uc.micro/1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: false + + /ufo/1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unc-path-regex/0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + dev: false + + /undertaker-registry/1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} + engines: {node: '>= 0.10'} + dev: false + + /undertaker/1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + dependencies: + arr-flatten: 1.1.0 + arr-map: 2.0.2 + bach: 1.2.0 + collection-map: 1.0.0 + es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 + last-run: 1.1.1 + object.defaults: 1.1.0 + object.reduce: 1.0.1 + undertaker-registry: 1.0.1 + dev: false + + /undici-types/5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false + + /unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false + + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + /unique-stream/2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + dev: false + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + /universalify/2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /unset-value/1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false + + /update-browserslist-db/1.0.16_browserslist@4.23.0: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /urix/0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + /url-parse-lax/3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + dependencies: + prepend-http: 2.0.0 + dev: true + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + /use-callback-ref/1.3.2_2eeaxkqdcvbrwk75oeh4jz4him: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.2 + react: 18.3.1 + tslib: 2.6.2 + dev: false + + /use-sidecar/1.1.2_2eeaxkqdcvbrwk75oeh4jz4him: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.2 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.2 + dev: false + + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util.promisify/1.1.2: + resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + for-each: 0.3.3 + has-proto: 1.0.3 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.8 + safe-array-concat: 1.1.2 + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + optional: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache/2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + /v8-to-istanbul/7.1.2: + resolution: {integrity: sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==} + engines: {node: '>=10.10.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.4 + + /v8flags/3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + /value-or-function/3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + dev: false + + /verror/1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vinyl-fs/3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.11 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.5 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + dev: false + + /vinyl-sourcemap/1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.11 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + dev: false + + /vinyl/2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: false + + /vite-node/0.30.1_ljqiwlgqg3eth5elf7amwtqemy: + resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.7.0 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 3.2.6_ljqiwlgqg3eth5elf7amwtqemy + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite/3.2.6: + resolution: {integrity: sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.18 + postcss: 8.4.21 + resolve: 1.22.8 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite/3.2.6_ljqiwlgqg3eth5elf7amwtqemy: + resolution: {integrity: sha512-nTXTxYVvaQNLoW5BQ8PNNQ3lPia57gzsQU/Khv+JvzKPku8kNZL6NMUR/qwXhMG6E+g1idqEPanomJ+VZgixEg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.12.12 + esbuild: 0.15.18 + less: 4.1.3 + postcss: 8.4.21 + resolve: 1.22.8 + rollup: 2.79.1 + terser: 5.17.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest/0.30.1_less@4.1.3+terser@5.17.1: + resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.16 + '@types/chai-subset': 1.3.5 + '@types/node': 20.12.12 + '@vitest/expect': 0.30.1 + '@vitest/runner': 0.30.1 + '@vitest/snapshot': 0.30.1 + '@vitest/spy': 0.30.1 + '@vitest/utils': 0.30.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + source-map: 0.6.1 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.8.0 + tinypool: 0.4.0 + vite: 3.2.6_ljqiwlgqg3eth5elf7amwtqemy + vite-node: 0.30.1_ljqiwlgqg3eth5elf7amwtqemy + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + + /w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + + /well-known-symbols/2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + + /whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /whatwg-url/6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-module/1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + dev: false + + /which-module/2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + /which-typed-array/1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /why-is-node-running/2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + + /word-wrap/1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + /wrap-ansi/2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: false + + /wrap-ansi/5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + dev: true + + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic/2.4.1: + resolution: {integrity: sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + /ws/5.2.3: + resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} + dependencies: + async-limiter: 1.0.1 + dev: true + + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n/3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: false + + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser/13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs-parser/5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + dependencies: + camelcase: 3.0.0 + object.assign: 4.1.5 + dev: false + + /yargs/13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + dev: true + + /yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + /yargs/17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yargs/7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + 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.2 + yargs-parser: 5.0.1 + dev: false + + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json new file mode 100644 index 0000000..0e7b144 --- /dev/null +++ b/common/config/rush/repo-state.json @@ -0,0 +1,4 @@ +// DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. +{ + "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" +} diff --git a/common/config/rush/rush-plugins.json b/common/config/rush/rush-plugins.json new file mode 100644 index 0000000..752e373 --- /dev/null +++ b/common/config/rush/rush-plugins.json @@ -0,0 +1,29 @@ +/** + * This configuration file manages Rush's plugin feature. + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush-plugins.schema.json", + "plugins": [ + /** + * Each item configures a plugin to be loaded by Rush. + */ + // { + // /** + // * The name of the NPM package that provides the plugin. + // */ + // "packageName": "@scope/my-rush-plugin", + // /** + // * The name of the plugin. This can be found in the "pluginName" + // * field of the "rush-plugin-manifest.json" file in the NPM package folder. + // */ + // "pluginName": "my-plugin-name", + // /** + // * The name of a Rush autoinstaller that will be used for installation, which + // * can be created using "rush init-autoinstaller". Add the plugin's NPM package + // * to the package.json "dependencies" of your autoinstaller, then run + // * "rush update-autoinstaller". + // */ + // "autoinstallerName": "rush-plugins" + // } + ] +} \ No newline at end of file diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json new file mode 100644 index 0000000..9805017 --- /dev/null +++ b/common/config/rush/version-policies.json @@ -0,0 +1 @@ +[{"definitionName":"lockStepVersion","policyName":"vstoryMain","version":"0.0.1","nextBump":"patch"}] diff --git a/common/git-hooks/commit-msg b/common/git-hooks/commit-msg new file mode 100644 index 0000000..d1d363b --- /dev/null +++ b/common/git-hooks/commit-msg @@ -0,0 +1,3 @@ +#!/bin/sh + +node common/scripts/install-run-rush.js commitlint || exit $? #++ \ No newline at end of file diff --git a/common/git-hooks/pre-commit b/common/git-hooks/pre-commit new file mode 100644 index 0000000..96eae4e --- /dev/null +++ b/common/git-hooks/pre-commit @@ -0,0 +1,37 @@ +#!/bin/sh + +# log rush change to stdout +STAGE_FILES=$(git diff --cached --name-only) + +if [[ $STAGE_FILES != "" ]] ; then + changedFiles='' + # 红色文本的 ANSI 转义序列 + RED='\033[0;31m' + # 大字体的 ANSI 转义序列 + BIG_FONT='\033[1m' + + # 重置颜色的 ANSI 转义序列 + RESET='\033[0m' + + for fileName in $STAGE_FILES;do + if [[ $fileName =~ ^packages/.*\/src/.* ]]; then + changedFiles="${changedFiles} + ${RED}${fileName}${RESET}" + fi + done; + + if [[ $changedFiles != "" ]] ; then + + echo " + [Notice]: please check, do you need to run ${RED}${BIG_FONT}rush change${RESET} to generate changelog, + you has modified some src files, include: + ${changedFiles} + " + fi +fi + +node common/scripts/install-run-rush.js lint-staged || exit $? #++ + +if [ -f "common/scripts/pre-commit" ]; then + common/scripts/pre-commit +fi diff --git a/common/git-hooks/pre-push b/common/git-hooks/pre-push new file mode 100644 index 0000000..286d8ec --- /dev/null +++ b/common/git-hooks/pre-push @@ -0,0 +1,3 @@ +#!/bin/sh + +node common/scripts/install-run-rush.js test --only tag:package diff --git a/common/scripts/apply-prerelease-version.js b/common/scripts/apply-prerelease-version.js new file mode 100644 index 0000000..3ccfdb5 --- /dev/null +++ b/common/scripts/apply-prerelease-version.js @@ -0,0 +1,18 @@ +const writePrereleaseVersion = require('./set-prerelease-version'); +const checkAndUpdateNextBump = require('./version-policies'); +const parseVersion = require('./parse-version'); + + +function run() { + const preReleaseName = process.argv.slice(2)[0]; + const nextVersionOrNextBump = process.argv.slice(2)[1]; + const nextBump = checkAndUpdateNextBump(nextVersionOrNextBump); + const parsedNextVersion = nextVersionOrNextBump ? parseVersion(nextVersionOrNextBump) : null; + const nextVersion = parsedNextVersion ? `${parsedNextVersion.major}.${parsedNextVersion.minor}.${parsedNextVersion.patch}`: null; + + console.log('[apply prerelease version]: ', preReleaseName, nextBump, nextVersion); + + writePrereleaseVersion(nextBump, preReleaseName, nextVersion); +} + +run() \ No newline at end of file diff --git a/common/scripts/get-package-json.js b/common/scripts/get-package-json.js new file mode 100644 index 0000000..a3afad3 --- /dev/null +++ b/common/scripts/get-package-json.js @@ -0,0 +1,8 @@ +const fs = require('fs') + +function getPackageJson(pkgJsonPath) { + const pkgJson = fs.readFileSync(pkgJsonPath, { encoding: 'utf-8' }) + return JSON.parse(pkgJson); +} + +module.exports = getPackageJson; \ No newline at end of file diff --git a/common/scripts/install-run-rush-pnpm.js b/common/scripts/install-run-rush-pnpm.js new file mode 100644 index 0000000..5c14995 --- /dev/null +++ b/common/scripts/install-run-rush-pnpm.js @@ -0,0 +1,28 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rush-pnpm command. +// +// An example usage would be: +// +// node common/scripts/install-run-rush-pnpm.js pnpm-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*****************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush-pnpm.js ***! + \*****************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rush-pnpm.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush-pnpm.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js new file mode 100644 index 0000000..cada1ed --- /dev/null +++ b/common/scripts/install-run-rush.js @@ -0,0 +1,214 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run-rush.js install +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 657147: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }), + +/***/ 371017: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rush.js ***! + \************************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. + + +const { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run'); +const PACKAGE_NAME = '@microsoft/rush'; +const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; +const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; +function _getRushVersion(logger) { + const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; + if (rushPreviewVersion !== undefined) { + logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); + return rushPreviewVersion; + } + const rushJsonFolder = findRushJsonFolder(); + const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME); + try { + const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8'); + // Use a regular expression to parse out the rushVersion value because rush.json supports comments, + // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. + const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); + return rushJsonMatches[1]; + } + catch (e) { + throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + + "The 'rushVersion' field is either not assigned in rush.json or was specified " + + 'using an unexpected syntax.'); + } +} +function _getBin(scriptName) { + switch (scriptName.toLowerCase()) { + case 'install-run-rush-pnpm.js': + return 'rush-pnpm'; + case 'install-run-rushx.js': + return 'rushx'; + default: + return 'rush'; + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; + // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the + // appropriate binary inside the rush package to run + const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath); + const bin = _getBin(scriptName); + if (!nodePath || !scriptPath) { + throw new Error('Unexpected exception: could not detect node path or script path'); + } + let commandFound = false; + let logger = { info: console.log, error: console.error }; + for (const arg of packageBinArgs) { + if (arg === '-q' || arg === '--quiet') { + // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress + // any normal informational/diagnostic information printed during startup. + // + // To maintain the same user experience, the install-run* scripts pass along this + // flag but also use it to suppress any diagnostic information normally printed + // to stdout. + logger = { + info: () => { }, + error: console.error + }; + } + else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') { + // We either found something that looks like a command (i.e. - doesn't start with a "-"), + // or we found the -h/--help flag, which can be run without a command + commandFound = true; + } + } + if (!commandFound) { + console.log(`Usage: ${scriptName} [args...]`); + if (scriptName === 'install-run-rush-pnpm.js') { + console.log(`Example: ${scriptName} pnpm-command`); + } + else if (scriptName === 'install-run-rush.js') { + console.log(`Example: ${scriptName} build --to myproject`); + } + else { + console.log(`Example: ${scriptName} custom-command`); + } + process.exit(1); + } + runWithErrorAndStatusCode(logger, () => { + const version = _getRushVersion(logger); + logger.info(`The rush.json configuration requests Rush version ${version}`); + const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; + if (lockFilePath) { + logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); + } + return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); + }); +} +_run(); +//# sourceMappingURL=install-run-rush.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rushx.js b/common/scripts/install-run-rushx.js new file mode 100644 index 0000000..b05df26 --- /dev/null +++ b/common/scripts/install-run-rushx.js @@ -0,0 +1,28 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where the Rush command may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush +// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the +// rushx command. +// +// An example usage would be: +// +// node common/scripts/install-run-rushx.js custom-command +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; +/*!*************************************************!*\ + !*** ./lib-esnext/scripts/install-run-rushx.js ***! + \*************************************************/ + +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. +require('./install-run-rush'); +//# sourceMappingURL=install-run-rushx.js.map +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js new file mode 100644 index 0000000..68b1b56 --- /dev/null +++ b/common/scripts/install-run.js @@ -0,0 +1,645 @@ +// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. +// +// This script is intended for usage in an automated build environment where a Node tool may not have +// been preinstalled, or may have an unpredictable version. This script will automatically install the specified +// version of the specified tool (if not already installed), and then pass a command-line to it. +// An example usage would be: +// +// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io +// +// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ + +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 679877: +/*!************************************************!*\ + !*** ./lib-esnext/utilities/npmrcUtilities.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "syncNpmrc": () => (/* binding */ syncNpmrc) +/* harmony export */ }); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. +// IMPORTANT - do not use any non-built-in libraries in this file + + +/** + * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims + * unusable lines from the .npmrc file. + * + * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in + * the .npmrc file to provide different authentication tokens for different registry. + * However, if the environment variable is undefined, it expands to an empty string, which + * produces a valid-looking mapping with an invalid URL that causes an error. Instead, + * we'd prefer to skip that line and continue looking in other places such as the user's + * home directory. + * + * @returns + * The text of the the .npmrc. + */ +function _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath) { + logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose + logger.info(` --> "${targetNpmrcPath}"`); + let npmrcFileLines = fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\n'); + npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); + const resultLines = []; + // This finds environment variable tokens that look like "${VAR_NAME}" + const expansionRegExp = /\$\{([^\}]+)\}/g; + // Comment lines start with "#" or ";" + const commentRegExp = /^\s*[#;]/; + // Trim out lines that reference environment variables that aren't defined + for (const line of npmrcFileLines) { + let lineShouldBeTrimmed = false; + // Ignore comment lines + if (!commentRegExp.test(line)) { + const environmentVariables = line.match(expansionRegExp); + if (environmentVariables) { + for (const token of environmentVariables) { + // Remove the leading "${" and the trailing "}" from the token + const environmentVariableName = token.substring(2, token.length - 1); + // Is the environment variable defined? + if (!process.env[environmentVariableName]) { + // No, so trim this line + lineShouldBeTrimmed = true; + break; + } + } + } + } + if (lineShouldBeTrimmed) { + // Example output: + // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" + resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); + } + else { + resultLines.push(line); + } + } + const combinedNpmrc = resultLines.join('\n'); + fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc); + return combinedNpmrc; +} +/** + * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. + * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. + * + * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() + * + * @returns + * The text of the the synced .npmrc, if one exists. If one does not exist, then undefined is returned. + */ +function syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = { + info: console.log, + error: console.error +}) { + const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); + const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc'); + try { + if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { + return _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath); + } + else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) { + // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target + logger.info(`Deleting ${targetNpmrcPath}`); // Verbose + fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath); + } + } + catch (e) { + throw new Error(`Error syncing .npmrc file: ${e}`); + } +} +//# sourceMappingURL=npmrcUtilities.js.map + +/***/ }), + +/***/ 532081: +/*!********************************!*\ + !*** external "child_process" ***! + \********************************/ +/***/ ((module) => { + +module.exports = require("child_process"); + +/***/ }), + +/***/ 657147: +/*!*********************!*\ + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("fs"); + +/***/ }), + +/***/ 822037: +/*!*********************!*\ + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +module.exports = require("os"); + +/***/ }), + +/***/ 371017: +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!*******************************************!*\ + !*** ./lib-esnext/scripts/install-run.js ***! + \*******************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RUSH_JSON_FILENAME": () => (/* binding */ RUSH_JSON_FILENAME), +/* harmony export */ "findRushJsonFolder": () => (/* binding */ findRushJsonFolder), +/* harmony export */ "getNpmPath": () => (/* binding */ getNpmPath), +/* harmony export */ "installAndRun": () => (/* binding */ installAndRun), +/* harmony export */ "runWithErrorAndStatusCode": () => (/* binding */ runWithErrorAndStatusCode) +/* harmony export */ }); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 532081); +/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 822037); +/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 371017); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 679877); +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See the @microsoft/rush package's LICENSE file for license information. + + + + + +const RUSH_JSON_FILENAME = 'rush.json'; +const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; +const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; +const INSTALLED_FLAG_FILENAME = 'installed.flag'; +const NODE_MODULES_FOLDER_NAME = 'node_modules'; +const PACKAGE_JSON_FILENAME = 'package.json'; +/** + * Parse a package specifier (in the form of name\@version) into name and version parts. + */ +function _parsePackageSpecifier(rawPackageSpecifier) { + rawPackageSpecifier = (rawPackageSpecifier || '').trim(); + const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); + let name; + let version = undefined; + if (separatorIndex === 0) { + // The specifier starts with a scope and doesn't have a version specified + name = rawPackageSpecifier; + } + else if (separatorIndex === -1) { + // The specifier doesn't have a version + name = rawPackageSpecifier; + } + else { + name = rawPackageSpecifier.substring(0, separatorIndex); + version = rawPackageSpecifier.substring(separatorIndex + 1); + } + if (!name) { + throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); + } + return { name, version }; +} +let _npmPath = undefined; +/** + * Get the absolute path to the npm executable + */ +function getNpmPath() { + if (!_npmPath) { + try { + if (os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32') { + // We're on Windows + const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString(); + const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line); + // take the last result, we are looking for a .cmd command + // see https://github.com/microsoft/rushstack/issues/759 + _npmPath = lines[lines.length - 1]; + } + else { + // We aren't on Windows - assume we're on *NIX or Darwin + _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString(); + } + } + catch (e) { + throw new Error(`Unable to determine the path to the NPM tool: ${e}`); + } + _npmPath = _npmPath.trim(); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) { + throw new Error('The NPM executable does not exist'); + } + } + return _npmPath; +} +function _ensureFolder(folderPath) { + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) { + const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath); + _ensureFolder(parentDir); + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath); + } +} +/** + * Create missing directories under the specified base directory, and return the resolved directory. + * + * Does not support "." or ".." path segments. + * Assumes the baseFolder exists. + */ +function _ensureAndJoinPath(baseFolder, ...pathSegments) { + let joinedPath = baseFolder; + try { + for (let pathSegment of pathSegments) { + pathSegment = pathSegment.replace(/[\\\/]/g, '+'); + joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) { + fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath); + } + } + } + catch (e) { + throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`); + } + return joinedPath; +} +function _getRushTempFolder(rushCommonFolder) { + const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; + if (rushTempFolder !== undefined) { + _ensureFolder(rushTempFolder); + return rushTempFolder; + } + else { + return _ensureAndJoinPath(rushCommonFolder, 'temp'); + } +} +/** + * Resolve a package specifier to a static version + */ +function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) { + if (!version) { + version = '*'; // If no version is specified, use the latest version + } + if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { + // If the version contains only characters that we recognize to be used in static version specifiers, + // pass the version through + return version; + } + else { + // version resolves to + try { + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, rushTempFolder, undefined, logger); + const npmPath = getNpmPath(); + // This returns something that looks like: + // @microsoft/rush@3.0.0 '3.0.0' + // @microsoft/rush@3.0.1 '3.0.1' + // ... + // @microsoft/rush@3.0.20 '3.0.20' + // + const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], { + cwd: rushTempFolder, + stdio: [] + }); + if (npmVersionSpawnResult.status !== 0) { + throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); + } + const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); + const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line); + const latestVersion = versionLines[versionLines.length - 1]; + if (!latestVersion) { + throw new Error('No versions found for the specified version range.'); + } + const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/); + if (!versionMatches) { + throw new Error(`Invalid npm output ${latestVersion}`); + } + return versionMatches[1]; + } + catch (e) { + throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); + } + } +} +let _rushJsonFolder; +/** + * Find the absolute path to the folder containing rush.json + */ +function findRushJsonFolder() { + if (!_rushJsonFolder) { + let basePath = __dirname; + let tempPath = __dirname; + do { + const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) { + _rushJsonFolder = basePath; + break; + } + else { + basePath = tempPath; + } + } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root + if (!_rushJsonFolder) { + throw new Error('Unable to find rush.json.'); + } + } + return _rushJsonFolder; +} +/** + * Detects if the package in the specified directory is installed + */ +function _isPackageAlreadyInstalled(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) { + return false; + } + const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString(); + return fileContents.trim() === process.version; + } + catch (e) { + return false; + } +} +/** + * Delete a file. Fail silently if it does not exist. + */ +function _deleteFile(file) { + try { + fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file); + } + catch (err) { + if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { + throw err; + } + } +} +/** + * Removes the following files and directories under the specified folder path: + * - installed.flag + * - + * - node_modules + */ +function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { + try { + const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); + _deleteFile(flagFile); + const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json'); + if (lockFilePath) { + fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile); + } + else { + // Not running `npm ci`, so need to cleanup + _deleteFile(packageLockFile); + const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); + if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) { + const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); + fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + } + } + } + catch (e) { + throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); + } +} +function _createPackageJson(packageInstallFolder, name, version) { + try { + const packageJsonContents = { + name: 'ci-rush', + version: '0.0.0', + dependencies: { + [name]: version + }, + description: "DON'T WARN", + repository: "DON'T WARN", + license: 'MIT' + }; + const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); + } + catch (e) { + throw new Error(`Unable to create package.json: ${e}`); + } +} +/** + * Run "npm install" in the package install folder. + */ +function _installPackage(logger, packageInstallFolder, name, version, command) { + try { + logger.info(`Installing ${name}...`); + const npmPath = getNpmPath(); + const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, [command], { + stdio: 'inherit', + cwd: packageInstallFolder, + env: process.env + }); + if (result.status !== 0) { + throw new Error(`"npm ${command}" encountered an error`); + } + logger.info(`Successfully installed ${name}@${version}`); + } + catch (e) { + throw new Error(`Unable to install package: ${e}`); + } +} +/** + * Get the ".bin" path for the package. + */ +function _getBinPath(packageInstallFolder, binName) { + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + const resolvedBinName = os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32' ? `${binName}.cmd` : binName; + return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName); +} +/** + * Write a flag file to the package's install directory, signifying that the install was successful. + */ +function _writeFlagFile(packageInstallFolder) { + try { + const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); + fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version); + } + catch (e) { + throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); + } +} +function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common'); + const rushTempFolder = _getRushTempFolder(rushCommonFolder); + const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); + if (!_isPackageAlreadyInstalled(packageInstallFolder)) { + // The package isn't already installed + _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); + const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); + (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, packageInstallFolder, undefined, logger); + _createPackageJson(packageInstallFolder, packageName, packageVersion); + const command = lockFilePath ? 'ci' : 'install'; + _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); + _writeFlagFile(packageInstallFolder); + } + const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; + const statusMessageLine = new Array(statusMessage.length + 1).join('-'); + logger.info('\n' + statusMessage + '\n' + statusMessageLine + '\n'); + const binPath = _getBinPath(packageInstallFolder, packageBinName); + const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); + // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to + // assign via the process.env proxy to ensure that we append to the right PATH key. + const originalEnvPath = process.env.PATH || ''; + let result; + try { + // Node.js on Windows can not spawn a file when the path has a space on it + // unless the path gets wrapped in a cmd friendly way and shell mode is used + const shouldUseShell = binPath.includes(' ') && os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32'; + const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; + process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter); + result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, { + stdio: 'inherit', + windowsVerbatimArguments: false, + shell: shouldUseShell, + cwd: process.cwd(), + env: process.env + }); + } + finally { + process.env.PATH = originalEnvPath; + } + if (result.status !== null) { + return result.status; + } + else { + throw result.error || new Error('An unknown error occurred.'); + } +} +function runWithErrorAndStatusCode(logger, fn) { + process.exitCode = 1; + try { + const exitCode = fn(); + process.exitCode = exitCode; + } + catch (e) { + logger.error('\n\n' + e.toString() + '\n\n'); + } +} +function _run() { + const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; + if (!nodePath) { + throw new Error('Unexpected exception: could not detect node path'); + } + if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') { + // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control + // to the script that (presumably) imported this file + return; + } + if (process.argv.length < 4) { + console.log('Usage: install-run.js @ [args...]'); + console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); + process.exit(1); + } + const logger = { info: console.log, error: console.error }; + runWithErrorAndStatusCode(logger, () => { + const rushJsonFolder = findRushJsonFolder(); + const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); + const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); + const name = packageSpecifier.name; + const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier); + if (packageSpecifier.version !== version) { + console.log(`Resolved to ${name}@${version}`); + } + return installAndRun(logger, name, version, packageBinName, packageBinArgs); + }); +} +_run(); +//# sourceMappingURL=install-run.js.map +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/common/scripts/parse-version.js b/common/scripts/parse-version.js new file mode 100644 index 0000000..dba6f8b --- /dev/null +++ b/common/scripts/parse-version.js @@ -0,0 +1,20 @@ +// see more about the regex here: https://semver.org/lang/zh-CN/ +// reg test: https://regex101.com/r/vkijKf/1/ + +function parseVersion(version) { + const res = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/gm.exec(version); + + if (res) { + return { + major: +res[1], + minor: +res[2], + patch: +res[3], + preReleaseName: res[4], + preReleaseType: res[4] && res[4].includes('.') ? res[4].split('.')[0] : res[4] + }; + } + + return null; +} + +module.exports = parseVersion \ No newline at end of file diff --git a/common/scripts/pre-release.js b/common/scripts/pre-release.js new file mode 100644 index 0000000..ac6656d --- /dev/null +++ b/common/scripts/pre-release.js @@ -0,0 +1,97 @@ +/** + * prelease + * node release.js [alpha.0] [patch | major | minor | 1.0.0] + */ + +const { spawnSync } = require('child_process') +const path = require('path') +const checkAndUpdateNextBump = require('./version-policies'); +const getPackageJson = require('./get-package-json'); +const writePrereleaseVersion = require('./set-prerelease-version'); + + +const semverRegex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(alpha|beta|rc)(?:\.(?:(0|[1-9])))*)$/; + +const preReleaseNameReg = /^((alpha|beta|rc)(?:\.(?:0|[1-9]))*)$/; + + +function run() { + let preReleaseName = process.argv.slice(2)[0]; + let preReleaseType = ''; + const rushJson = getPackageJson(path.join(__dirname, '../../rush.json')) + const package = rushJson.projects.find((project) => project.packageName === '@visactor/vstory'); + let regRes = null; + + + if (typeof preReleaseName === 'string' && preReleaseName && (regRes = preReleaseNameReg.exec(preReleaseName))) { + preReleaseType = regRes[2]; + } else if (!preReleaseName) { + if (package) { + const pkgJsonPath = path.join(__dirname, '../../', package.projectFolder, 'package.json') + const pkgJson = getPackageJson(pkgJsonPath) + const currentVersion = pkgJson.version; + + if ((regRes = semverRegex.exec(currentVersion))) { + preReleaseType = regRes[4]; + + if (regRes[5]) { + preReleaseName = `${preReleaseType}.${parseInt(regRes[5], 10) + 1}`; + } else { + preReleaseName = `${preReleaseType}.0`; + } + + console.log(`\x1b[31m[warning]\x1b[0m no prerelease-name supply, auto calculate prerelease-name \x1b[31m${preReleaseName}\x1b[0m`); + } else { + preReleaseName = `alpha.0`; + preReleaseType = 'alpha'; + + console.log('\x1b[31m[warning]\x1b[0m no prerelease-name supply, default to \x1b[31m alpha.0\x1b[0m') + } + } + } else { + console.log(`\x1b[31m[error]\x1b[0m preReleaseName: \x1b[31m ${preReleaseName} \x1b[0m 不符合规范,只允许 alpha.0 , beta.1, rc.3 类似的格式 `) + } + + if (preReleaseName && preReleaseType) { + // 1. apply version and update version of package.json + writePrereleaseVersion(checkAndUpdateNextBump(process.argv.slice(2)[1]), preReleaseName) + + // 2. build all the packages + spawnSync('sh', ['-c', `rush build --only tag:package`], { + stdio: 'inherit', + shell: false, + }); + + // 3. publish to npm + spawnSync('sh', ['-c', `rush publish --publish --include-all --tag ${preReleaseType}`], { + stdio: 'inherit', + shell: false, + }); + + // 4. update version of local packages to shrinkwrap + spawnSync('sh', ['-c', `rush update`], { + stdio: 'inherit', + shell: false, + }); + + if (package) { + const pkgJsonPath = path.join(__dirname, '../../', package.projectFolder, 'package.json'); + const pkgJson = getPackageJson(pkgJsonPath) + + // 5. add the the changes + spawnSync('sh', ['-c', `git add --all`], { + stdio: 'inherit', + shell: false, + }); + + // 6. commit all the changes + spawnSync('sh', ['-c', `git commit -m "build: prerelease version ${pkgJson.version}"`], { + stdio: 'inherit', + shell: false, + }); + } + } +} + +run() + diff --git a/common/scripts/release.js b/common/scripts/release.js new file mode 100644 index 0000000..425b036 --- /dev/null +++ b/common/scripts/release.js @@ -0,0 +1,82 @@ +/** + * prelease + * node release.js [alpha.0] [patch | major | minor | 1.0.0] + */ + +const { spawnSync } = require('child_process') +const fs = require('fs') +const path = require('path') +const checkAndUpdateNextBump = require('./version-policies'); + +function getPackageJson(pkgJsonPath) { + const pkgJson = fs.readFileSync(pkgJsonPath, { encoding: 'utf-8' }) + return JSON.parse(pkgJson) +} + + +function run() { + let releaseVersion = process.argv.slice(2)[0]; + const cwd = process.cwd(); + // 0. update `nextBump` + checkAndUpdateNextBump(releaseVersion); + + // 1. update version of package.json, this operation will remove the common/changes + spawnSync('sh', ['-c', `rush version --bump`], { + stdio: 'inherit', + shell: false, + }); + + + // 2. build all the packages + spawnSync('sh', ['-c', `rush build --only tag:package`], { + stdio: 'inherit', + shell: false, + }); + + // 3. publish to npm + spawnSync('sh', ['-c', 'rush publish --publish --include-all'], { + stdio: 'inherit', + shell: false, + }); + + // 4. update version of local packages to shrinkwrap + spawnSync('sh', ['-c', `rush update`], { + stdio: 'inherit', + shell: false, + }); + + const rushJson = getPackageJson(path.join(__dirname, '../../rush.json')); + const package = rushJson.projects.find((project) => project.name === '@visactor/vstory'); + + if (package) { + const pkgJsonPath = path.join(__dirname, '../../', project.projectFolder, 'package.json') + const pkgJson = getPackageJson(pkgJsonPath) + + // 5. add tag + spawnSync('sh', ['-c', `git tag v${pkgJson.versopn}`], { + stdio: 'inherit', + shell: false, + }); + + // 6. add all the changes + spawnSync('sh', ['-c', `git add --all`], { + stdio: 'inherit', + shell: false, + }); + + // 7. commit all the changes + spawnSync('sh', ['-c', `git commit -m "build: publish version ${pkgJson.version}"`], { + stdio: 'inherit', + shell: false, + }); + + // 8. push tag to origin + spawnSync('sh', ['-c', `git push origin v${pkgJson.version}`], { + stdio: 'inherit', + shell: false, + }); + } +} + +run() + diff --git a/common/scripts/set-json-file.js b/common/scripts/set-json-file.js new file mode 100644 index 0000000..40f0f01 --- /dev/null +++ b/common/scripts/set-json-file.js @@ -0,0 +1,30 @@ +function setJsonFileByKey(file, json, keys, newValue) { + const prevValue = keys.reduce((res, k) => { + return res[k]; + }, json); + + if (prevValue !== newValue) { + let startIndex = 0; + + keys.forEach(k => { + const keyStr = `"${k}"`; + const index = file.indexOf(keyStr, startIndex); + + if (index >= 0) { + startIndex = index + keyStr.length + 1; + } + }) + + const leftIndex = file.indexOf('"', startIndex); + const rightIndex = leftIndex >= 0 ? file.indexOf('"', leftIndex +1) : -1; + + if (leftIndex >= 0 && rightIndex >= 0) { + return `${file.slice(0, leftIndex)}"${newValue}"${file.slice(rightIndex + 1)}` + } + } + + return file; +} + +module.exports = setJsonFileByKey; + diff --git a/common/scripts/set-prerelease-version.js b/common/scripts/set-prerelease-version.js new file mode 100644 index 0000000..cb1aeae --- /dev/null +++ b/common/scripts/set-prerelease-version.js @@ -0,0 +1,86 @@ +const fs = require('fs') +const path = require('path') +const getPackageJson = require('./get-package-json'); +const parseVersion = require('./parse-version'); +const setJsonFileByKey = require('./set-json-file'); + + +function writePrereleaseVersion(nextBump, preReleaseName, nextVersionStr) { + const rushJson = getPackageJson(path.join(__dirname, '../../rush.json')); + const projects = rushJson.projects; + const mainPackage = projects.find((project) => project.packageName === '@visactor/vstory'); + + if (!mainPackage) { + return; + } + + const mainPkgJsonPath = path.join(__dirname, '../../', mainPackage.projectFolder, 'package.json') + const mainPkgJson = getPackageJson(mainPkgJsonPath) + const mainVersion = mainPkgJson.version; + console.log(`The version of main project is ${mainVersion}`); + const curVersion = parseVersion(mainVersion); + console.log('parsed current version:', curVersion) + + if (!curVersion) { + return; + } + + if (!nextVersionStr && !curVersion.preReleaseName) { + if (nextBump === 'major') { + curVersion.major += 1; + curVersion.minor = 0; + curVersion.patch = 0; + } else if (nextBump === 'minor') { + curVersion.minor += 1; + curVersion.patch = 0; + } else { + curVersion.patch += 1; + } + } + + let nextVersion = nextVersionStr ? `${nextVersionStr}` : `${curVersion.major}.${curVersion.minor}.${curVersion.patch}`; + + if (preReleaseName) { + nextVersion = `${nextVersion}-${preReleaseName}`; + } + const published = projects.filter(project => project.shouldPublish).map(project => project.packageName); + console.log(`next version is: ${nextVersion}`); + + projects.forEach(project => { + const pkgJsonPath = path.join( __dirname, '../../', project.projectFolder, 'package.json') + let jsonFile = fs.readFileSync(pkgJsonPath, { encoding: 'utf-8' }) + const pkgJson = JSON.parse(jsonFile); + + if (project.shouldPublish) { + console.log(`handle project: ${project.packageName}, from ${pkgJson.version} to ${nextVersion}`); + } else { + console.log(`handle project: ${project.packageName}, update "dependencies" and "devDependencies" `); + } + + if (project.shouldPublish) { + jsonFile = setJsonFileByKey(jsonFile, pkgJson, ['version'], nextVersion); + } + + if (pkgJson.dependencies) { + Object.keys(pkgJson.dependencies).forEach(dep => { + if (published.includes(dep)) { + jsonFile = setJsonFileByKey(jsonFile, pkgJson, ['dependencies', dep], `workspace:${nextVersion}`); + } + }); + } + + if (pkgJson.devDependencies) { + Object.keys(pkgJson.devDependencies).forEach(dep => { + if (published.includes(dep)) { + jsonFile = setJsonFileByKey(jsonFile, pkgJson, ['devDependencies', dep], `workspace:${nextVersion}`); + } + }); + } + + fs.writeFileSync(pkgJsonPath, jsonFile) + }); + + +} + +module.exports = writePrereleaseVersion; diff --git a/common/scripts/sort_deps.js b/common/scripts/sort_deps.js new file mode 100644 index 0000000..861e26a --- /dev/null +++ b/common/scripts/sort_deps.js @@ -0,0 +1,116 @@ +/** + * sort `dependencies` `devDependencies` `peerDependencies` field in package.json + * + * NOTE: you should install prettier global `npm i -g prettier` + * + * usage: `node common/scripts/sort_deps.js [project_relative_path]` + */ +const fs = require('fs') +const path = require('path') +const { spawnSync } = require('child_process') + +function getPackageJson(pkgJsonPath) { + const pkgJson = fs.readFileSync(pkgJsonPath, { encoding: 'utf-8' }) + return JSON.parse(pkgJson) +} + +function updatePackageJson(pkgJsonPath, data) { + fs.writeFileSync(path.resolve(pkgJsonPath, 'package.json'), data, { encoding: 'utf-8' }) +} + +function isPlainObject(value) { + if (Object.prototype.toString.call(value) !== '[object Object]') { + return false + } + + const prototype = Object.getPrototypeOf(value) + return prototype === null || prototype === Object.prototype +} + +function sortObjectByKeyNameList(object, sortWith) { + let keys + let sortFn + + if (typeof sortWith === 'function') { + sortFn = sortWith + } else { + keys = sortWith + } + + const objectKeys = Object.keys(object) + return (keys || []).concat(objectKeys.sort(sortFn)).reduce(function(total, key) { + if (objectKeys.indexOf(key) !== -1) { + total[key] = object[key] + } + return total + }, Object.create(null)) +} + +const onObject + = (fn) => + (x, ...args) => + isPlainObject(x) ? fn(x, ...args) : x + +const sortObjectBy = (comparator, deep) => { + const over = onObject((object) => { + object = sortObjectByKeyNameList(object, comparator) + if (deep) { + for (const [key, value] of Object.entries(object)) { + object[key] = over(value) + } + } + return object + }) + + return over +} + +const sortObject = sortObjectBy() + +function sortDeps(data) { + if (data.dependencies) { + data.dependencies = sortObject(data.dependencies) + } + if (data.devDependencies) { + data.devDependencies = sortObject(data.devDependencies) + } + + if (data.peerDependencies) { + data.peerDependencies = sortObject(data.peerDependencies) + } +} + +function run() { + const targetDir = process.argv.slice(2)[0] + const cwd = process.cwd(); + + if (typeof targetDir === 'string') { + const pkgJsonPath = path.resolve(targetDir, 'package.json') + const pkgJson = getPackageJson(pkgJsonPath) + sortDeps(pkgJson) + updatePackageJson(targetDir, JSON.stringify(pkgJson)) + + spawnSync('sh', ['-c', `prettier -w ${pkgJsonPath}`], { + stdio: 'inherit', + shell: false, + }) + } else { + const rushJson = getPackageJson(`${cwd}/rush.json`) + + rushJson.projects.forEach((project) => { + const pkgJsonPath = path.resolve(project.projectFolder, 'package.json') + const pkgJson = getPackageJson(pkgJsonPath) + + sortDeps(pkgJson) + updatePackageJson(project.projectFolder, JSON.stringify(pkgJson)) + + spawnSync('sh', ['-c', `prettier -w ${pkgJsonPath}`], { + stdio: 'inherit', + shell: false, + }) + }); + } +} + +run() + diff --git a/common/scripts/version-policies.js b/common/scripts/version-policies.js new file mode 100644 index 0000000..9222955 --- /dev/null +++ b/common/scripts/version-policies.js @@ -0,0 +1,85 @@ + +const fs = require('fs') +const path = require('path') +const parseVersion = require('./parse-version'); +const PRERELEASE = 'prerelease'; +const MINOR = 'minor'; +const MAJOR = 'major'; +const PATCH = 'patch'; +const NEXT_BUMPMS = [PRERELEASE, PATCH, MINOR, MAJOR]; +const setJsonFileByKey = require('./set-json-file'); + + +const parseNextBumpFromVersion = ( + versionString +) => { + const res = parseVersion(versionString); + + if (res) { + if (res.patch === 0) { + return res.minor == 0 ? MAJOR : MINOR; + } + + return PATCH + } + + console.error(`can parse nextBump from version: ${versionString}`) + process.exit(1); +} + +const writeNextBump = ( + nextBump, +) => { + const filePath = path.join(__dirname, '../config/rush/version-policies.json'); + let fileContent = fs.readFileSync(filePath).toString() + const json = JSON.parse(fileContent); + const curNextBump = json[0].nextBump + + if (nextBump !== curNextBump) { + fileContent = setJsonFileByKey(fileContent, json, ['0', 'nextBump'], nextBump); + + fs.writeFileSync(path.join(__dirname, '../config/rush/version-policies.json'), fileContent) + } +} + +const readNextBumpFromChanges = () => { + const changeRoot = path.join(__dirname, '../changes/@visactor/vstory'); + const filenames = fs.readdirSync(changeRoot); + + if (filenames && filenames.length) { + const changeType = []; + + filenames.forEach(fileName => { + const json = JSON.parse(fs.readFileSync(path.join(changeRoot, fileName)).toString()); + + if (json.changes && json.changes.length) { + json.changes.forEach(change => { + if (change.type && !changeType.includes(change.type)) { + changeType.push(change.type); + } + }) + } + }); + + return changeType.includes(MAJOR) ? MAJOR : changeType.includes(MINOR) ? MINOR : PATCH; + } else { + process.exit(1); + } +} + +const checkAndUpdateNextBump = (version) => { + let nextBump = PATCH; + + if (version && NEXT_BUMPMS.includes(version)) { + nextBump = version; + } else if (version) { + nextBump = parseNextBumpFromVersion(version); + } else { + nextBump = readNextBumpFromChanges(); + } + writeNextBump(nextBump); + + return nextBump; +} + +module.exports = checkAndUpdateNextBump; diff --git a/docs/assets/api/en/api.md b/docs/assets/api/en/api.md new file mode 100644 index 0000000..1a264f1 --- /dev/null +++ b/docs/assets/api/en/api.md @@ -0,0 +1,14 @@ +{{ target: api }} + +{{import: graphic-arc}} +{{import: graphic-area}} +{{import: graphic-circle}} +{{import: graphic-group}} +{{import: graphic-image}} +{{import: graphic-line}} +{{import: graphic-path}} +{{import: graphic-polygon}} +{{import: graphic-rect}} +{{import: graphic-richtext}} +{{import: graphic-symbol}} +{{import: graphic-text}} diff --git a/docs/assets/api/en/common/attribute.md b/docs/assets/api/en/common/attribute.md new file mode 100644 index 0000000..8ba9aa3 --- /dev/null +++ b/docs/assets/api/en/common/attribute.md @@ -0,0 +1,221 @@ +{{ target: common-attribute }} + +#${prefix} x(number) = 0 + +图元 X 坐标位置 + +#${prefix} y(number) = 0 + +图元 Y 坐标位置 + +#${prefix} z(number) = 0 + +图元 Z 坐标位置(需要开启 3d) + +#${prefix} dx(number) = 0 + +图元 X 方向的偏移 + +#${prefix} dy(number) = 0 + +图元 Y 方向的偏移 + +#${prefix} dz(number) = 0 + +图元 Z 方向的偏移(需要开启 3d) + +#${prefix} scaleX(number) = 1 + +图元 X 方向的缩放 + +#${prefix} scaleY(number) = 1 + +图元 Y 方向的缩放 + +#${prefix} scaleZ(number) = 1 + +图元 Z 方向的缩放 + +#${prefix} angle(number) = 0 + +图元顺时针方向旋转弧度 + +#${prefix} anchor([number|string, number|string]) = [] + +图元旋转锚点 + +#${prefix} keepDirIn3d(boolean) = false + +是否在 3d 中控制方向,false: 不控制方向,true: 始终控制方向朝摄像机 + +#${prefix} opacity(number) = 1 + +图元透明度,会同时影响 fill 和 stroke,计算为`opacity * fillOpacity`和`opacity * strokeOpacity` + +#${prefix} fill(string|IColor|false) = false + +图元填充颜色,支持纯色字符串和渐变色字符串,设置 false 则不填充 + +#${prefix} fillOpacity(number) = 1 + +图元 fill 部分的透明度,同时收到 opacity 影响,计算为`opacity * fillOpacity` + +#${prefix} stroke(string|IColor|false) = false + +图元描边颜色,支持纯色字符串和渐变色字符串,设置 false 则不描边 + +#${prefix} strokeOpacity(number) = 1 + +图元 stroke 部分的透明度,同时收到 opacity 影响,计算为`opacity * strokeOpacity` + +#${prefix} lineWidth(number) = 1 + +图元描边的宽度,默认是 1 + +#${prefix} lineDash(number[]) = [] + +图元描边的虚线配置 + +#${prefix} lineDashOffset(number) = 0 + +图元描边的虚线偏移配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset + +#${prefix} lineCap("butt"|"round"|"square") = 'butt' + +图元描边的线帽配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap + +#${prefix} lineJoin("round"|"bevel"|"miter") = 'butt' + +图元描边的连接处配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin + +#${prefix} miterLimit(number) = 10 + +https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/miterLimit + +#${prefix} visible(boolean) = true + +元素是否可见 + +#${prefix} zIndex(number) = 0 + +元素在当前组中的排序 + +#${prefix} layout('flex'|'') = '' + +元素的布局,flex 仅在开启 flex 布局模式下生效 + +#${prefix} shadowColor(string|IColor|false) = false + +图元的阴影颜色 + +#${prefix} shadowOffsetX(number) = 0 + +图元的阴影在 X 方向上的偏移 + +#${prefix} shadowOffsetY(number) = 0 + +图元的阴影在 Y 方向上的偏移 + +#${prefix} shadowBlur(number) = 0 + +图元的阴影的模糊距离 + +#${prefix} background(string|HTMLImageElement| HTMLCanvasElement) = '' + +图元的背景图片 + +#${prefix} backgroundMode('repeat'|'repeat-x' | 'repeat-y' | 'no-repeat') = '' + +图元的背景图片填充模式 + +#${prefix} backgroundFit(boolean) = false + +图元的背景图片是否正好填充,只在 repeat-x 或者 repeat-y 以及 no-repeat 的时候生效 + +#${prefix} backgroundCornerRadius(number | number[]) = 0 + +目前只针对文字生效,配置背景的圆角 + +#${prefix} texture("circle" | "rect" | "diamond" | "vertical-line" | "horizontal-line" | "bias-lr" | "bias-rl" | "grid") = 0 + +纹理填充的样式 + +#${prefix} textureColor(string | false) = false + +纹理填充的颜色 + +#${prefix} textureSize(number) = 10 + +每一个纹理单元的大小 + +#${prefix} texturePadding(number) = 2 + +纹理单元的 padding + +#${prefix} cursor(Cursor) = 'default' + +鼠标的样式 + +#${prefix} renderStyle('default' | 'rough') = 'default' + +渲染风格,rough 配置 在启用 rough 风格时才会生效 + +#${prefix} html(Object|null) = null + +html 配置,在该图元位置展示配置的 html 元素 + +##${prefix} dom(string | HTMLElement) + +html 的具体 dom 字符串或者 dom 对象 + +##${prefix} container(string | HTMLElement) + +承载 html 内容的容器,默认是 Canvas 的容器 + +##${prefix} width(number) + +dom 的宽度 + +##${prefix} height(number) + +dom 的高度 + +##${prefix} style(string | Object) + +容器的样式 + +##${prefix} visible(boolean) + +html 是否可见 + +##${prefix} anchorType('position' | 'boundsLeftTop') + +html 的定位模式,基于 xy 位置定位,还是基于这个图元包围盒的左上角定位 + +#${prefix} pickable(boolean) = true + +是否支持事件拾取,默认为 true。 + +#${prefix} fillPickable(boolean) = true + +否支持 fill 部分的拾取,默认为 true。 + +#${prefix} strokePickable(boolean) = true + +否支持 stroke 部分的拾取,默认为 true。 + +#${prefix} childrenPickable(boolean) = true + +否支持子节点的拾取,默认为 true。 + +#${prefix} shadowRootIdx(number) = 1 + +shadowRoot 在宿主图元的上方还是下方,>0 为下方,<0 为上方 + +#${prefix} globalZIndex(number) = 0 + +全局的 zIndex,配置后会提取到交互层,在交互层中进行按顺序绘制 + +#${prefix} globalCompositeOperation(CanvasRenderingContext2D['globalCompositeOperation']) = '' + +对应 Canvas 的 globalCompositeOperation,用来配置滤镜 diff --git a/docs/assets/api/en/common/graphic.md b/docs/assets/api/en/common/graphic.md new file mode 100644 index 0000000..cc11b12 --- /dev/null +++ b/docs/assets/api/en/common/graphic.md @@ -0,0 +1,130 @@ +{{ target: common-graphic }} + +#${prefix} type(string) = ${gtype} + +图元类型 + +#${prefix} children(IGraphic[]) = [] + +孩子节点 + +#${prefix} shadowRoot(IShadowRoot) = [] + +影子节点 + +#${prefix} valid(boolean) = false + +该图元是否合法 + +#${prefix} parent(IGroup|null) = null + +该图元的父节点 + +#${prefix} isContainer(boolean) + +该图元是否是容器图元 + +#${prefix} AABBBounds(IAABBBounds) + +该图元的包围盒 + +#${prefix} globalAABBBounds(IAABBBounds) + +该图元的全局包围盒 + +#${prefix} transMatrix(IMatrix) + +该图元的变换矩阵 + +#${prefix} globalTransMatrix(IMatrix) + +该图元的全局变换矩阵 + +#${prefix} initAttributes()() + +初始化图元的属性,参数为: + +- params: Partial + +#${prefix} setAttributes()() + +设置图元的属性,参数为: + +- params: Partial +- forceUpdateTag?: boolean +- context?: ISetAttributeContext + +#${prefix} setAttribute()() + +设置图元的属性,参数为: + +- key: string +- value: any +- forceUpdateTag?: boolean +- context?: ISetAttributeContext + +#${prefix} attachShadow()() + +添加影子节点 + +#${prefix} detachShadow()() + +删除影子节点 + +#${prefix} toJson()() + +将该图元以及子图元导出成 json + +#${prefix} clone()() + +克隆该图元 + +#${prefix} translate()() + +基于当前位置偏移变换,参数为: + +- x: number +- y: number + +#${prefix} translateTo()() + +偏移到某点的变换,参数为: + +- x: number +- y: number + +#${prefix} scale()() + +基于当前的缩放变换,参数为: + +- scaleX: number +- scaleY: number +- scaleCenter?: IPointLike + +#${prefix} scaleTo()() + +缩放到某个大小的变换,参数为: + +- scaleX: number +- scaleY: number + +#${prefix} rotate()() + +旋转变换,参数为: + +- angle: number +- rotateCenter?: IPointLike + +#${prefix} rotateTo()() + +旋转到某个角度的变换,参数为: + +- angle: number + +#${prefix} animate()() + +添加动画 + +#${prefix} stateProxy()() + +状态配置函数 diff --git a/docs/assets/api/en/common/text.md b/docs/assets/api/en/common/text.md new file mode 100644 index 0000000..d28e2e8 --- /dev/null +++ b/docs/assets/api/en/common/text.md @@ -0,0 +1,38 @@ +{{ target: common-text }} + +#${prefix} text(string | number) = '' + +文字值 + +#${prefix} fontSize(number) = 16 + +字体大小 + +#${prefix} fontFamily(string) = PingFang SC,Microsoft Yahei,system-ui,-apple-system,segoe ui, +Roboto,Helvetica,Arial,sans-serif, apple color emoji,segoe ui emoji,segoe ui symbol + +字体 + +#${prefix} fill(IColor | boolean) = false + +文字填充色 + +#${prefix} stroke(IColor | boolean) = false + +文字描边色 + +#${prefix} fontWeight(string) = '' + +字宽 + +#${prefix} fontStyle("normal" | "italic" | "oblique") = 'normal' + +文字风格 + +#${prefix} underline(number) = 0 + +下划线线粗 + +#${prefix} lineThrough(number) = 0 + +中划线线粗 diff --git a/docs/assets/api/en/graphic/arc.md b/docs/assets/api/en/graphic/arc.md new file mode 100644 index 0000000..1cab7d2 --- /dev/null +++ b/docs/assets/api/en/graphic/arc.md @@ -0,0 +1,50 @@ +{{ target: graphic-arc }} + +# Arc + +弧形图元 + +## attribute(any) + +弧形图元属性 + +###${prefix} innerRadius(number) = 0 + +内半径 + +###${prefix} outerRadius(number) = 0 + +外半径 + +###${prefix} startAngle(number) = 0 + +起始弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} endAngle(number) = 0 + +终止弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} cornerRadius(number) = 0 + +用于指定扇形区块的内外圆角半径 + +###${prefix} padAngle(number) = 0 + +间隙角度;间隔角度会转换为一个在两个相邻的弧之间的确定的线性距离 + +###${prefix} cap(boolean) = false + +是否给扇区添加一个 cap + +###${prefix} forceShowCap(boolean) = false + +当 cap = true 并且 使用了渐变填充的时候,自动实现 conical 渐变,也就是环形的渐变 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='arc' +) }} diff --git a/docs/assets/api/en/graphic/area.md b/docs/assets/api/en/graphic/area.md new file mode 100644 index 0000000..6b48ee0 --- /dev/null +++ b/docs/assets/api/en/graphic/area.md @@ -0,0 +1,38 @@ +{{ target: graphic-area }} + +# Area + +面积图元 + +## attribute(any) + +面积图元属性 + +###${prefix} points(IPointLike[]) = [] + +面积图元的点 + +###${prefix} segments(IAreaSegment[]) = [] + +面积图元的分段 + +###${prefix} curveType("linear" | "basis"|"step"|"stepBefore"|"stepAfter"|"monotoneX"|"monotoneY") = 0 + +曲面类型 + +###${prefix} clipRange(number) = 1 + +裁切比例 + +###${prefix} closePath(boolean) = false + +是否要闭合首尾点 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='area' +) }} diff --git a/docs/assets/api/en/graphic/circle.md b/docs/assets/api/en/graphic/circle.md new file mode 100644 index 0000000..6338277 --- /dev/null +++ b/docs/assets/api/en/graphic/circle.md @@ -0,0 +1,30 @@ +{{ target: graphic-circle }} + +# Circle + +圆形图元 + +## attribute(any) + +圆形图元属性 + +###${prefix} radius(number) = 0 + +圆形半径 + +###${prefix} startAngle(number) = 0 + +起始弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} endAngle(number) = 0 + +结束弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='circle' +) }} diff --git a/docs/assets/api/en/graphic/group.md b/docs/assets/api/en/graphic/group.md new file mode 100644 index 0000000..7c7c316 --- /dev/null +++ b/docs/assets/api/en/graphic/group.md @@ -0,0 +1,62 @@ +{{ target: graphic-group }} + +# Group + +Group 图元 + +## attribute(any) + +Group 图元属性 + +###${prefix} width(number) = 0 + +宽度,用于 clip + +###${prefix} height(number) = 0 + +高度,用于 clip + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置。 + +###${prefix} clip(boolean) = 0 + +是否裁切 + +###${prefix} visibleAll(boolean) = true + +是否自身以及所有子图元都可见 + +###${prefix} display('relative' | 'flex') = 'relative' + +布局方式,相对布局还是 flex 布局(参考 css) + +###${prefix} flexDirection('row' | 'row-reverse' | 'column' | 'column-reverse') = 'row' + +参考 css flexDirection + +###${prefix} flexWrap('nowrap' | 'wrap') = 'wrap' + +参考 css flexWrap + +###${prefix} justifyContent('flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around') = 'flex-start' + +参考 css justifyContent + +###${prefix} alignItems('flex-start' | 'flex-end' | 'center') = 'flex-start' + +参考 css alignItems + +###${prefix} alignContent('flex-start' | 'center' | 'space-between' | 'space-around') = 'flex-start' + +参考 css alignContent + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='group' +) }} diff --git a/docs/assets/api/en/graphic/image.md b/docs/assets/api/en/graphic/image.md new file mode 100644 index 0000000..b3a1ae6 --- /dev/null +++ b/docs/assets/api/en/graphic/image.md @@ -0,0 +1,42 @@ +{{ target: graphic-image }} + +# Image + +Image 图元 + +## attribute(any) + +Image 图元属性 + +###${prefix} width(number) = 0 + +宽度,用于 clip + +###${prefix} height(number) = 0 + +高度,用于 clip + +###${prefix} repeatX("repeat" | "no-repeat") = 0 + +是否在 X 方向重复 + +###${prefix} repeatY("repeat" | "no-repeat") = 0 + +是否在 Y 方向重复 + +###${prefix} image(string | HTMLImageElement | HTMLCanvasElement) = '' + +图片 URL,svg 或者 image dom + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='image' +) }} diff --git a/docs/assets/api/en/graphic/line.md b/docs/assets/api/en/graphic/line.md new file mode 100644 index 0000000..98d9054 --- /dev/null +++ b/docs/assets/api/en/graphic/line.md @@ -0,0 +1,42 @@ +{{ target: graphic-line }} + +# Line + +line 图元 + +## attribute(any) + +line 图元属性 + +###${prefix} points(IPointLike[]) = [] + +线段图元的点 + +###${prefix} segments(IAreaSegment[]) = [] + +线段图元的分段 + +###${prefix} curveType("linear" | "basis"|"step"|"stepBefore"|"stepAfter"|"monotoneX"|"monotoneY") = 0 + +线段类型 + +###${prefix} clipRange(number) = 1 + +裁切比例 + +###${prefix} clipRangeByDimension("auto" | "default" | "x" | "y") = 'default' + +按照长度裁切还是按照 X 和 Y 方向的投影裁切 + +###${prefix} closePath(boolean) = false + +是否要闭合首尾点 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='line' +) }} diff --git a/docs/assets/api/en/graphic/path.md b/docs/assets/api/en/graphic/path.md new file mode 100644 index 0000000..d626603 --- /dev/null +++ b/docs/assets/api/en/graphic/path.md @@ -0,0 +1,22 @@ +{{ target: graphic-path }} + +# Path + +Path 图元 + +## attribute(any) + +Path 图元属性 + +###${prefix} path(ICustomPath2D | string) = '' + +SVG 的 path 字符串 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='path' +) }} diff --git a/docs/assets/api/en/graphic/polygon.md b/docs/assets/api/en/graphic/polygon.md new file mode 100644 index 0000000..4f946bc --- /dev/null +++ b/docs/assets/api/en/graphic/polygon.md @@ -0,0 +1,30 @@ +{{ target: graphic-polygon }} + +# Polygon + +Polygon 图元 + +## attribute(any) + +Polygon 图元属性 + +###${prefix} points(IPointLike[]) = '' + +polygon 的顶点属性 + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角属性 + +###${prefix} closePath(boolean) = false + +是否首尾顶点闭合 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='polygon' +) }} diff --git a/docs/assets/api/en/graphic/rect.md b/docs/assets/api/en/graphic/rect.md new file mode 100644 index 0000000..4a5a268 --- /dev/null +++ b/docs/assets/api/en/graphic/rect.md @@ -0,0 +1,30 @@ +{{ target: graphic-rect }} + +# Rect + +矩形图元 + +## attribute(any) + +矩形图元属性 + +###${prefix} width(number) = 0 + +图元宽度 + +###${prefix} height(number) = 0 + +图元高度 + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='rect' +) }} diff --git a/docs/assets/api/en/graphic/richtext.md b/docs/assets/api/en/graphic/richtext.md new file mode 100644 index 0000000..49f072f --- /dev/null +++ b/docs/assets/api/en/graphic/richtext.md @@ -0,0 +1,82 @@ +{{ target: graphic-richtext }} + +# RichText + +RichText 图元 + +## attribute(any) + +RichText 图元属性 + +###${prefix} width(number) = 0 + +宽度 + +###${prefix} height(number) = 0 + +高度 + +###${prefix} ellipsis(boolean | string) = true + +裁切时是否展示... + +###${prefix} wordBreak("break-word" | "break-all") = break-all + +富文本裁切的格式 + +###${prefix} verticalDirection("top" | "middle" | "bottom") = break-all + +富文本垂直方向的位置 + +###${prefix} maxHeight(number) = INfinity + +最大高度 + +###${prefix} maxWidth(number) = INfinity + +最大宽度 + +###${prefix} textAlign("center" | "left" | "right") = left + +水平对齐 + +###${prefix} textBaseline("top" | "middle" | "bottom") = top + +垂直对齐 + +###${prefix} layoutDirection("horizontal" | "vertical") = horizontal + +布局方向 + +###${prefix} singleLine(boolean) = false + +是否是单行 + +###${prefix} textConfig(Object) + +具体配置 + +####${prefix} image(string | HTMLImageElement | HTMLCanvasElement) + +图片 icon + +####${prefix} width(number) + +图片宽度 + +####${prefix} height(number) + +图片高度 + +{{ use: common-text( + prefix='###' +) }} + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='richtext' +) }} diff --git a/docs/assets/api/en/graphic/symbol.md b/docs/assets/api/en/graphic/symbol.md new file mode 100644 index 0000000..b9941ca --- /dev/null +++ b/docs/assets/api/en/graphic/symbol.md @@ -0,0 +1,26 @@ +{{ target: graphic-symbol }} + +# Symbol + +Symbol 图元 + +## attribute(any) + +Symbol 图元属性 + +###${prefix} symbolType('circle'|'cross'|'diamond'|'square'|'arrow'|'arrowLeft'|'arrowRight'|'arrow2Left'|'arrow2Right'|'wedge'|'thinTriangle'|'triangle'|'triangleUp'|'triangleDown'|'triangleRight'|'triangleLeft'|'stroke'|'star'|'wye'|'rect'|'rectRound'|'roundLine'|string) = 'circle' + +SVG 的 path 字符串 + +###${prefix} size(number | [number, number]) = 10 + +SVG 的 大小 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='symbol' +) }} diff --git a/docs/assets/api/en/graphic/text.md b/docs/assets/api/en/graphic/text.md new file mode 100644 index 0000000..c6da845 --- /dev/null +++ b/docs/assets/api/en/graphic/text.md @@ -0,0 +1,62 @@ +{{ target: graphic-text }} + +# Text + +Text 图元 + +## attribute(any) + +Text 图元属性 + +{{ use: common-text( + prefix='##' +) }} + +###${prefix} maxLineWidth(number) = Infinity + +文字最大行宽 + +###${prefix} lineHeight(number) + +文字行高 + +###${prefix} direction('horizontal' | 'vertical') + +水平布局还是垂直布局 + +###${prefix} verticalMode(0 | 1) + +垂直布局的模式,0 代表默认(横向 textAlign,纵向 textBaseline),1 代表特殊(横向 textBaseline,纵向 textAlign) + +###${prefix} wordBreak('break-word' | 'break-all') + +文字截断策略 + +###${prefix} ignoreBuf(boolean) + +是否忽略文字 bounds 加的 buffer + +###${prefix} heightLimit(number) + +行高限制 + +###${prefix} lineClamp(number) + +行数限制 + +###${prefix} whiteSpace('normal' | 'no-wrap') + +是否换行 + +###${prefix} suffixPosition('start' | 'end' | 'middle') + +省略号出现的位置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='text' +) }} diff --git a/docs/assets/api/zh/api.md b/docs/assets/api/zh/api.md new file mode 100644 index 0000000..1a264f1 --- /dev/null +++ b/docs/assets/api/zh/api.md @@ -0,0 +1,14 @@ +{{ target: api }} + +{{import: graphic-arc}} +{{import: graphic-area}} +{{import: graphic-circle}} +{{import: graphic-group}} +{{import: graphic-image}} +{{import: graphic-line}} +{{import: graphic-path}} +{{import: graphic-polygon}} +{{import: graphic-rect}} +{{import: graphic-richtext}} +{{import: graphic-symbol}} +{{import: graphic-text}} diff --git a/docs/assets/api/zh/common/attribute.md b/docs/assets/api/zh/common/attribute.md new file mode 100644 index 0000000..8ba9aa3 --- /dev/null +++ b/docs/assets/api/zh/common/attribute.md @@ -0,0 +1,221 @@ +{{ target: common-attribute }} + +#${prefix} x(number) = 0 + +图元 X 坐标位置 + +#${prefix} y(number) = 0 + +图元 Y 坐标位置 + +#${prefix} z(number) = 0 + +图元 Z 坐标位置(需要开启 3d) + +#${prefix} dx(number) = 0 + +图元 X 方向的偏移 + +#${prefix} dy(number) = 0 + +图元 Y 方向的偏移 + +#${prefix} dz(number) = 0 + +图元 Z 方向的偏移(需要开启 3d) + +#${prefix} scaleX(number) = 1 + +图元 X 方向的缩放 + +#${prefix} scaleY(number) = 1 + +图元 Y 方向的缩放 + +#${prefix} scaleZ(number) = 1 + +图元 Z 方向的缩放 + +#${prefix} angle(number) = 0 + +图元顺时针方向旋转弧度 + +#${prefix} anchor([number|string, number|string]) = [] + +图元旋转锚点 + +#${prefix} keepDirIn3d(boolean) = false + +是否在 3d 中控制方向,false: 不控制方向,true: 始终控制方向朝摄像机 + +#${prefix} opacity(number) = 1 + +图元透明度,会同时影响 fill 和 stroke,计算为`opacity * fillOpacity`和`opacity * strokeOpacity` + +#${prefix} fill(string|IColor|false) = false + +图元填充颜色,支持纯色字符串和渐变色字符串,设置 false 则不填充 + +#${prefix} fillOpacity(number) = 1 + +图元 fill 部分的透明度,同时收到 opacity 影响,计算为`opacity * fillOpacity` + +#${prefix} stroke(string|IColor|false) = false + +图元描边颜色,支持纯色字符串和渐变色字符串,设置 false 则不描边 + +#${prefix} strokeOpacity(number) = 1 + +图元 stroke 部分的透明度,同时收到 opacity 影响,计算为`opacity * strokeOpacity` + +#${prefix} lineWidth(number) = 1 + +图元描边的宽度,默认是 1 + +#${prefix} lineDash(number[]) = [] + +图元描边的虚线配置 + +#${prefix} lineDashOffset(number) = 0 + +图元描边的虚线偏移配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset + +#${prefix} lineCap("butt"|"round"|"square") = 'butt' + +图元描边的线帽配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap + +#${prefix} lineJoin("round"|"bevel"|"miter") = 'butt' + +图元描边的连接处配置 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin + +#${prefix} miterLimit(number) = 10 + +https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/miterLimit + +#${prefix} visible(boolean) = true + +元素是否可见 + +#${prefix} zIndex(number) = 0 + +元素在当前组中的排序 + +#${prefix} layout('flex'|'') = '' + +元素的布局,flex 仅在开启 flex 布局模式下生效 + +#${prefix} shadowColor(string|IColor|false) = false + +图元的阴影颜色 + +#${prefix} shadowOffsetX(number) = 0 + +图元的阴影在 X 方向上的偏移 + +#${prefix} shadowOffsetY(number) = 0 + +图元的阴影在 Y 方向上的偏移 + +#${prefix} shadowBlur(number) = 0 + +图元的阴影的模糊距离 + +#${prefix} background(string|HTMLImageElement| HTMLCanvasElement) = '' + +图元的背景图片 + +#${prefix} backgroundMode('repeat'|'repeat-x' | 'repeat-y' | 'no-repeat') = '' + +图元的背景图片填充模式 + +#${prefix} backgroundFit(boolean) = false + +图元的背景图片是否正好填充,只在 repeat-x 或者 repeat-y 以及 no-repeat 的时候生效 + +#${prefix} backgroundCornerRadius(number | number[]) = 0 + +目前只针对文字生效,配置背景的圆角 + +#${prefix} texture("circle" | "rect" | "diamond" | "vertical-line" | "horizontal-line" | "bias-lr" | "bias-rl" | "grid") = 0 + +纹理填充的样式 + +#${prefix} textureColor(string | false) = false + +纹理填充的颜色 + +#${prefix} textureSize(number) = 10 + +每一个纹理单元的大小 + +#${prefix} texturePadding(number) = 2 + +纹理单元的 padding + +#${prefix} cursor(Cursor) = 'default' + +鼠标的样式 + +#${prefix} renderStyle('default' | 'rough') = 'default' + +渲染风格,rough 配置 在启用 rough 风格时才会生效 + +#${prefix} html(Object|null) = null + +html 配置,在该图元位置展示配置的 html 元素 + +##${prefix} dom(string | HTMLElement) + +html 的具体 dom 字符串或者 dom 对象 + +##${prefix} container(string | HTMLElement) + +承载 html 内容的容器,默认是 Canvas 的容器 + +##${prefix} width(number) + +dom 的宽度 + +##${prefix} height(number) + +dom 的高度 + +##${prefix} style(string | Object) + +容器的样式 + +##${prefix} visible(boolean) + +html 是否可见 + +##${prefix} anchorType('position' | 'boundsLeftTop') + +html 的定位模式,基于 xy 位置定位,还是基于这个图元包围盒的左上角定位 + +#${prefix} pickable(boolean) = true + +是否支持事件拾取,默认为 true。 + +#${prefix} fillPickable(boolean) = true + +否支持 fill 部分的拾取,默认为 true。 + +#${prefix} strokePickable(boolean) = true + +否支持 stroke 部分的拾取,默认为 true。 + +#${prefix} childrenPickable(boolean) = true + +否支持子节点的拾取,默认为 true。 + +#${prefix} shadowRootIdx(number) = 1 + +shadowRoot 在宿主图元的上方还是下方,>0 为下方,<0 为上方 + +#${prefix} globalZIndex(number) = 0 + +全局的 zIndex,配置后会提取到交互层,在交互层中进行按顺序绘制 + +#${prefix} globalCompositeOperation(CanvasRenderingContext2D['globalCompositeOperation']) = '' + +对应 Canvas 的 globalCompositeOperation,用来配置滤镜 diff --git a/docs/assets/api/zh/common/graphic.md b/docs/assets/api/zh/common/graphic.md new file mode 100644 index 0000000..cc11b12 --- /dev/null +++ b/docs/assets/api/zh/common/graphic.md @@ -0,0 +1,130 @@ +{{ target: common-graphic }} + +#${prefix} type(string) = ${gtype} + +图元类型 + +#${prefix} children(IGraphic[]) = [] + +孩子节点 + +#${prefix} shadowRoot(IShadowRoot) = [] + +影子节点 + +#${prefix} valid(boolean) = false + +该图元是否合法 + +#${prefix} parent(IGroup|null) = null + +该图元的父节点 + +#${prefix} isContainer(boolean) + +该图元是否是容器图元 + +#${prefix} AABBBounds(IAABBBounds) + +该图元的包围盒 + +#${prefix} globalAABBBounds(IAABBBounds) + +该图元的全局包围盒 + +#${prefix} transMatrix(IMatrix) + +该图元的变换矩阵 + +#${prefix} globalTransMatrix(IMatrix) + +该图元的全局变换矩阵 + +#${prefix} initAttributes()() + +初始化图元的属性,参数为: + +- params: Partial + +#${prefix} setAttributes()() + +设置图元的属性,参数为: + +- params: Partial +- forceUpdateTag?: boolean +- context?: ISetAttributeContext + +#${prefix} setAttribute()() + +设置图元的属性,参数为: + +- key: string +- value: any +- forceUpdateTag?: boolean +- context?: ISetAttributeContext + +#${prefix} attachShadow()() + +添加影子节点 + +#${prefix} detachShadow()() + +删除影子节点 + +#${prefix} toJson()() + +将该图元以及子图元导出成 json + +#${prefix} clone()() + +克隆该图元 + +#${prefix} translate()() + +基于当前位置偏移变换,参数为: + +- x: number +- y: number + +#${prefix} translateTo()() + +偏移到某点的变换,参数为: + +- x: number +- y: number + +#${prefix} scale()() + +基于当前的缩放变换,参数为: + +- scaleX: number +- scaleY: number +- scaleCenter?: IPointLike + +#${prefix} scaleTo()() + +缩放到某个大小的变换,参数为: + +- scaleX: number +- scaleY: number + +#${prefix} rotate()() + +旋转变换,参数为: + +- angle: number +- rotateCenter?: IPointLike + +#${prefix} rotateTo()() + +旋转到某个角度的变换,参数为: + +- angle: number + +#${prefix} animate()() + +添加动画 + +#${prefix} stateProxy()() + +状态配置函数 diff --git a/docs/assets/api/zh/common/text.md b/docs/assets/api/zh/common/text.md new file mode 100644 index 0000000..d28e2e8 --- /dev/null +++ b/docs/assets/api/zh/common/text.md @@ -0,0 +1,38 @@ +{{ target: common-text }} + +#${prefix} text(string | number) = '' + +文字值 + +#${prefix} fontSize(number) = 16 + +字体大小 + +#${prefix} fontFamily(string) = PingFang SC,Microsoft Yahei,system-ui,-apple-system,segoe ui, +Roboto,Helvetica,Arial,sans-serif, apple color emoji,segoe ui emoji,segoe ui symbol + +字体 + +#${prefix} fill(IColor | boolean) = false + +文字填充色 + +#${prefix} stroke(IColor | boolean) = false + +文字描边色 + +#${prefix} fontWeight(string) = '' + +字宽 + +#${prefix} fontStyle("normal" | "italic" | "oblique") = 'normal' + +文字风格 + +#${prefix} underline(number) = 0 + +下划线线粗 + +#${prefix} lineThrough(number) = 0 + +中划线线粗 diff --git a/docs/assets/api/zh/graphic/arc.md b/docs/assets/api/zh/graphic/arc.md new file mode 100644 index 0000000..1cab7d2 --- /dev/null +++ b/docs/assets/api/zh/graphic/arc.md @@ -0,0 +1,50 @@ +{{ target: graphic-arc }} + +# Arc + +弧形图元 + +## attribute(any) + +弧形图元属性 + +###${prefix} innerRadius(number) = 0 + +内半径 + +###${prefix} outerRadius(number) = 0 + +外半径 + +###${prefix} startAngle(number) = 0 + +起始弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} endAngle(number) = 0 + +终止弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} cornerRadius(number) = 0 + +用于指定扇形区块的内外圆角半径 + +###${prefix} padAngle(number) = 0 + +间隙角度;间隔角度会转换为一个在两个相邻的弧之间的确定的线性距离 + +###${prefix} cap(boolean) = false + +是否给扇区添加一个 cap + +###${prefix} forceShowCap(boolean) = false + +当 cap = true 并且 使用了渐变填充的时候,自动实现 conical 渐变,也就是环形的渐变 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='arc' +) }} diff --git a/docs/assets/api/zh/graphic/area.md b/docs/assets/api/zh/graphic/area.md new file mode 100644 index 0000000..6b48ee0 --- /dev/null +++ b/docs/assets/api/zh/graphic/area.md @@ -0,0 +1,38 @@ +{{ target: graphic-area }} + +# Area + +面积图元 + +## attribute(any) + +面积图元属性 + +###${prefix} points(IPointLike[]) = [] + +面积图元的点 + +###${prefix} segments(IAreaSegment[]) = [] + +面积图元的分段 + +###${prefix} curveType("linear" | "basis"|"step"|"stepBefore"|"stepAfter"|"monotoneX"|"monotoneY") = 0 + +曲面类型 + +###${prefix} clipRange(number) = 1 + +裁切比例 + +###${prefix} closePath(boolean) = false + +是否要闭合首尾点 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='area' +) }} diff --git a/docs/assets/api/zh/graphic/circle.md b/docs/assets/api/zh/graphic/circle.md new file mode 100644 index 0000000..6338277 --- /dev/null +++ b/docs/assets/api/zh/graphic/circle.md @@ -0,0 +1,30 @@ +{{ target: graphic-circle }} + +# Circle + +圆形图元 + +## attribute(any) + +圆形图元属性 + +###${prefix} radius(number) = 0 + +圆形半径 + +###${prefix} startAngle(number) = 0 + +起始弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +###${prefix} endAngle(number) = 0 + +结束弧度,0 表示 12 点钟方向并且顺时针方向为正。 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='circle' +) }} diff --git a/docs/assets/api/zh/graphic/group.md b/docs/assets/api/zh/graphic/group.md new file mode 100644 index 0000000..7c7c316 --- /dev/null +++ b/docs/assets/api/zh/graphic/group.md @@ -0,0 +1,62 @@ +{{ target: graphic-group }} + +# Group + +Group 图元 + +## attribute(any) + +Group 图元属性 + +###${prefix} width(number) = 0 + +宽度,用于 clip + +###${prefix} height(number) = 0 + +高度,用于 clip + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置。 + +###${prefix} clip(boolean) = 0 + +是否裁切 + +###${prefix} visibleAll(boolean) = true + +是否自身以及所有子图元都可见 + +###${prefix} display('relative' | 'flex') = 'relative' + +布局方式,相对布局还是 flex 布局(参考 css) + +###${prefix} flexDirection('row' | 'row-reverse' | 'column' | 'column-reverse') = 'row' + +参考 css flexDirection + +###${prefix} flexWrap('nowrap' | 'wrap') = 'wrap' + +参考 css flexWrap + +###${prefix} justifyContent('flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around') = 'flex-start' + +参考 css justifyContent + +###${prefix} alignItems('flex-start' | 'flex-end' | 'center') = 'flex-start' + +参考 css alignItems + +###${prefix} alignContent('flex-start' | 'center' | 'space-between' | 'space-around') = 'flex-start' + +参考 css alignContent + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='group' +) }} diff --git a/docs/assets/api/zh/graphic/image.md b/docs/assets/api/zh/graphic/image.md new file mode 100644 index 0000000..b3a1ae6 --- /dev/null +++ b/docs/assets/api/zh/graphic/image.md @@ -0,0 +1,42 @@ +{{ target: graphic-image }} + +# Image + +Image 图元 + +## attribute(any) + +Image 图元属性 + +###${prefix} width(number) = 0 + +宽度,用于 clip + +###${prefix} height(number) = 0 + +高度,用于 clip + +###${prefix} repeatX("repeat" | "no-repeat") = 0 + +是否在 X 方向重复 + +###${prefix} repeatY("repeat" | "no-repeat") = 0 + +是否在 Y 方向重复 + +###${prefix} image(string | HTMLImageElement | HTMLCanvasElement) = '' + +图片 URL,svg 或者 image dom + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='image' +) }} diff --git a/docs/assets/api/zh/graphic/line.md b/docs/assets/api/zh/graphic/line.md new file mode 100644 index 0000000..98d9054 --- /dev/null +++ b/docs/assets/api/zh/graphic/line.md @@ -0,0 +1,42 @@ +{{ target: graphic-line }} + +# Line + +line 图元 + +## attribute(any) + +line 图元属性 + +###${prefix} points(IPointLike[]) = [] + +线段图元的点 + +###${prefix} segments(IAreaSegment[]) = [] + +线段图元的分段 + +###${prefix} curveType("linear" | "basis"|"step"|"stepBefore"|"stepAfter"|"monotoneX"|"monotoneY") = 0 + +线段类型 + +###${prefix} clipRange(number) = 1 + +裁切比例 + +###${prefix} clipRangeByDimension("auto" | "default" | "x" | "y") = 'default' + +按照长度裁切还是按照 X 和 Y 方向的投影裁切 + +###${prefix} closePath(boolean) = false + +是否要闭合首尾点 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='line' +) }} diff --git a/docs/assets/api/zh/graphic/path.md b/docs/assets/api/zh/graphic/path.md new file mode 100644 index 0000000..d626603 --- /dev/null +++ b/docs/assets/api/zh/graphic/path.md @@ -0,0 +1,22 @@ +{{ target: graphic-path }} + +# Path + +Path 图元 + +## attribute(any) + +Path 图元属性 + +###${prefix} path(ICustomPath2D | string) = '' + +SVG 的 path 字符串 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='path' +) }} diff --git a/docs/assets/api/zh/graphic/polygon.md b/docs/assets/api/zh/graphic/polygon.md new file mode 100644 index 0000000..4f946bc --- /dev/null +++ b/docs/assets/api/zh/graphic/polygon.md @@ -0,0 +1,30 @@ +{{ target: graphic-polygon }} + +# Polygon + +Polygon 图元 + +## attribute(any) + +Polygon 图元属性 + +###${prefix} points(IPointLike[]) = '' + +polygon 的顶点属性 + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角属性 + +###${prefix} closePath(boolean) = false + +是否首尾顶点闭合 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='polygon' +) }} diff --git a/docs/assets/api/zh/graphic/rect.md b/docs/assets/api/zh/graphic/rect.md new file mode 100644 index 0000000..4a5a268 --- /dev/null +++ b/docs/assets/api/zh/graphic/rect.md @@ -0,0 +1,30 @@ +{{ target: graphic-rect }} + +# Rect + +矩形图元 + +## attribute(any) + +矩形图元属性 + +###${prefix} width(number) = 0 + +图元宽度 + +###${prefix} height(number) = 0 + +图元高度 + +###${prefix} cornerRadius(number | number[]) = 0 + +圆角配置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='rect' +) }} diff --git a/docs/assets/api/zh/graphic/richtext.md b/docs/assets/api/zh/graphic/richtext.md new file mode 100644 index 0000000..49f072f --- /dev/null +++ b/docs/assets/api/zh/graphic/richtext.md @@ -0,0 +1,82 @@ +{{ target: graphic-richtext }} + +# RichText + +RichText 图元 + +## attribute(any) + +RichText 图元属性 + +###${prefix} width(number) = 0 + +宽度 + +###${prefix} height(number) = 0 + +高度 + +###${prefix} ellipsis(boolean | string) = true + +裁切时是否展示... + +###${prefix} wordBreak("break-word" | "break-all") = break-all + +富文本裁切的格式 + +###${prefix} verticalDirection("top" | "middle" | "bottom") = break-all + +富文本垂直方向的位置 + +###${prefix} maxHeight(number) = INfinity + +最大高度 + +###${prefix} maxWidth(number) = INfinity + +最大宽度 + +###${prefix} textAlign("center" | "left" | "right") = left + +水平对齐 + +###${prefix} textBaseline("top" | "middle" | "bottom") = top + +垂直对齐 + +###${prefix} layoutDirection("horizontal" | "vertical") = horizontal + +布局方向 + +###${prefix} singleLine(boolean) = false + +是否是单行 + +###${prefix} textConfig(Object) + +具体配置 + +####${prefix} image(string | HTMLImageElement | HTMLCanvasElement) + +图片 icon + +####${prefix} width(number) + +图片宽度 + +####${prefix} height(number) + +图片高度 + +{{ use: common-text( + prefix='###' +) }} + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='richtext' +) }} diff --git a/docs/assets/api/zh/graphic/symbol.md b/docs/assets/api/zh/graphic/symbol.md new file mode 100644 index 0000000..b9941ca --- /dev/null +++ b/docs/assets/api/zh/graphic/symbol.md @@ -0,0 +1,26 @@ +{{ target: graphic-symbol }} + +# Symbol + +Symbol 图元 + +## attribute(any) + +Symbol 图元属性 + +###${prefix} symbolType('circle'|'cross'|'diamond'|'square'|'arrow'|'arrowLeft'|'arrowRight'|'arrow2Left'|'arrow2Right'|'wedge'|'thinTriangle'|'triangle'|'triangleUp'|'triangleDown'|'triangleRight'|'triangleLeft'|'stroke'|'star'|'wye'|'rect'|'rectRound'|'roundLine'|string) = 'circle' + +SVG 的 path 字符串 + +###${prefix} size(number | [number, number]) = 10 + +SVG 的 大小 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='symbol' +) }} diff --git a/docs/assets/api/zh/graphic/text.md b/docs/assets/api/zh/graphic/text.md new file mode 100644 index 0000000..c6da845 --- /dev/null +++ b/docs/assets/api/zh/graphic/text.md @@ -0,0 +1,62 @@ +{{ target: graphic-text }} + +# Text + +Text 图元 + +## attribute(any) + +Text 图元属性 + +{{ use: common-text( + prefix='##' +) }} + +###${prefix} maxLineWidth(number) = Infinity + +文字最大行宽 + +###${prefix} lineHeight(number) + +文字行高 + +###${prefix} direction('horizontal' | 'vertical') + +水平布局还是垂直布局 + +###${prefix} verticalMode(0 | 1) + +垂直布局的模式,0 代表默认(横向 textAlign,纵向 textBaseline),1 代表特殊(横向 textBaseline,纵向 textAlign) + +###${prefix} wordBreak('break-word' | 'break-all') + +文字截断策略 + +###${prefix} ignoreBuf(boolean) + +是否忽略文字 bounds 加的 buffer + +###${prefix} heightLimit(number) + +行高限制 + +###${prefix} lineClamp(number) + +行数限制 + +###${prefix} whiteSpace('normal' | 'no-wrap') + +是否换行 + +###${prefix} suffixPosition('start' | 'end' | 'middle') + +省略号出现的位置 + +{{ use: common-attribute( + prefix='##' +) }} + +{{ use: common-graphic( + prefix='#', + gtype='text' +) }} diff --git a/docs/assets/changelog/en/changelog.md b/docs/assets/changelog/en/changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/assets/changelog/zh/changelog.md b/docs/assets/changelog/zh/changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/assets/examples/menu.json b/docs/assets/examples/menu.json new file mode 100644 index 0000000..d4ab6a0 --- /dev/null +++ b/docs/assets/examples/menu.json @@ -0,0 +1,4 @@ +{ + "menu": "examples", + "children": [] +} diff --git a/docs/assets/guide/menu.json b/docs/assets/guide/menu.json new file mode 100644 index 0000000..ccd173b --- /dev/null +++ b/docs/assets/guide/menu.json @@ -0,0 +1,4 @@ +{ + "menu": "scripts", + "children": [] +} diff --git a/docs/assets/option/en/option.md b/docs/assets/option/en/option.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/demos/package.json b/docs/demos/package.json new file mode 100644 index 0000000..5e6a9f9 --- /dev/null +++ b/docs/demos/package.json @@ -0,0 +1,37 @@ +{ + "name": "@internal/dev-demos", + "private": true, + "version": "0.0.0", + "scripts": { + "start": "vite --host", + "dev": "vite", + "build": "", + "preview": "vite preview" + }, + "devDependencies": { + "@internal/eslint-config": "workspace:*", + "@internal/ts-config": "workspace:*", + "@visactor/vutils": "~0.18.4", + "d3-scale-chromatic": "^3.0.0", + "lodash": "4.17.21", + "dat.gui": "^0.7.9", + "stats.js": "^0.17.0", + "typescript": "4.9.5", + "vite": "3.2.6", + "canvas": "2.11.2", + "rollup-plugin-typescript2": "^0.33.0", + "@esbuild-plugins/node-globals-polyfill": "0.1.1", + "@esbuild-plugins/node-modules-polyfill": "0.1.4", + "@babel/plugin-syntax-decorators": "7.22.10", + "rollup-plugin-node-polyfills": "0.2.1", + "@vitejs/plugin-react": "3.1.0", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "zrender": "5.4.0", + "@antv/g": "^5.7.4" + }, + "dependencies": { + "fast-xml-parser": "4.2.7", + "inversify": "6.0.1", + "@visactor/vstory": "workspace:0.0.1" + } +} diff --git a/docs/demos/src/pages/rect.ts b/docs/demos/src/pages/rect.ts new file mode 100644 index 0000000..e69de29 diff --git a/docs/demos/tsconfig.json b/docs/demos/tsconfig.json new file mode 100644 index 0000000..619e641 --- /dev/null +++ b/docs/demos/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "jsx": "preserve", + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "skipLibCheck": true + }, + "references": [ + { + "path": "../../packages/vstory/" + } + ], + "include": ["src"] +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..a46c95e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,15 @@ + + + + Documents Site + + + + + + + +
+ + + diff --git a/docs/index.js b/docs/index.js new file mode 100644 index 0000000..d785f1e --- /dev/null +++ b/docs/index.js @@ -0,0 +1,205 @@ +/** + * Usage: + * example command: node ./download-documents.js path=./examples token=1e7a4c5b-893e-580f-96f2-29e62d5de99c routeId=186 + * arguments: + * path: target directory to store documents + * token: cms site token + * routeId: top route id for cms site + * + * target directory structure: + * entry: + * zh: xx.md / dir + * en: xx.md / dir + */ + +const fs = require('fs'); +const path = require('path'); +const fetch = require('node-fetch-commonjs'); + +// configs +const languages = ['zh', 'en']; +const ignores = ['README.md', 'readme.md']; + +// CMS Domain + +const CMSDomain = 'https://cms-cn.zijieapi.com'; + +// CMS Top Routes + +const vchartExampleRouteId = 186; +const vchartGuideRouteId = 51; +const vchartAPIRouteId = 439; + +const vtableExampleRouteId = 893; + +const vgrammarExampleRouteId = 593; +const vgrammarGuideRouteId = 966; +const vgrammarAPIRouteId = 464; + +const vstoryExampleRouteId = 760; +const vstoryGuideRouteId = 137; + +// CMS Default Routes + +const vchartGuideDefaultRoute = 'tutorial_docs/VChart_Website_Guide'; +const vchartOptionDefaultRoute = 'barChart'; +const vchartAPIDefaultRoute = 'API/vchart'; + +const vtableGuideDefaultRoute = 'Getting_Started/Getting_Started'; +const vtableOptionDefaultRoute = 'ListTable'; +const vtableAPIDefaultRoute = 'Methods'; + +const vgrammarGuideDefaultRoute = 'guides/quick-start'; +const vgrammarOptionDefaultRoute = ''; +const vgrammarAPIDefaultRoute = 'API/View'; + +const vstoryGuideDefaultRoute = 'asd/VStory_Website_Guide'; + +// CMS Token + +const tokenEnum = { + vchartDemo: '1e7a4c5b-893e-580f-96f2-29e62d5de99c', + vchartGuide: 'dc79e81f-bd0a-504c-825c-ce3f03cfd265', + vchartAPI: 'a79cad5f-889c-5cf2-888a-f82e6d92ba55', + + vtableDemo: '28dbb65d-54be-53e0-8a20-7e93d0dc5cc8', + vtableGuide: '03430e05-d316-5621-b90e-d3c33f2a2a4d', + + vgrammarDemo: '02cd267d-ea09-555b-ac32-2275dd2faa17', + vgrammarGuide: '59677583-a493-5305-851a-1153c93e2234', + vgrammarAPI: '9369d0a5-5dd6-504a-8086-66fdd3b3684f', + + vstoryDemo: '297426ca-15e4-51d3-83c8-70fc4594ce11', + vstoryGuide: '21b79304-2124-5ec7-a57e-d79dece3b3a8' +}; + +// arguments +const arguments = process.argv.slice(2); + +let targetDirectory = path.resolve(__dirname); +let token = ''; +let routeId = -1; +for (const argument of arguments) { + if (argument.startsWith('path=')) { + targetDirectory = argument.split('path=')[1]; + } else if (argument.startsWith('token=')) { + token = argument.split('token=')[1]; + } else if (argument.startsWith('routeId=')) { + routeId = argument.split('routeId=')[1]; + } +} +if (token === '') { + console.error('Invalid parameters! Please refer to the cms config in the scripts.'); +} +targetDirectory = path.resolve(targetDirectory); +const targetEntry = targetDirectory.split('/')[targetDirectory.split('/').length - 1]; + +async function fetchCMSData(token, url, plain) { + const response = await fetch(`${CMSDomain}${url}`, { + method: 'GET', + mode: 'cors', + cache: 'default', + headers: { + // 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json', + Authorization: token + } + }); + const json = await response.json(); + const data = plain ? json : json?.data; + return data; +} + +async function fetchRoutes(routeId, token) { + if (routeId === -1) { + const routeData = await fetchCMSData(token, `/api/open/site`, false); + return routeData.routes; + } + const routeData = await fetchCMSData(token, `/api/open/site/top/${routeId}`, false); + return routeData[0].children; +} + +async function generateRouteData(route, parentMenuItem, rootDirectory, directory, token) { + // not downloading any readme file + if (route.path.indexOf('README') >= 0) { + return; + } + if (route.children) { + for (const language of languages) { + const targetPath = path.join(rootDirectory, language, directory, route.path); + // create directory + if (!fs.existsSync(targetPath)) { + fs.mkdirSync(targetPath); + } + } + const menuItem = { + path: route.path, + title: { + zh: route.name['1'], + en: route.name['2'] + }, + children: [] + }; + parentMenuItem.children.push(menuItem); + for (const subRoute of route.children) { + await generateRouteData(subRoute, menuItem, rootDirectory, path.join(directory, route.path), token); + } + } else { + const menuItem = { + path: route.path, + title: {} + }; + parentMenuItem.children.push(menuItem); + for (const language of languages) { + const languageIndex = languages.indexOf(language) + 1; + const document = await fetchCMSData( + token, + `/api/open/document?fullPath=${route.fullPath}&language=${languageIndex}`, + false + ); + const content = document[0].content; + if (!content || content === '') { + console.log(`Empty document: ${route.fullPath}`); + return; + } + const meta = JSON.parse(document[0].meta); + menuItem.title[language] = meta.title; + const targetPath = path.resolve(rootDirectory, language, directory, `${route.path}.md`); + fs.writeFileSync(targetPath, content, { encoding: 'utf8' }); + } + console.log(`Generate document: ${route.fullPath}`); + } +} + +// token = tokenEnum.vtableGuide; +// // routeId = vchartExampleRouteId; +// targetDirectory = './tutorials'; + +async function run() { + const routes = await fetchRoutes(routeId, token); + + const menu = { + menu: targetEntry, + children: [] + }; + const targetFullPath = path.resolve(targetDirectory); + if (!fs.existsSync(targetFullPath)) { + fs.mkdirSync(targetFullPath); + } + for (const language of languages) { + const languageFullPath = path.join(targetDirectory, language); + if (!fs.existsSync(languageFullPath)) { + fs.mkdirSync(languageFullPath); + } + } + for (const route of routes) { + await generateRouteData(route, menu, targetFullPath, '', token); + } + const menuResult = JSON.stringify(menu, null, 2); + const menuPath = path.join(targetDirectory, 'menu.json'); + fs.writeFileSync(menuPath, menuResult, { encoding: 'utf8' }); + + console.log('Successfully download all documents!'); +} + +run(); diff --git a/docs/libs/template-parse/build.js b/docs/libs/template-parse/build.js new file mode 100644 index 0000000..cac280f --- /dev/null +++ b/docs/libs/template-parse/build.js @@ -0,0 +1,188 @@ +/* Adapted from echarts-doc by Apache ECharts + * https://github.com/apache/echarts-doc + * Licensed under the Apache-2.0 license + + * url: https://github.com/apache/echarts-doc/blob/master/build.js + * License: https://github.com/apache/echarts-doc/blob/master/LICENSE + * @license + */ + +const md2json = require('./md2json'); +const { extractDesc } = require('./schemaHelper'); +const fs = require('fs'); +const fse = require('fs-extra'); +const chalk = require('chalk'); +const argv = require('yargs').argv; +const path = require('path'); +const assert = require('assert'); +const chokidar = require('chokidar'); +const { debounce } = require('lodash'); +const menu = require('../../menu.json'); + +function initEnv() { + let envType = argv.env; + let isDev = argv.dev != null || argv.debug != null || argv.env === 'dev'; + + if (isDev) { + console.warn('============================='); + console.warn('!!! THIS IS IN DEV MODE !!!'); + console.warn('============================='); + envType = 'dev'; + } + + if (!envType) { + throw new Error('--env MUST be specified'); + } + + let config = { + releaseDestDir: path.resolve(__dirname, '../../public/documents') + }; + + config.envType = envType; + + return config; +} + +const config = initEnv(); + +const languages = ['zh', 'en']; + +config.gl = config.gl || {}; +for (let key in config) { + if (key !== 'gl' && !config.gl.hasOwnProperty(key)) { + config.gl[key] = config[key]; + } +} + +async function md2jsonAsync(opt) { + var newOpt = Object.assign( + { + path: path.resolve(__dirname, opt.assetPath, opt.language, '**/*.md'), + tplEnv: Object.assign({}, config), + imageRoot: config.imagePath + }, + opt + ); + + function run(cb) { + md2json(newOpt) + .then(schema => { + writeSingleSchemaPartioned(schema, opt.language, opt.entry, false, opt.arrayKeys); + console.log(chalk.green('generated: ' + opt.language + '/' + opt.entry)); + cb && cb(); + }) + .catch(e => { + console.log(e); + }); + } + + var runDebounced = debounce(run, 500, { + leading: false, + trailing: true + }); + return await new Promise((resolve, reject) => { + run(resolve); + + if (argv.watch) { + chokidar + .watch(path.resolve(__dirname, opt.assetPath, opt.language), { + ignoreInitial: true + }) + .on('all', (event, path) => { + console.log(path, event); + runDebounced(); + }); + } + }); +} + +async function run() { + for (const menuItem of menu) { + if (menuItem.type !== 'markdown-template') { + continue; + } + for (const language of languages) { + await md2jsonAsync({ + sectionsAnyOf: menuItem.sections ?? [], + arrayKeys: menuItem.arrayKeys ?? [], + entry: menuItem.entry, + assetPath: `../../assets/${menuItem.menu}/`, + language + }); + } + } + + console.log('Build doc done.'); + + console.log('All done.'); +} + +function writeSingleSchemaPartioned(schema, language, docName, format, arrayItemKeys) { + const { outline, descriptions } = extractDesc(schema, docName, arrayItemKeys); + + const outlineBasename = `outline.json`; + const outlineDestPath = path.resolve(config.releaseDestDir, `${docName}/${language}/${outlineBasename}`); + fse.ensureDirSync(path.dirname(outlineDestPath)); + fse.outputFileSync(outlineDestPath, format ? JSON.stringify(outline, null, 2) : JSON.stringify(outline), 'utf-8'); + + function copyUIControlConfigs(source, target) { + for (let key in source) { + if (target[key]) { + if (source[key].uiControl && !target[key].uiControl) { + target[key].uiControl = source[key].uiControl; + } + if (source[key].exampleBaseOptions && !target[key].exampleBaseOptions) { + target[key].exampleBaseOptions = source[key].exampleBaseOptions; + } + } else { + // console.error(`Unmatched option path ${key}`); + } + } + } + + function readOptionDesc(language, partKey) { + const descBasename = `${partKey}.json`; + const descDestPath = path.resolve(config.releaseDestDir, `${docName}/${language}/${descBasename}`); + try { + const text = fs.readFileSync(descDestPath, 'utf-8'); + return JSON.parse(text); + } catch (e) { + return; + } + } + + function writeOptionDesc(language, partKey, json) { + const descBasename = `${partKey}.json`; + const descDestPath = path.resolve(config.releaseDestDir, `${docName}/${language}/${descBasename}`); + fse.ensureDirSync(path.dirname(descDestPath)); + fse.outputFileSync(descDestPath, format ? JSON.stringify(json, null, 2) : JSON.stringify(json), 'utf-8'); + } + + for (let partKey in descriptions) { + let partDescriptions = descriptions[partKey]; + + // Copy ui control config from zh to english. + if (language === 'zh') { + languages.forEach(function (otherLang) { + if (otherLang === 'zh') { + return; + } + const json = readOptionDesc(otherLang, partKey); + if (json) { + copyUIControlConfigs(partDescriptions, json); + writeOptionDesc(otherLang, partKey, json); + } + }); + } else { + const json = readOptionDesc('zh', partKey); + if (json) { + copyUIControlConfigs(json, partDescriptions); + } + } + + writeOptionDesc(language, partKey, partDescriptions); + // console.log(chalk.green('generated: ' + descDestPath)); + } +} + +run(); diff --git a/docs/libs/template-parse/etpl.js b/docs/libs/template-parse/etpl.js new file mode 100644 index 0000000..62baa8c --- /dev/null +++ b/docs/libs/template-parse/etpl.js @@ -0,0 +1,1679 @@ +/* Adapted from echarts-doc by Apache ECharts + * https://github.com/apache/echarts-doc + * Licensed under the Apache-2.0 license + + * url: https://github.com/apache/echarts-doc/blob/master/dep/etpl.js + * License: https://github.com/apache/echarts-doc/blob/master/LICENSE + * @license + */ + +/** + * ETPL (Enterprise Template) + * Copyright 2013 Baidu Inc. All rights reserved. + * + * @file 模板引擎 + * @author errorrik(errorrik@gmail.com) + * otakustay(otakustay@gmail.com) + */ + +// HACK: 可见的重复代码未抽取成function和var是为了gzip size,吐槽的一边去 +/* eslint-env node */ + +(function (root) { + /** + * 对象属性拷贝 + * + * @inner + * @param {Object} target 目标对象 + * @param {Object} source 源对象 + * @return {Object} 返回目标对象 + */ + function extend(target, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + + return target; + } + + /** + * 随手写了个栈 + * + * @inner + * @constructor + */ + function Stack() { + this.raw = []; + this.length = 0; + } + + Stack.prototype = { + /** + * 添加元素进栈 + * + * @param {*} elem 添加项 + */ + push: function (elem) { + this.raw[this.length++] = elem; + }, + + /** + * 弹出顶部元素 + * + * @return {*} 顶部元素 + */ + pop: function () { + if (this.length > 0) { + var elem = this.raw[--this.length]; + this.raw.length = this.length; + return elem; + } + }, + + /** + * 获取顶部元素 + * + * @return {*} 顶部元素 + */ + top: function () { + return this.raw[this.length - 1]; + }, + + /** + * 获取底部元素 + * + * @return {*} 底部元素 + */ + bottom: function () { + return this.raw[0]; + }, + + /** + * 根据查询条件获取元素 + * + * @param {Function} condition 查询函数 + * @return {*} 符合条件的元素 + */ + find: function (condition) { + var index = this.length; + while (index--) { + var item = this.raw[index]; + if (condition(item)) { + return item; + } + } + } + }; + + /** + * 唯一id的起始值 + * + * @inner + * @type {number} + */ + var guidIndex = 0x2b845; + + /** + * 获取唯一id,用于匿名target或编译代码的变量名生成 + * + * @inner + * @return {string} 唯一id + */ + function generateGUID() { + return '___' + guidIndex++; + } + + /** + * 构建类之间的继承关系 + * + * @inner + * @param {Function} subClass 子类函数 + * @param {Function} superClass 父类函数 + */ + function inherits(subClass, superClass) { + /* jshint -W054 */ + var subClassProto = subClass.prototype; + var F = new Function(); + F.prototype = superClass.prototype; + subClass.prototype = new F(); + subClass.prototype.constructor = subClass; + extend(subClass.prototype, subClassProto); + /* jshint +W054 */ + } + + /** + * HTML Filter替换的字符实体表 + * + * @const + * @inner + * @type {Object} + */ + var HTML_ENTITY = { + /* jshint ignore:start */ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + /* eslint-disable quotes */ + "'": ''' + /* eslint-enable quotes */ + /* jshint ignore:end */ + }; + + /** + * HTML Filter的替换函数 + * + * @inner + * @param {string} c 替换字符 + * @return {string} 替换后的HTML字符实体 + */ + function htmlFilterReplacer(c) { + return HTML_ENTITY[c]; + } + + /** + * 默认filter + * + * @inner + * @const + * @type {Object} + */ + var DEFAULT_FILTERS = { + /** + * HTML转义filter + * + * @param {string} source 源串 + * @return {string} 替换结果串 + */ + html: function (source) { + return source.replace(/[&<>"']/g, htmlFilterReplacer); + }, + + /** + * URL编码filter + * + * @param {string} source 源串 + * @return {string} 替换结果串 + */ + url: encodeURIComponent, + + /** + * 源串filter,用于在默认开启HTML转义时获取源串,不进行转义 + * + * @param {string} source 源串 + * @return {string} 替换结果串 + */ + raw: function (source) { + return source; + } + }; + + /** + * 字符串字面化 + * + * @inner + * @param {string} source 需要字面化的字符串 + * @return {string} 字符串字面化结果 + */ + function stringLiteralize(source) { + return ( + '"' + + source + .replace(/\x5C/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\x0A/g, '\\n') + .replace(/\x09/g, '\\t') + .replace(/\x0D/g, '\\r') + + // .replace( /\x08/g, '\\b' ) + // .replace( /\x0C/g, '\\f' ) + '"' + ); + } + + /** + * 对字符串进行可用于new RegExp的字面化 + * + * @inner + * @param {string} source 需要字面化的字符串 + * @return {string} 字符串字面化结果 + */ + function regexpLiteral(source) { + return source.replace(/[\^\[\]\$\(\)\{\}\?\*\.\+]/g, function (c) { + return '\\' + c; + }); + } + + /** + * 字符串格式化 + * + * @inner + * @param {string} source 目标模版字符串 + * @param {...string} replacements 字符串替换项集合 + * @return {string} 格式化结果 + */ + function stringFormat(source) { + var args = arguments; + return source.replace(/\{([0-9]+)\}/g, function (match, index) { + return args[index - 0 + 1]; + }); + } + + /** + * 用于render的字符串变量声明语句 + * + * @inner + * @const + * @type {string} + */ + var RENDER_STRING_DECLATION = 'var r="";'; + + /** + * 用于render的字符串内容添加语句(起始) + * + * @inner + * @const + * @type {string} + */ + var RENDER_STRING_ADD_START = 'r+='; + + /** + * 用于render的字符串内容添加语句(结束) + * + * @inner + * @const + * @type {string} + */ + var RENDER_STRING_ADD_END = ';'; + + /** + * 用于render的字符串内容返回语句 + * + * @inner + * @const + * @type {string} + */ + var RENDER_STRING_RETURN = 'return r;'; + + // HACK: IE8-时,编译后的renderer使用join Array的策略进行字符串拼接 + var ieVersionMatch = typeof navigator !== 'undefined' && navigator.userAgent.match(/msie\s*([0-9]+)/i); + + if (ieVersionMatch && ieVersionMatch[1] - 0 < 8) { + RENDER_STRING_DECLATION = 'var r=[],ri=0;'; + RENDER_STRING_ADD_START = 'r[ri++]='; + RENDER_STRING_RETURN = 'return r.join("");'; + } + + /** + * 将访问变量名称转换成getVariable调用的编译语句 + * 用于if、var等命令生成编译代码 + * + * @inner + * @param {string} name 访问变量名 + * @return {string} getVariable调用的编译语句 + */ + function toGetVariableLiteral(name) { + name = name.replace(/^\s*\*/, ''); + return stringFormat( + 'gv({0},["{1}"])', + stringLiteralize(name), + name + .replace(/\[['"]?([^'"]+)['"]?\]/g, function (match, name) { + return '.' + name; + }) + .split('.') + .join('","') + ); + } + + /** + * 解析文本片段中以固定字符串开头和结尾的包含块 + * 用于 命令串: 和 变量替换串:${...} 的解析 + * + * @inner + * @param {string} source 要解析的文本 + * @param {string} open 包含块开头 + * @param {string} close 包含块结束 + * @param {boolean} greedy 是否贪婪匹配 + * @param {function({string})} onInBlock 包含块内文本的处理函数 + * @param {function({string})} onOutBlock 非包含块内文本的处理函数 + */ + function parseTextBlock(source, open, close, greedy, onInBlock, onOutBlock) { + var closeLen = close.length; + var texts = (source || '').split(open); + var level = 0; + var buf = []; + + for (var i = 0, len = texts.length; i < len; i++) { + var text = texts[i]; + + if (i) { + var openBegin = 1; + level++; + /* eslint-disable no-constant-condition */ + while (1) { + var closeIndex = text.indexOf(close); + if (closeIndex < 0) { + buf.push(level > 1 && openBegin ? open : '', text); + break; + } + + level = greedy ? level - 1 : 0; + buf.push(level > 0 && openBegin ? open : '', text.slice(0, closeIndex), level > 0 ? close : ''); + text = text.slice(closeIndex + closeLen); + openBegin = 0; + + if (level === 0) { + break; + } + } + /* eslint-enable no-constant-condition */ + + if (level === 0) { + onInBlock(buf.join('')); + onOutBlock(text); + buf = []; + } + } else { + text && onOutBlock(text); + } + } + + if (level > 0 && buf.length > 0) { + onOutBlock(open); + onOutBlock(buf.join('')); + } + } + + /** + * 编译变量访问和变量替换的代码 + * 用于普通文本或if、var、filter等命令生成编译代码 + * + * @inner + * @param {string} source 源代码 + * @param {Engine} engine 引擎实例 + * @param {boolean} forText 是否为输出文本的变量替换 + * @return {string} 编译代码 + */ + function compileVariable(source, engine, forText) { + var code = []; + var options = engine.options; + + var toStringHead = ''; + var toStringFoot = ''; + var wrapHead = ''; + var wrapFoot = ''; + + // 默认的filter,当forText模式时有效 + var defaultFilter; + + if (forText) { + toStringHead = 'ts('; + toStringFoot = ')'; + wrapHead = RENDER_STRING_ADD_START; + wrapFoot = RENDER_STRING_ADD_END; + defaultFilter = options.defaultFilter; + } + + parseTextBlock( + source, + options.variableOpen, + options.variableClose, + 1, + + function (text) { + // 加入默认filter + // 只有当处理forText时,需要加入默认filter + // 处理if/var/use等command时,不需要加入默认filter + if (forText && text.indexOf('|') < 0 && defaultFilter) { + text += '|' + defaultFilter; + } + + // variableCode是一个gv调用,然后通过循环,在外面包filter的调用 + // 形成filter["b"](filter["a"](gv(...))) + // + // 当forText模式,处理的是文本中的变量替换时 + // 传递给filter的需要是字符串形式,所以gv外需要包一层ts调用 + // 形成filter["b"](filter["a"](ts(gv(...)))) + // + // 当variableName以*起始时,忽略ts调用,直接传递原值给filter + var filterCharIndex = text.indexOf('|'); + var variableName = (filterCharIndex > 0 ? text.slice(0, filterCharIndex) : text) + .replace(/^\s+/, '') + .replace(/\s+$/, ''); + var filterSource = filterCharIndex > 0 ? text.slice(filterCharIndex + 1) : ''; + + var variableRawValue = variableName.indexOf('*') === 0; + var variableCode = [ + variableRawValue ? '' : toStringHead, + toGetVariableLiteral(variableName), + variableRawValue ? '' : toStringFoot + ]; + + if (filterSource) { + filterSource = compileVariable(filterSource, engine); + var filterSegs = filterSource.split('|'); + for (var i = 0, len = filterSegs.length; i < len; i++) { + var seg = filterSegs[i]; + var segMatch = seg.match(/^\s*([a-z0-9_-]+)(\((.*)\))?\s*$/i); + if (segMatch) { + variableCode.unshift('fs["' + segMatch[1] + '"]('); + + if (segMatch[3]) { + variableCode.push(',', segMatch[3]); + } + + variableCode.push(')'); + } + } + } + + code.push(wrapHead, variableCode.join(''), wrapFoot); + }, + + function (text) { + code.push(wrapHead, forText ? stringLiteralize(text) : text, wrapFoot); + } + ); + + return code.join(''); + } + + /** + * 文本节点类 + * + * @inner + * @constructor + * @param {string} value 文本节点的内容文本 + * @param {Engine} engine 引擎实例 + */ + function TextNode(value, engine) { + this.value = value; + this.engine = engine; + } + + TextNode.prototype = { + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + getRendererBody: function () { + var value = this.value; + var options = this.engine.options; + + if (!value || (options.strip && /^\s*$/.test(value))) { + return ''; + } + + return compileVariable(value, this.engine, 1); + }, + + /** + * 复制节点的方法 + * + * @return {TextNode} 节点复制对象 + */ + clone: function () { + return this; + } + }; + + /** + * 命令节点类 + * + * @inner + * @constructor + * @param {string} value 命令节点的value + * @param {Engine} engine 引擎实例 + */ + function Command(value, engine) { + this.value = value; + this.engine = engine; + this.children = []; + this.cloneProps = []; + } + + Command.prototype = { + /** + * 添加子节点 + * + * @param {TextNode|Command} node 子节点 + */ + addChild: function (node) { + this.children.push(node); + }, + + /** + * 节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + open: function (context) { + var parent = context.stack.top(); + parent && parent.addChild(this); + context.stack.push(this); + }, + + /** + * 节点闭合,解析结束 + * + * @param {Object} context 语法分析环境对象 + */ + close: function (context) { + if (context.stack.top() === this) { + context.stack.pop(); + } + }, + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + getRendererBody: function () { + var buf = []; + var children = this.children; + for (var i = 0; i < children.length; i++) { + buf.push(children[i].getRendererBody()); + } + + return buf.join(''); + }, + + /** + * 复制节点的方法 + * + * @return {Command} 节点复制对象 + */ + clone: function () { + var Clazz = this.constructor; + var node = new Clazz(this.value, this.engine); + + /* eslint-disable no-redeclare */ + for (var i = 0, l = this.children.length; i < l; i++) { + node.addChild(this.children[i].clone()); + } + + for (var i = 0, l = this.cloneProps.length; i < l; i++) { + var prop = this.cloneProps[i]; + node[prop] = this[prop]; + } + /* eslint-enable no-redeclare */ + + return node; + } + }; + + /** + * 命令自动闭合 + * + * @inner + * @param {Object} context 语法分析环境对象 + * @param {Function=} CommandType 自闭合的节点类型 + * @return {Command} 被闭合的节点 + */ + function autoCloseCommand(context, CommandType) { + var stack = context.stack; + var closeEnd = CommandType + ? stack.find(function (item) { + return item instanceof CommandType; + }) + : stack.bottom(); + + if (closeEnd) { + var node; + + while ((node = stack.top()) !== closeEnd) { + /* jshint ignore:start */ + // 如果节点对象不包含autoClose方法 + // 则认为该节点不支持自动闭合,需要抛出错误 + // for等节点不支持自动闭合 + if (!node.autoClose) { + throw new Error(node.type + ' must be closed manually: ' + node.value); + } + /* jshint ignore:end */ + + node.autoClose(context); + } + + closeEnd.close(context); + } + + return closeEnd; + } + + /** + * renderer body起始代码段 + * + * @inner + * @const + * @type {string} + */ + var RENDERER_BODY_START = + '' + + 'data=data||{};' + + 'var v={},fs=engine.filters,hg=typeof data.get=="function",' + + 'gv=function(n,ps){' + + 'var p=ps[0],d=v[p];' + + 'if(d==null){' + + 'if(hg){return data.get(n);}' + + 'd=data[p];' + + '}' + + 'for(var i=1,l=ps.length;i= TargetState.APPLIED) { + return 1; + } + + var blocks = this.blocks; + + function replaceBlock(node) { + var children = node.children; + + if (children instanceof Array) { + for (var i = 0, len = children.length; i < len; i++) { + var child = children[i]; + if (child instanceof BlockCommand && blocks[child.name]) { + child = children[i] = blocks[child.name]; + } + + replaceBlock(child); + } + } + } + + var master = this.engine.targets[masterName]; + if (master) { + if (master.applyMaster(master.master)) { + this.children = master.clone().children; + replaceBlock(this); + this.state = TargetState.APPLIED; + return 1; + } + } else if (this.engine.options.missTarget === 'error') { + throw new Error( + '[ETPL_MISS_TARGET]' + masterName + ', when extended by ' + (this.target ? this.target.name : this.name) + ); + } + }; + + /** + * 判断target是否ready + * 包括是否成功应用母版,以及import语句依赖的target是否ready + * + * @return {boolean} target是否ready + */ + TargetCommand.prototype.isReady = function () { + if (this.state >= TargetState.READY) { + return 1; + } + + var engine = this.engine; + var targetName = this.name; + var readyState = 1; + + /** + * 递归检查节点的ready状态 + * + * @inner + * @param {Command|TextNode} node 目标节点 + */ + function checkReadyState(node) { + for (var i = 0, len = node.children.length; i < len; i++) { + var child = node.children[i]; + + if (child instanceof ImportCommand) { + var target = engine.targets[child.name]; + if (!target && engine.options.missTarget === 'error') { + throw new Error('[ETPL_MISS_TARGET]' + child.name + ', when imported by ' + targetName); + } + + readyState = readyState && target && target.isReady(engine); + } else if (child instanceof Command) { + checkReadyState(child); + } + } + } + + if (this.applyMaster(this.master)) { + checkReadyState(this); + readyState && (this.state = TargetState.READY); + return readyState; + } + }; + + /** + * 获取target的renderer函数 + * + * @return {function(Object):string} renderer函数 + */ + TargetCommand.prototype.getRenderer = function () { + if (this.renderer) { + return this.renderer; + } + + if (this.isReady()) { + // console.log(this.name + ' ------------------'); + // console.log(RENDERER_BODY_START + RENDER_STRING_DECLATION + // + this.getRendererBody() + // + RENDER_STRING_RETURN); + + /* jshint -W054 */ + var realRenderer = new Function( + 'data', + 'engine', + [RENDERER_BODY_START, RENDER_STRING_DECLATION, this.getRendererBody(), RENDER_STRING_RETURN].join('\n') + ); + /* jshint +W054 */ + + var engine = this.engine; + this.renderer = function (data) { + return realRenderer(data, engine); + }; + + return this.renderer; + } + + return null; + }; + + /** + * 将target节点对象添加到语法分析环境中 + * + * @inner + * @param {TargetCommand} target target节点对象 + * @param {Object} context 语法分析环境对象 + */ + function addTargetToContext(target, context) { + context.target = target; + + var engine = context.engine; + var name = target.name; + + if (engine.targets[name]) { + switch (engine.options.namingConflict) { + /* jshint ignore:start */ + case 'override': + engine.targets[name] = target; + context.targets.push(name); + case 'ignore': + break; + /* jshint ignore:end */ + default: + throw new Error('[ETPL_TARGET_EXISTS]' + name); + } + } else { + engine.targets[name] = target; + context.targets.push(name); + } + } + + /** + * target节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + TargetCommand.prototype.open = function (context) { + autoCloseCommand(context); + Command.prototype.open.call(this, context); + this.state = TargetState.READING; + addTargetToContext(this, context); + }; + + /** + * Var节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + VarCommand.prototype.open = + /** + * Use节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + UseCommand.prototype.open = function (context) { + context.stack.top().addChild(this); + }; + + /** + * Block节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + BlockCommand.prototype.open = function (context) { + Command.prototype.open.call(this, context); + context.stack.find(function (node) { + return node.blocks; + }).blocks[this.name] = this; + }; + + /** + * elif节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + ElifCommand.prototype.open = function (context) { + var elseCommand = new ElseCommand(); + elseCommand.open(context); + + var ifCommand = autoCloseCommand(context, IfCommand); + ifCommand.addChild(this); + context.stack.push(this); + }; + + /** + * else节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + ElseCommand.prototype.open = function (context) { + var ifCommand = autoCloseCommand(context, IfCommand); + ifCommand.addChild(this); + context.stack.push(this); + }; + + /** + * import节点open,解析开始 + * + * @param {Object} context 语法分析环境对象 + */ + ImportCommand.prototype.open = function (context) { + this.parent = context.stack.top(); + this.target = context.target; + Command.prototype.open.call(this, context); + this.state = TargetState.READING; + }; + + /** + * 节点解析结束 + * 由于use节点无需闭合,处理时不会入栈,所以将close置为空函数 + * + * @param {Object} context 语法分析环境对象 + */ + UseCommand.prototype.close = + /** + * 节点解析结束 + * 由于var节点无需闭合,处理时不会入栈,所以将close置为空函数 + * + * @param {Object} context 语法分析环境对象 + */ + VarCommand.prototype.close = function () {}; + + /** + * 节点解析结束 + * + * @param {Object} context 语法分析环境对象 + */ + ImportCommand.prototype.close = function (context) { + Command.prototype.close.call(this, context); + this.state = TargetState.READED; + }; + + /** + * 节点闭合,解析结束 + * + * @param {Object} context 语法分析环境对象 + */ + TargetCommand.prototype.close = function (context) { + Command.prototype.close.call(this, context); + this.state = this.master ? TargetState.READED : TargetState.APPLIED; + context.target = null; + }; + + /** + * 节点自动闭合,解析结束 + * ImportCommand的自动结束逻辑为,在其开始位置后马上结束 + * 所以,其自动结束时children应赋予其所属的parent + * + * @param {Object} context 语法分析环境对象 + */ + ImportCommand.prototype.autoClose = function (context) { + // move children to parent + var parentChildren = this.parent.children; + parentChildren.push.apply(parentChildren, this.children); + this.children.length = 0; + + // move blocks to target + /* eslint-disable guard-for-in */ + for (var key in this.blocks) { + this.target.blocks[key] = this.blocks[key]; + } + /* eslint-enable guard-for-in */ + this.blocks = {}; + + // do close + this.close(context); + }; + + /** + * 节点open前的处理动作:节点不在target中时,自动创建匿名target + * + * @param {Object} context 语法分析环境对象 + */ + Command.prototype.beforeOpen = + /** + * 文本节点被添加到分析环境前的处理动作:节点不在target中时,自动创建匿名target + * + * @param {Object} context 语法分析环境对象 + */ + TextNode.prototype.beforeAdd = function (context) { + if (context.stack.bottom()) { + return; + } + + var target = new TargetCommand(generateGUID(), context.engine); + target.open(context); + }; + + /** + * 节点open前的处理动作:target 不需要自动创建target,所以清空方法 + * + * @param {Object} context 语法分析环境对象 + */ + TargetCommand.prototype.beforeOpen = function () {}; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + ImportCommand.prototype.getRendererBody = function () { + this.applyMaster(this.name); + return Command.prototype.getRendererBody.call(this); + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + UseCommand.prototype.getRendererBody = function () { + return stringFormat( + '{0}engine.render({2},{{3}}){1}', + RENDER_STRING_ADD_START, + RENDER_STRING_ADD_END, + stringLiteralize(this.name), + compileVariable(this.args, this.engine).replace(/(^|,)\s*([a-z0-9_]+)\s*=/gi, function (match, start, argName) { + return (start || '') + stringLiteralize(argName) + ':'; + }) + ); + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + VarCommand.prototype.getRendererBody = function () { + if (this.expr) { + return stringFormat('v[{0}]={1};', stringLiteralize(this.name), compileVariable(this.expr, this.engine)); + } + + return ''; + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + IfCommand.prototype.getRendererBody = function () { + return stringFormat( + 'if({0}){{1}}', + compileVariable(this.value, this.engine), + Command.prototype.getRendererBody.call(this) + ); + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + ElseCommand.prototype.getRendererBody = function () { + return stringFormat('}else{{0}', Command.prototype.getRendererBody.call(this)); + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + ForCommand.prototype.getRendererBody = function () { + return stringFormat( + /* jshint ignore:start */ + '' + + 'var {0}={1};' + + 'if({0} instanceof Array)' + + 'for (var {4}=0,{5}={0}.length;{4}<{5};{4}++){v[{2}]={4};v[{3}]={0}[{4}];{6}}' + + 'else if(typeof {0}==="object")' + + 'for(var {4} in {0}){v[{2}]={4};v[{3}]={0}[{4}];{6}}', + /* jshint ignore:end */ + generateGUID(), + compileVariable(this.list, this.engine), + stringLiteralize(this.index || generateGUID()), + stringLiteralize(this.item), + generateGUID(), + generateGUID(), + Command.prototype.getRendererBody.call(this) + ); + }; + + /** + * 获取renderer body的生成代码 + * + * @return {string} 生成代码 + */ + FilterCommand.prototype.getRendererBody = function () { + var args = this.args; + return stringFormat( + '{2}fs[{5}]((function(){{0}{4}{1}})(){6}){3}', + RENDER_STRING_DECLATION, + RENDER_STRING_RETURN, + RENDER_STRING_ADD_START, + RENDER_STRING_ADD_END, + Command.prototype.getRendererBody.call(this), + stringLiteralize(this.name), + args ? ',' + compileVariable(args, this.engine) : '' + ); + }; + + /** + * 添加命令类型 + * + * @inner + * @param {Engine} engine etpl引擎 + * @param {string} name 命令名称 + * @param {Function} Type 处理命令用到的类 + */ + function addCommandType(engine, name, Type) { + engine.commandTypes[name] = Type; + Type.prototype.type = name; + } + + /** + * etpl引擎类 + * + * @constructor + * @param {Object=} options 引擎参数 + * @param {string=} options.commandOpen 命令语法起始串 + * @param {string=} options.commandClose 命令语法结束串 + * @param {string=} options.variableOpen 变量语法起始串 + * @param {string=} options.variableClose 变量语法结束串 + * @param {string=} options.defaultFilter 默认变量替换的filter + * @param {boolean=} options.strip 是否清除命令标签前后的空白字符 + * @param {string=} options.namingConflict target名字冲突时的处理策略 + * @param {string=} options.missTarget target不存在时的处理策略 + */ + function Engine(options) { + this.options = { + commandOpen: '', + commandSyntax: /^\s*(\/)?([a-z]*)\s*(?::([\s\S]*))?$/, + variableOpen: '${', + variableClose: '}', + defaultFilter: 'html' + }; + + this.commandTypes = {}; + addCommandType(this, 'target', TargetCommand); + addCommandType(this, 'block', BlockCommand); + addCommandType(this, 'import', ImportCommand); + addCommandType(this, 'use', UseCommand); + addCommandType(this, 'var', VarCommand); + addCommandType(this, 'for', ForCommand); + addCommandType(this, 'if', IfCommand); + addCommandType(this, 'elif', ElifCommand); + addCommandType(this, 'else', ElseCommand); + addCommandType(this, 'filter', FilterCommand); + + this.config(options); + this.targets = {}; + this.filters = extend({}, DEFAULT_FILTERS); + } + + /** + * 配置引擎参数,设置的参数将被合并到现有参数中 + * + * @param {Object} options 参数对象 + * @param {string=} options.commandOpen 命令语法起始串 + * @param {string=} options.commandClose 命令语法结束串 + * @param {string=} options.variableOpen 变量语法起始串 + * @param {string=} options.variableClose 变量语法结束串 + * @param {string=} options.defaultFilter 默认变量替换的filter + * @param {boolean=} options.strip 是否清除命令标签前后的空白字符 + * @param {string=} options.namingConflict target名字冲突时的处理策略 + * @param {string=} options.missTarget target不存在时的处理策略 + */ + Engine.prototype.config = function (options) { + extend(this.options, options); + }; + + /** + * 解析模板并编译,返回第一个target编译后的renderer函数。 + * + * @param {string} source 模板源代码 + * @return {function(Object):string} renderer函数 + */ + Engine.prototype.compile = + /** + * 解析模板并编译,返回第一个target编译后的renderer函数。 + * 该方法的存在为了兼容老模板引擎 + * + * @param {string} source 模板源代码 + * @return {function(Object):string} renderer函数 + */ + Engine.prototype.parse = function (source) { + /* jshint -W054 */ + var renderer = new Function('return ""'); + /* jshint +W054 */ + + if (source) { + var parseInfo = parseSource(source, this); + var targetNames = parseInfo.targets; + + if (targetNames.length) { + renderer = this.targets[targetNames[0]].getRenderer(); + } + } + + return renderer; + }; + + /** + * 根据target名称获取编译后的renderer函数 + * + * @param {string} name target名称 + * @return {function(Object):string} renderer函数 + */ + Engine.prototype.getRenderer = function (name) { + var target = this.targets[name]; + if (!target) { + console.log(name); + } + if (target) { + return target.getRenderer(); + } + }; + + /** + * 执行模板渲染,返回渲染后的字符串。 + * + * @param {string} name target名称 + * @param {Object=} data 模板数据。 + * 可以是plain object, + * 也可以是带有 {string}get({string}name) 方法的对象 + * @return {string} 渲染结果 + */ + Engine.prototype.render = function (name, data) { + var renderer = this.getRenderer(name); + if (renderer) { + return renderer(data); + } + + return ''; + }; + + /** + * 增加命令 + * + * @param {string} name 命令名称 + * @param {Object|Function} command 命令对象或命令类 + */ + Engine.prototype.addCommand = function (name, command) { + var CommandType = command; + if ('function' !== typeof CommandType) { + CommandType = function (value, engine) { + Command.call(this, value, engine); + }; + + CommandType.prototype = command; + } + + inherits(CommandType, Command); + addCommandType(this, name, CommandType); + }; + + /** + * 增加过滤器 + * + * @param {string} name 过滤器名称 + * @param {Function} filter 过滤函数 + */ + Engine.prototype.addFilter = function (name, filter) { + if ('function' === typeof filter) { + this.filters[name] = filter; + } + }; + + /** + * 解析源代码 + * + * @inner + * @param {string} source 模板源代码 + * @param {Engine} engine 引擎实例 + * @return {Array} target名称列表 + */ + function parseSource(source, engine) { + var commandOpen = engine.options.commandOpen; + var commandClose = engine.options.commandClose; + var commandSyntax = engine.options.commandSyntax; + + var stack = new Stack(); + var analyseContext = { + engine: engine, + targets: [], + stack: stack, + target: null, + deps: {} + }; + + // text节点内容缓冲区,用于合并多text + var textBuf = []; + + /** + * 将缓冲区中的text节点内容写入 + * + * @inner + */ + function flushTextBuf() { + var text; + if (textBuf.length > 0 && (text = textBuf.join(''))) { + var textNode = new TextNode(text, engine); + textNode.beforeAdd(analyseContext); + + stack.top().addChild(textNode); + textBuf = []; + + if (engine.options.strip && analyseContext.current instanceof Command) { + textNode.value = text.replace(/^[\x20\t\r]*\n/, ''); + } + analyseContext.current = textNode; + } + } + + var NodeType; + + parseTextBlock( + source, + commandOpen, + commandClose, + 0, + + function (text) { + // 内文本的处理函数 + var match = commandSyntax.exec(text); + var nodeName; + + // 符合command规则,并且存在相应的Command类,说明是合法有含义的Command + // 否则,为不具有command含义的普通文本 + if ( + match && + (nodeName = match[2] || 'target') && + (NodeType = engine.commandTypes[nodeName.toLowerCase()]) && + typeof NodeType === 'function' + ) { + // 先将缓冲区中的text节点内容写入 + flushTextBuf(); + + var currentNode = analyseContext.current; + if (engine.options.strip && currentNode instanceof TextNode) { + currentNode.value = currentNode.value.replace(/\r?\n[\x20\t]*$/, '\n'); + } + + if (match[1]) { + currentNode = autoCloseCommand(analyseContext, NodeType); + } else { + currentNode = new NodeType(match[3], engine); + + if ('function' === typeof currentNode.init) { + currentNode.init(analyseContext); + } + + currentNode.beforeOpen(analyseContext); + currentNode.open(analyseContext); + } + + analyseContext.current = currentNode; + } else if (!/^\s*\/\//.test(text)) { + // 如果不是模板注释,则作为普通文本,写入缓冲区 + textBuf.push(commandOpen, text, commandClose); + } + + NodeType = null; + }, + + function (text) { + // 外,普通文本的处理函数 + // 普通文本直接写入缓冲区 + textBuf.push(text); + } + ); + + flushTextBuf(); // 将缓冲区中的text节点内容写入 + autoCloseCommand(analyseContext); + + var deps = []; + for (var key in analyseContext.deps) { + deps.push(key); + } + + return { + targets: analyseContext.targets, + deps: deps + }; + } + + // export object + var etpl = new Engine(); + etpl.Engine = Engine; + etpl.version = '3.2.0'; + etpl.Command = Command; + etpl.util = { + inherits: inherits, + stringFormat: stringFormat, + stringLiteralize: stringLiteralize, + compileVariable: compileVariable, + parseSource: parseSource + }; + etpl.TextNode = TextNode; + + if (typeof exports === 'object' && typeof module === 'object') { + // For CommonJS + exports = module.exports = etpl; + } else if (typeof define === 'function' && define.amd) { + // For AMD + define(etpl); + } else { + // For + diff --git a/packages/vstory/demo/src/App.tsx b/packages/vstory/demo/src/App.tsx new file mode 100644 index 0000000..dd3885b --- /dev/null +++ b/packages/vstory/demo/src/App.tsx @@ -0,0 +1,88 @@ +import React, { useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import { SimpleBar } from './demos/SimpleBar'; +import { RankingBar } from './demos/RankingBar'; +import { StoryBarDemo } from './demos/StoryBarDemo'; +import { StorySceneDemo } from './demos/StoryScene'; +import { AreaWithTag } from './demos/AreaWithTag'; +import { StoryLineDemo } from './demos/StoryLineDemo'; +import { useLocalStorage } from './hooks/useLocalStorage'; +import { StoryPieDemo } from './demos/StoryPieDemo'; +import { GraphicActionDemo } from './demos/graphicAction'; +import { VChartSiteDemo } from './demos/VChartSite/VChartSite'; +import { DisAppear } from './demos/DisAppear'; +import { StoryEdit } from './demos/StoryEdit'; +import { Appear } from './demos/Appear'; + +const App = () => { + const [activeIndex, setActiveIndex] = useLocalStorage('menuIndex', 0); + const menus = [ + { + name: 'SimpleBar', + component: SimpleBar + }, + { + name: 'RankingBar', + component: RankingBar + }, + { + name: 'Bar', + component: StoryBarDemo + }, + { + name: 'Line', + component: StoryLineDemo + }, + { + name: 'Pie', + component: StoryPieDemo + }, + { + name: 'StoryScene', + component: StorySceneDemo + }, + { + name: 'AreaWithTag', + component: AreaWithTag + }, + { + name: 'DisAppear', + component: DisAppear + }, + { + name: 'Appear', + component: Appear + }, + { + name: 'Graphic-Action', + component: GraphicActionDemo + }, + { + name: 'VChart-Site', + component: VChartSiteDemo + }, + { + name: 'StoryEdit', + component: StoryEdit + } + ]; + const selectedMenu = menus[activeIndex ?? menus.length - 1]; + + return ( +
+
+ {menus.map((menu, index) => ( +
setActiveIndex(index)} style={{ color: 'blueviolet' }}> + +
+ ))} +
+ +
+ +
+
+ ); +}; + +createRoot(document.getElementById('root') as HTMLElement).render(); diff --git a/packages/vstory/demo/src/assets/scene3/chart-1.png b/packages/vstory/demo/src/assets/scene3/chart-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b848e43015ee5629a90eb46d955a50d6de13e05d GIT binary patch literal 51004 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

@7L2 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/chart-2.png b/packages/vstory/demo/src/assets/scene3/chart-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c1c506450fa2d46db31f972e13841f10cc39ba GIT binary patch literal 34007 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/chart-3.png b/packages/vstory/demo/src/assets/scene3/chart-3.png new file mode 100644 index 0000000000000000000000000000000000000000..358a996e63519be75fb45a0500bb3e258fcd173f GIT binary patch literal 43600 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

  • 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%0D{W{O3i-QEQ+tj7!+=7W$ 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 MR!s&dWfA^=0F#WwbN~PV literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/chart-5-empty.png b/packages/vstory/demo/src/assets/scene3/chart-5-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa11a5bf90b5a07606341544498a2e832d05f7c GIT binary patch literal 29011 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 T>RVgBL_VHq=srTI*@XNL#u`3j literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/decoration.png b/packages/vstory/demo/src/assets/scene3/decoration.png new file mode 100644 index 0000000000000000000000000000000000000000..465ff8fa606733eabdb312ef92d70006465defe4 GIT binary patch literal 19444 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/text-zh.png b/packages/vstory/demo/src/assets/scene3/text-zh.png new file mode 100644 index 0000000000000000000000000000000000000000..d63efb42f5709420478b72d7dac8c0ae70850b4f GIT binary patch literal 40838 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene3/title-image.png b/packages/vstory/demo/src/assets/scene3/title-image.png new file mode 100644 index 0000000000000000000000000000000000000000..a4031efd563b07cf860adee9b0a0b6ac4edfb34a GIT binary patch literal 398177 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 z%0A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 _~nNU1-tQ|^7z%0FWS3WWot6iEd~ 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

    oB7tedP8{%YJ7K*_SKSFM>FLA~JQH6zIStEX8aJ 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

    01xQ?q3rCS4k6l|$n)cAc4B3hh3iohIy| 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene4/bg-decoration.png b/packages/vstory/demo/src/assets/scene4/bg-decoration.png new file mode 100644 index 0000000000000000000000000000000000000000..d11522491a4daf4a106c3b2fde3d32d2da5b9110 GIT binary patch literal 49181 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�}JZ!=1`Kz5;>5v&N%vlXYV`y}o@spghLP?>^U+^k4VHl%ya8TcJ&e|H2sil_Eq4vb>H8%`y zU@{S`PDpP>n|E)hV^{C|1Q!HCUUG zZDFS2j6|*0N*xQ)r{#s)9@i~qmlOWIHI6FLZF}z*T&>8J`=uKt0kf-d`2KILA

    R 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

    |c0U#Ag6=7wH&} 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 eHqb>}M5Q}4o;Ho#bY;*` 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�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 AP5=M^ literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene4/decoration.png b/packages/vstory/demo/src/assets/scene4/decoration.png new file mode 100644 index 0000000000000000000000000000000000000000..8263511508522177ab21791012e1aa740c165d01 GIT binary patch literal 6001 zcmeHLdsLI>9S$O(F~Y2%1i8#QTWop?21P3(wrUm6hPMicRX~?u%V=1Ui&Z|X9;Br~ z&Ng*ki}sANm8)f(RA3F55>^VrT#dC}0;I(YXu>EG$(Llm-}`=F5_|eb`^R>AcJ>EH z-|xNsuFvzld1rmx>Z!s2p+F#*8oOrYMuEU>IsAP($rHY;IY07i_-AtFnk`uZ!Hl{1 z=N7y17bf`VmbG#9i-MXrFP*}sdI$tFJ!4nC@N%Bp{hNIyb5$o^ z>YJl+3!QlAtn$W*p{|v}SaImY!tnGxUxaRK&JIiO+5GjpOMJo$X4HJMWBa}|uaBaw z(@j(7KAIex+@HMWa!J0$k|1WU+AGEf=9{~^?bcC?UeErvw>sHo8SFl&uzqt@t$s9O zvg@{4V3XRWu_s3W`FjBmlY*8X5S~X?@kGN{#nD-#%GumLHQua@+WMd9sDaJxmZ zEr^(#K(;kXnF91`DCpQQ?7L_7Lvzx|+{tO=N*fpihioBMzrXBRgUYV!beIY=oIfLV zO8tl`{_PNSTK{3PR?)>-`ktEiXK9txT)T(?i%2+rhvBHC|G$$eR_l%qTRb2(JHCc^ zfHBs0Fdz>wIC55W_S?4YU}kz(u^t1s!$`klpz?AcXbYoA2v{&AIlYkFy&(kFS3g1g zSmyJ&xgoxon1`{CtZei7${wmz>+Iz}8{JjvuD2EsTXyHLKR4X5$^?eM=!a?+zpP?g zG;90fQV)B}*~o-8pQTm44}1syo}yJ`$+)SPyds!Wm4>lLdyT2p-DfT;MX)r&aGMO8 zXLXu0A$f`OZp`bfZ&m8$V0qEei)Svf zS>XoNmbpxCYI$Zw_$XXg4^=@dS%%kL>Gukb7v>5_s>fxlPDzhY4qvYdh%wb|{CLyx zZaA%R*xg4`7*+VZG_lourKXs>=uV1V*dC(N0p^G|U);*ZBlMRFn7w$ajZBPfD3l#un|2-CWoTaSZ-ewRu@{9Ak<962|ox4pLr0xdZmLVZ5; z-2OQbt@w|hqTv!1xhIA*4HvVACFD}gIl&A(HG{R0M2ip6`DXK;#KEiz(F(U`{nbgS zaV$GM#XGmd6uBQy?|e7870W`r-LnqDU3h`!T=wPE6v(1*ghsW)w1BLxn&z+tH&;z} z47G|)i4xARZGsYgZs8~`u@2L>>-Nh`I}KNtaCsK3vx|EtLHwU|tY7V~)@|l)UL3gG zB{yPkj~>hbsV14f_gQFRWm!?fvfPevUs!n3PfhZU{y;h+xFf^dcd<$Jobh$DU}4g1 zZfYG)ab*Qzh6DMkf(S#OB+-HqzvpS1Z$6K}rlfTy-R-td#Oy-6bb1PwTUD31de-y_ z0&sX(-_554$2D*3jdYv|k+E$}Xy?2Up2g!k%vRF0(&njT3^hW_dfQP2$#Gn@-4u^v;A`?6@la9a^0$X2L;STZkJ4$69?#k_U?& zJ_e>b`s7F-7@Uj-9zax)270`lRPWP}f6H<#Kju)#wH4L04zl>D#HYOze;a%&BWJkzZ&!dgH{m zJaHcvP?8HCU8O@f#fMY#PY6TT53+gzGf2UMBxvg*XZ-^n-2agCF3=lWuf{fQLU6oi zZbxP)w%)1HkxjhK(B>Ju2c+pU2G(5~sgpuVRM_NS0mG6wHH+{h-iOphc+gg7A0T{e z<`U84f$cAG3HSA?8P4uDHu-VM?C~(E+(Txmb->(60J1w17I&B%_*7_ouwQwuAPoV; zTv=djh$OB+AxM~D-S~}p8muj-U+UF4tfeY*{(q)?`d$^pc*Z;j_}6#CQA4ahOCXQO zxE_zpm56y)t*btwkzY(e?-h$`*WN@iSWFQ%{PyZec?4256jHZ4d_VvWf0|JnkanR7 z2tYT3o^nZtFv|f;Er|F7e2Kj(m;&&gILA>HWcajWSfc-+F5ab6jKV=KU43`U1fTb| zYiqM}xcT>N5iQeT%*hXE^TXjpEg|c7WG;rT%a*bCRDbV_zL*jW7e+{_MbN!&nIA0O~+#tKyRPo< zDc!*PCc#;P7%td$$$_kdbat9f)jNQq#~fWS2)p=7pzIQSP=A`QhUfN|B1ClgIg{7{ zXw3;o0udQCuAJF*W!U0J&}1=?y6S{DhJbY{)Ttsu!W8tAej@mM0#rU(nTLFMg1_>Q zSXex(5US+WuLuc0@&_SXkGXo56Y~@|9Z(Ut0iY7z8hrNvj`9Lnw%8Zj7+H}PQ6I{% z@8EMh%V-Xbc?g%}aqc^__)ot%W1E+q<#XBnV47ybLVQbF!F#&hw6g?jIOzhRTo z99p0^)J1H?plX8WD6NVjFFn ze2&dO#03kv(IJEhH|m~olmVRa{fVe>12p~^1t^b>z%x5d8X}2HdEL@74Z%_1rWH_IXZ(5T}9QrDnDoW7@ID>>EgJqg!kex_4U66%WeAdJ6t9R4F4nFQ^s<14voyn>0qBL zT~*KnjGnLB;UaXLO!^o=<7+sF*Zkh3)f2Sc_NUgs>z0b?l?4PcW7i>tA8V@heVc-{XLF}ryl{GJ>9QZfgr=`6B literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene4/matrix.png b/packages/vstory/demo/src/assets/scene4/matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..9751585f5fde214e4e084013d240580fa2ef984b GIT binary patch literal 4970 zcmbW4eO%J#`p0c;tFs5Qtz{3QbyjmEMS-P~;pS2{-EGN|uitv( zjWYZSav7`Sc4;6E1+>}GqeZUx_)>7Z-O1S-GJAXE^} z9&J+*L?po;3v?9o(-p%l0BidKTi&I7qB?W!9 zf?)DckZ1a@m7HU_*G)xNkwhho{8d&#Q%Cmd5HdWXQg6hdLO)H{2D)7VQyCV^%A9J%kO*rr?3B5xZrFtdGhD6&{JWaMk}OYpbW%)EOT>IeVRbEPjZPq z>|m9!1+g|^lt3J7GsJ72bVZW$KC(8jM=sG})&{ZVuVCTseCcJZxYYZy<0vAeV5K#a zdXHK`hNBq)kTJFk&o=h`bNktUEocQpSYf4VjvAO>C2nze~NU zkpib;cPk?kPGdTI=7iLwj#8Imy$a%3OuyO?uGQB0l?tyEfhegn+tl`I#UcJk2TbQT z#XD7FH>mF7VA(^}C5Pr8mam6VZjwYcu_lMt;Q63nt2sM9kxBo+TAS2yg&W3<;m2fL zh4=T0#0?C^yMHT^PE!o2ntbUI=n6a^EXzH>Bc_E$69mz_dR{b{uE14H8L@nf+~*fR z-B&T;OdIO5Q=4_f?Cz~sLmYu9hL@SqSi;7%c4(p5O-;Q!KK#?_xw*Cb&iK=VE^yh0 zD$9oWCG6%M_*^4KH~dR>W9Xv-oz69yso@j!{0RcJ^2jc05#j9R%`Yzs?b}%l%wAsj zptz0c*h05#jo&9C9w^JWYM2u?5^jwl($G~wQ2ckqW<1xgjafxy8wQ2B1i!2TPYK!J zffuw2l2r*4KBlz7?RTzaMj5wEI4tpK+ehj0?>K6;5(Fu9`3PvHo4t zA@n4ePH93xm`(_D&vT@m{E@v9DlVi1hDX_n^j%QA zMs6O<1QrV%Nsgng2!{&ArQU~|jD8LIglob};J%Z z>TH%1Ek^AsMSImY_UwOd^wG%8=jpQbt=Z=t!~;c56^2bG51wFQf8G^UtKyGrq<2OF zB!BG8DY$;0wsGooS-r1%c>cY7%|?=p@kAVv>qJ}X9?bt$oyJ2Y7KLjWbRNZd(()3s zmA8F%rER}vnM&4|ssZ4>JYN50{SXJ9j*4!p4Y5rQG$vL`sm}kyo8t55VU`Ym*)*}7 zpWvO9SZj1=*Y>Lpi7glwk?x_GKNiLe=gDTj&k8;pqwtau<>sDS!ZK$mLs1w)Y+L$z zvbZfQ1@#EI4}eKQ0O3b4W^2X>%zcd2c)>|ocoD(3`(t$-h%ov}D+51FhL3x>7@Bjx zkq-*QQ|c_!qB_e|v<8j$@ue6zvGhP31E>+t1TYj3%J^M4$%UP2*YJvab$LH_EcIWZ z)D!%QrcWRML}yzs#4-C3zDB)T2y2>(c0W4PtvA|3EBh8HCOID$gp;kWK_(dnz3Q7g zBjrT-hXXs*CITn*9kFG{>`z?J8&gMZNYzy&zb}V1`-yPbOlmFne6%hCB4BNNMD zGxugPKd{=Ihbs)vN=zSNx*}x^X!2R;?fcysEZbU)*Etv^l{4n@PU9`t-42!GTm_e0 zK~MlXQSodzWg zhMq${uO;5gA1X>P7qBQrs-^wlp=){rJNX%S4EZq(iyJY)FP_PoemFct~tuWsk*@@iJFt; zoSHO&S!h2k#_nbMK1>t2%O2UjXllzBN;zLTTW-6vo2S+DGXvg?0qh=YR2U?U=m+7+ zB0BEQ=;hnQ7TX@9lM^bvu=!L%J&)<2XtLf*&kWO*};TlfsVx39C;foEGRv}XTb}P^ouVdI@X9l60#>IcjDm`;n7cC zOQ}(H&IhhvvIFuh8Oe^o31@nBcZ5t@&#MA%Ls#N({=vkczw4NePgu{9l_P^fpM9`C zQ>LDvxyaq*%(UE&}H# zf)9$z=4AOCpYXa<$K?k@_DZ~d7>kdY_X)g6XB*DoGR`|%9*CO^(Ph$u-Bi~9qYxxH z?AIIt)H1hNn686IGXQgfxb$9(Hhh7a{|5s{MqWrB@HR%_=(&w0`IarvG!ivzGhpb+ zPiEB4U~LSax+}CG1X?8ElHJ(15+2RIQyGUn5K-5f(^Tx}ua|k#AZ-R~w#z^N{ZXK56YJWySI31_dgC4}x)^+an_k=(Kp_H6K?;{wWsq_3GR zs9?`}Sw)jCRA0W9IPKMApfYs`kvPeE>n?iWdh2nGaq?p{V+Vwx14t_^$K!M5nhfdg z&dBn872nOxQ-O$4V4M9PZBtWPd&3$3%trBGHDumd~Q+}+x6Bp6y7^4Z-+8GFQG>I z((6|;i+kA-1cj`l)zzAV*?Prdnym_W$m-&cJR&pJHJYObXB2~R*91)xWYll=B87)h z*;j>3IG?7+SKK7&fUz(2f{~7wDeAGa$ds!-*MB%K0O$&XK1XXY=*B zFl%nSQ%ckFS1?3(b!9lvaXJ0qv*(DDV)AsN82*6V_wNCLkMXK*~Fmw$I z`>va=C5m`+2c9(w17!E|s7ZO>PH#VrB;{4z$iK#}S+>n-#UXN!4mRGhQm@UnEo`B8 z_PqF>Yc3U~7BcA|-Z}vWTQ(ZHU)rV|STM7;RlX1w$Bl(f0V!>=XosG7D5 z@^=KT-5G|2p=rjWP&w#lCIj(P(PXySUh5L+^r`YvHvoFdK5Ku?7sOy)=Det;foR@f<8n%W#1f;+{+d; zx%OswTLqH=cx|=%)zsYxEd!JgF4rf$Pdg@(+tvVE21BLkeM5crNz%RpCXtRk)n{@x zNIYgt-ZiFAdRm?HyP#?GVG}@P)0j6+dDwOM-y<`9i#Z9QX~9U^jj9>_*Y4ud2B!t9 zat-^S0Vd78PkI-#GEzG0+zO%N zWz*pi{1H%ZKT5VPvQlN|2m#8bfJ@BP4t4~$;Uqz$81NI~WSHW}?fTTRJ&U#wI0bO&E(wt)H$VNfN$==2iakkPjC^Sy~7qDAt*}w{+ zds;E7$Qc!9@&rgh+Z_cWg)5#!<7HXnp8N#ZLX*UUOhV!q^+(d5DTLQJF9TU0hI!vm zRTiRG@aI=cP%aONqk&fyygVW7j?%(FgedNp^XHS!oY#si{!mDq@yw2b)%DGQMu+u6 zUKL4@stE&~ahBzvg>$DPlw2{`RXOql(PY2`#Al(ca23g83ixq|=e4MQL7#x)WT$iiVWqgRQJz&T67d9Halg@wX3 zhW~lpz#D&XRkTkMf9qVT2DD6IoyN(h1C6g*OT2*<)6dPI@TtXIa~f-Yx7n2;7)WuP zvY#{IDr${9T*$>ZJzpB%pZCoIMHBEcNyDePwy?r`8yNX0C{-gzEH-G>1Qovzt7h^i zgtS;c8hg=?l#>Rl55Sy#JEOSEW|OY#fAIm9=0MS61y>Dw8ZjbjUd6@5x|pFJuxy7a zsD12d1la6x1O#?LM6K>dM%hw12A~YZ;14EJiXGuF=dQ4}aQ4&Wcs-@jY+n^Hwdkn_ecIX!Fg| zaB_9Ky|SD{=y`L_$Zege+ooG?){V}`_9OR!E`6eDusyL-mOl~13I;%ZpU9{juuu03 z%h)Kql&-qUC?d+SY`Xv$ac&)~FRbX;Cq1 zZ$U&5d&G#9(nr5m^YTQ5I)c60Zl@v`r;hq{+42l&@6zFc+D zd7^XaQgtH3xg+(ZOF+*@`Z^YYm$%wlzV55k5YHMWuWIo1b24Uc{rl?S99f(5BBf#z zRx200EX@j`mT}M-wHng05>`XMXsAt#8L*t#@^IPNeyPuNpOyCWH?Ak{1Bc2$ zRbc3kGe8ntD<5rgVNR(!NvrW4`jz~gY|1G7qdQdKDwb3@oDe3$f~Kuua1vsU38V)F zOWAVq+6f(5dT5?hnxj)l_S?1Y1T>~2L~koN%F=)4{E&@gzes-^J11SlcX9|iqm3*~ z7QBDfu=Q{UAh|Pf<~0uo%){yTcaPzu4`>+8sz8K!zQXJfCA>11zTI}r3*EpS_Ig{q z?kIjFxj*FZxj1p)0nEQ$oE!<41)k71%+Z9)(=g#{lTDxNb?Y1zIPsNgjiZm`Y$x0E zmU3US%k{I*9L*v@7$9%hf_l^PN#u>Zy2@jo3ZXyTb^E_`e^RV`pHCql6K~b5VPCu( z2t1bd=>_l~Y#7cqab2O=Hbzz0={$GMxkuTIwAIO>9SMTMA$p|a*NM+n2A*d>xjrvL zZzrJS-M|b(&vYs42y%K(s&F?3EoRbT?pNm13sLckE7^D7khrEd)a{@Hsl#$srqDMy zc-iE$3~{`9^F*&WUqH+;%~7_6AMOeXU#7 z?6+vby|vvK8%&F;ZmU}ActAhiF{9RrE=+dFx7Xm*E{@NjUJpsy#>A0BwB&QUe*G+c zz8JV(u4*Srq1jrdgnesEYy2pjoq_7EzOa=7kd@ld@<$-Ns!QpUAD}#WG)@nV!ePWiEF-&-ff9yZTHZ9 ziPkEO+Ki&_lbXXHGyHW32lAf$EX~`>6>KFbUOUsc=zdj)`%@PPxn#;Z&+fOkq8Oo8 zz~C@>{7odD=n{|LXl;r4T$j$XWyc^~sAs`4d2yTVrwJ+eayqj5ApU3r=LO^hKc zvWvIv$*#gRoA`f;X5PT%anIn+K6~N$F7>2G9djVI*ufJS?B-*r<6ZZ#!=%)zD zx_8H=R&1Q}c$rmtANRJzR`>f7f5=~EAu2+f$cQ9Bxp3UA@!a#SDfcC<8GB_>&mV&( ze_m+`yNrZg3yvlC0WEIk=n$O^-zD8%F(hO`1E>hZf?j^sFrLxNdl~2=`_CMG(!_7Y z)Xf+Gy~D0WGZSw#@_8nPx231(%h|0*oQoiC1b3g)qC9Vn=1%u z7)}wll3-sBV43tM{(&DXf=SFrnc-*f937-qeLs$;k|oc~AEBIWH)?+pidkNfzj}yM zsE2M$o`o}p263Lg>s>1}uwvPM3KvL?Jn&>73J|R4?_}-uUh0J?r2V?X9#hy_QwDi- zMEj3nLumPov4n~xx&g3}Sd9wgpDhH~zlN{VbsQK4-#r0-Mm_@@7CD~yC+{+4Z)@gj z2tK)q(EV9hu0gA+C4p^Nixp=l619pu;J0Ss-Z-qUs0rs%ZG7ib6HC+g4c8HmkI z<}nZ~RR!oP`W5EG;5Gr78N8JyV-MA<_fYkEQcEDHZiB32vz>vUrweZf%Mp>@&Tipg zrr53nazlLFO2N(|Sv6`QFg}ov+wXAY^7j54cT-C#--MVv>u)WtPwmxy8is5mAFyHq z!LI*~_i?gQ9H%PFAILU)q`iL$8OYyGQgVrziiaN%{lk_wkat<^EPsKtxBz?5!w_zD*iM%;FeuS2wGO!k8sr?Nres`T5Vp^S+g zP1XjzW~&JbD{PP;rqj@ep2n=3=9@{82TMG5!8%CNp5L{R&7r)25X)6L_47UMgniT1 zuwK1C^-tVFB&35?RT!Hg+EIef?L!0TUYx5a#)PCYRbic&&on$t39hQ1P%pi>y^BQ`NV)5Wy01stjeTQtmuC_2qgaF@_h{5hm| ztW^U$y6g)8uDUKtO4rIBhv|fT{4oT&#vWm{YHF_?Whfw3Ri3FRD3yv~cEp2*^M30w zj%+>U9O3&17*^n2Ze}++K>Ne$X6b{({<;9$Yf29Kt4j@ecyW7&cQy+J2=9iX<<6%* z+!+$0t^0dhgT0e3XF%#&6_&BK8qBeX^UX_2ZsMDwDG+!X9Ts)+YNPwG3c3qq3QWKo zk{Omj;}&jy8~o^VX?+n+0vxNx-lgswj-#KWc7-+0pOPw)(`Cl3Xx3EXbNX-b2;Mz8 zwt5@FG2+|J!I9nesRwMB>J^St2j5ALV#$+V2;`iNv4K|V{oPBCX_ab(+uZIYpk~!m z9zK2pZB39;6~NqF{KYi=XBsBYlAaF7~_m++~sZq{VIOa^f2P$^cEt%-iTW zE6c9T`L~^TZ4(qwHN(sEJPw8$QDH;u_S%ZbSe5sq>Pid*!!%K+6Ag5}`A^|(5jsH# z$(%Z|FFT5kn)WNNqRA^JS0w%LeA;UdQB2J$p8s04ELh$*tY6uqHeQDLiv2LuMs%dT z=IVT&tg76c0E(lpd}_h!e}CRFv8UR2NoUWv$OBLjv$WG^M(x-q4Efi1h9zcZ{Mvqg zlbI*XEqGY~*YkBS`loO|tH8B01E%N{pPJ%tLzCcmu!J9%M}bZi?UDmEc$=m(X06?v zRa~DIs{rhb5O=T!NU~@fb(0Fh10DIemr#!~bJwdSIv-6#f!Nww_3K@yr3ymIkxzu( z;~esNmzFCQx?I;gZDC5)KObu&Ah88Wl^R5_ha>-Mvk8~V!5b*OAhTfU1LxRjO>My= zwsDY}d?G8=q``)6_L;8ztV-FD^t8e9-$!Z-dIuU-Ch;}eK58_$<)wqfm^w0@6nn&) z@s#A$t==DOUdX1EeyZO0JkVvPD%n%+C469RB6Ex%&0EXv#4`Gh0|$|Q<`cN%TzNQ7 z`IP+p+9XMEKR+2>^-qiddY$Cy3&m|d;x^^%{qikE;o$cZ zhU6&q?lZ}I&YP_3Y|9}236i+7LLytf6$~R(zw7YA)+FjOj=tdaTj{p~ERYXR9`IEq z1H-OT^r%i0XYbj#`z;&g*uAz~h3l|KL{X4`gHF_r2T2=x?}UNlfv8fsQY~_%<%=xg zL`kJ&Ad;Gb=Pvgh&4(1Q)Kk~T>@2v}$$jAM+erovN|^iTe_aTx)at0#jZ8m%?-dq? z>#36}0)b^!dP?DENlp|iN=d=(1Bi5H%?G{rB<2fL?|&=qK($T(R25RFoD z{IPJ%(YQtagew5=ibW!)VsJcuRjkj>7BN_1vQCD zOmou|IhQb(#I;nv`ah~R-&_4MB2YXszbC~;-nMvohZ6#jJ0Yl(Mwf7JeQKn z3&L=Xu+xv4H43`sfA-aJxmP;8_E;QpV>v@to%0-1sI|ZCg`q_Y;&0i8oHBU*@Qtq% z8S?geUfAe#K>nB*qf6O(HVI1Fh|>C)w$n`x>ox6nxTC-PsJn12@~X+HhR)ED6X<-5Z1m` z{W}P-?BgjooY(M{Pq{0~Ugwq}TRkz4;gecJiO0b$S*R}Yi|UU6=P>s;C}9fMJk=q| zUVvSHfO-}gojNduVOnVs^_EW3{){dDJ4rtm^_#@bM1uz=`tLooTIZadV@4JR_k}=5 z<*pMOA*G4Rv-e(m?a^<`Xw28WD(I=y)tER|G3Ircy!*$!&L`R2s+qbaJh-qRJnP|# z`qR|#gFuJq(fqVE(`=K->s5cq*Jn?4>vc5nLsJFp!t@oCb`xB6b`7L>1+u0Mgpf44 zsxvb^nGN4G|E|#?`rA?A_lFfm#ByoZkh;Nqt$z-^V`H^o#1=CqJP2wTMdQ%Q`<^*68hf6H_O zbk>n$(UqCoU^T&E-YdCIN;7n@N+&ZwiZ6v}B}g{rMC{m<0h=u=ZF`S*OEer{XNEoU zJab>TF~-}#F#ge`?%atos_!D7+XRw+((2a`VenJPuiXV8YzOr}-#ae%=54|J?nmj( zgMQyNu4ahMw-vIllTO_zOGv_6H~tga)t+jXd0aNP1LiL`(lb$t`~FAC=I>p*ixAZx z*{=FEW^E+3JSu^{ovUypJtJDE~$}*4F)@9W?LTqH>^R!m*3de&Dov23CfeoK2wmT}x z)0}T4?Iz{%u}u3>$=E#Jb+S4_B{EwwH>$YRIAPW$5D=a-A1C*O0$f3TjiK7N`u(sHjD z-p^t4;BDY$+R|63#oUoM!{+A%xp2P_W88VtzuBtufjAnwV9O4f*F6SFGSj$YAB;xt zHZY(lB9_cC>E_~7x)27V+drC&F@7$p{iLg4q{}QBs5f}MbOC?~U)bl_yL$|5s{W<+ z)cdjC*-*7L4ftr4zy;rI?Z_>pY*(^AP7>yyxbEeS+>r;B^o{SM!=hew^ z$1yCN=MFb}g+@$h=Fo$vcHk*b14~1#!TY-wnW68T!A^k*Qw)=Ef55WJn3`9i^qQfy z7pzg6{Dv4GP`)>E2dWu4@crM7ZTgo3JU=$cR>m#t2GbCBI&??BOxa1+{!sUz#;wPv z#jThEyV;KZaiU@0qb*gq(6w!-j0wJ^eAo-BbsC!>Ip$x*N@3)U(t5?K2O3vV?P_*T zvR~Tc*BlpA_TM=RW@uE{Iy2=fGF46Xsyia@439TuhWL5((lr%abRA9@^!6-n-V6V9 znvQvsQ#dwIW&cH+24|)diXyBpYjhr^hdcn7=FMy?6EKn5N0m`(JnH_hf%lZX?)g_i zaghu~A1w;c`XAHBy)%FvG-N8x`UW}-QS7n2b|QW^?cJVT+t>W9mY=%AyvMS#Zpc&M zXqQi^=pQoM9HRI;Ige^R>^%-AXIZes1cv5V=)-?)j-kfzuPzhq^k$52R~k4}(r@>d z%dJj=cfM2N0x`#1WXbFJ%c#8Pi?wM*8fBr=58&dRXmO8w69pCh0Oi|_f_>5a1=^j9 z5zYD6mp989iGK_T-*1nk8mrCOh|cdgw)_yDyRxV9k`}y8555+EpvvFNOVZ9KwOJuG zR0Y&;Aaks6DU>sGLyLYO3;~&hmoqH_9|!q>*iWQVK`-A_&#QkTI?OlGS?jmmFoT1?d7+ol>tkRLI~~QT$JW>;`6enxuyu2i7Iv~aNun-L}?8c(OO!p?rJlG%MH^4vS;HwE8 zW&4@B0RsnRq9|1|Kin?O5Z7^0=zkeL;PcTm!OZOKXyZ`k%i)6fn@ zdWE%ZmTU>t2pnf;h&>T1vZ3!=xh-|qgcyI zVi2cn+tUA+A3iw=8w)WP0m$vh4{}<-9LZ)(R^rdE4fZI%nXgP5rZV9``;&YqThTua zr!qeBfh9U)mc5c3j7yUVX6J7C{PcT&Kk8s4PH4KK2&H1qyX~HAWnLz5`jP@&gwQi^ z&`+$V@1ybRF$(YUskAZbRU@JpPSp%aw;3uE_MjCHdoF>W@8bKx&=T|RslDL%2PGP? zM4ou(VMtE2!{-W%Drg4g`rZ*A6j00p*WTnlFv4bLxWo-eqA(^^#L`soX6 zWQslPf#_G}a9KTE9P*+tr(eVeeQy?SFZ|kO@jlvTn@h(}0tsmg!gsh#$(*zM{Xdcb_`eB`KL&_~4zQ=I>b~x(C2Ah#k?-z!Xdn}PYE}(% zX*@-Gn}5|)q&uAxuF!L-=!SOH*T7H9cU2NT z)&|cMiwK}!YfBw$U26!K3aduos55$&!hXx!{FOK$Nn>_~ydfQ^XQ%z|v9;0N7EGzo zGefZ_yeiw|sn`m22q%3ThmU_y8)FY4N}$!2o)c!rvp4 z9IuJ!jrTBI&-6}kBf?}n2DLwRvcl#GDPqfOfbbOJ)}?1}Z|<7^?cP;U#gH~<(&zHe zHmRc8zJ=K2>)Oz!BRMFuNwzmJNzJVEmD<66UZe%Y3=XL2d*4-6U^*DJHg(-3z=T@v zo3!2N(y z4vaTs__|otHy#cSj9qZmM&|AtqnwdmyVdg{a@Q`1ZaXckl9wPO@PpN=AovV*Wrr3P zlxM_tRVNe5w9>Y0dC`aUD%MS5RU0LL6+sD$B0>$$gA{aFBaC!oM~P1E)c@gH)|&ER z$W(}VG%~{GpHwT$s+2d3_)giHH3I$6G56jY{eSFOc$TsH-nZe}QrSuP=qnUUy){-Fw#cC1AT(kM6Yl+pV+LIJK|XEJ8#seeIaW;~ zb7v01jx=Thq6V?;DV5_ftw3DydQsy4gwf5*HvnBz!{UGhxsu7|1`)TI@}PLx2rc7jryc z@g7)MKosvAH45}lt9zTB2b&8;y}MtNv@Ln9{qQLvKxtO9E;30M3#n(%;{Zene6Jzv zZ-n9V|59$@Z(vn9DxK_C6h$~a6X|`ZpEojl2JzeRs*Bm&YG3`4-j4dne|x0R_l}wJ zjP%_)N!xVZNySj5CHf!UITnUznstG~Ip2Q@`fw`u2YZSi=`os^ZqrNkqi4J5+bixq z$|HxL91DgE^T);&zDelsmLw|z16Zur5Tclq+XEg99@hu7`V zIuF={Tnt@VYOR3BDKGwaz+vAcUpUdhuxh{JEqa3Spk%&Hg;M4I3xc`bUrl^1Ie@j2 znz~x#Key3%c%w9Y2(_T(HC$nmy7SN_W}~wegn1qMFNP3bAk6U1{ag4H>wmtJ*zf>{-W?dDbK?>M( zi*5P6FM`O$>YnM=*B(*Hm;un?9sPk9yiD~@xj}FrPutrKk*7D*o|}4m`OXvsFGEAC zKnU6c%*lZfrTq(C2+U*S)(RBNF&KMP3vfyT=IT6)?SxdUZv7uC%AK?mOxn9 zg;~9kt&qboZ*PU>8T1lAOG2H4F0eYsqW3wkiJW1SwwN5{vK>j;KIkS!V37($7odT= zAiYSV?k@GChy%Xf!1GSRA?8~tw(IE{{IN5Rkhuu&IjoWkkf<^sW;x+i3@mPhLE{^^ zTJC-E8-oJ^k-($3o@x+*H$0>oj%<6BM+rSa$#v^?y~ZK%F+g$-_aQ_%+jE;0HFdX% zxrpVbF!S2q-GcEfOPlD(fC_CUkMMmEMkT5RoV--{8OH=cZV zRWQET#4Mwp&bzC)7AmcAE2 zYk~71D1_&^A**m890%gB$KEx>q2$&&TvUVmf%pGFOiw=SofZv|1Qq*!89rF~*kY>x4VV_c zzxmhk)`H9mYqF2#)#c<@T^jJCi0@BmgIsM8LgF;rCIx8&>u?$U-|uAug9M#K~{eV=iRd{kTfmJHwL~57!+VeH`$& zs*zHvv{FR|&6O-V@8_A5LsV81Or7^DT2*Q6a%KxK@QcUO*GD4HD}_pQCvTsI=uRp) zq1#iu) z>Fw$}#MQwUymkUEkXES1(?YC?e4B9Fkj3f|Q|*J9fUlowoIzAUhV~BkcA!e3+=Fb| z%BP`mfT;4J9KA-9|HKTLX4S-OW{;sAMR-$zPzQZdYFgiF-jh1OeTpAfXL7&P&w33Ibr`K zM7sbZ*lTn~R{{ft{L@a}S~?;3q&zBU@jqJ>s7kia01eeMa5m%q;?=sN4i1<-vHSzR z^kD0}2}_kzuOWfN0z(J~1AiOa?Nf3J5I!je$LNd7fPJx<-MM zK3%GjcJmR{# z(hVH&93$`vmzbKld10-OJO_gozBW;y--nOm6M2`xDqJDyS~P2t=u-=!?Dj~_hlE4? zbJ%`6{9Hk`61%xu_7t9N>#*0_XcRH&4S7Tov@zRld?Ldku?4w(XGQ#p&h$C_i+B1V zg4L5AJ7)j8+7x4%P7s(iQ5TwO0yRY4*U+9wtaO`j@gs zaee924_xlyjm4oY5xnWWV#OF5u*OR?PEr7Sq@b$R)YL(=dW_Wz(Y{GAoHmGWMXGWg zUgB{TgM35mp{Tc*n#GNz_}&b)Wx1qCM4f4jRo!Y9PbRU)$Ax{qshqAxap^pq6{;Qf zA5bI5>C7Bk(p`?%3gwbCeLzrqb$TUDDkw1&!Mk?Z*rHoQ%lBDf2wX?Zi=S~M=Y<$E7bBybtp3eJwD?|9cJ)!k`Q9TTyfO$Bv)Hy*w5 zskdk{rcuF$@AD`ZbZ>yU$4Z23s8dN+j*PDbDo7-jK|MZvEN4M~^zBWT&nNaC2*q;|mX3F29w| zrhyTrgkE(6v1YkIQQ#*el4n&oT!WA*Wq8L!k$?)bU*RN|LI5-i{gqqIAzA>q64zSdtTO z$5s&Y7E`X1`8)R&{PPrfnPzJP2a|WRJ)cfp86Ak;8qOOVc;HN=NOcw-75f*TRwS#a zKe^4~34o0jEDUT;dhDs!`Zr_kV|wki#ReHI=zBIa>Q z9=DeO{<&)R%Bjwbvs0O7a7rpmY#FsrBn@+UGxQ4U6~7~9I{IVtmsL5o7P7!dfujIgBzO z@AEg+CSqnt0D0SKqBrw>m?g4X{+>?jcc#L|$<-qJk*P2ZGaC9Z19ZBPF^>Pxb{e86 zEUVUBcmEbHO-n>dC(5}Pj z=kfdb;gE!`GcA{3Nn_|rSI38bGxMV#@OMH$k)}n8u*67Q~7xi0{?{c%}W>T z>k2n10EO+Nv4Y)cX&?T#zbOf5r|sHCMto4Yu4LSWc5SEi3KhuLb2cL)FzR~tHgR+` zAC#exVhw#;DmKdU2jCkhWe1>MQq^wP+A(S9C9{uuRTVY!)wyi+SmqQ8xYeomSv{My zOb}9#+bq2}7jck(E1zwyg1F`5?B2-Z6BP-JXArZ}O92YsK!9|O7cjC*ixY?r1IW+2 z7sVOL?5-GK&&`5)>$Z>|gR{H&_xtbc__A0`?Q?JZ!aN)c_gZ7=9P*7S>4Bjg;>S|OdKY2@tZ>7dwE-7p2unh znrr3X3|hF=i87+TLsM;k-kSMS_=^9KT;$_vDyoTx!vAcr@43p9eyy#`sS$5_!S-d$ z=(L2lMGbx9kHroBM7Bkfx1VheLoBd@xTmfHd0I2-$rV4m5wQ2bzJndNp-iqY&BW?M zj*QJK@rqwn8(h)Ff0n;=807Rut{NhgWf^idiys=SDhPe`olwPOZ(?MMXp7&!DrYF?PktY-0dG@pI zc7dmc-e-}Ao}1(mt5hLuF3Yk81Jev*)b((e4OO_HZKXH#t)V?6K$Xq6`ve)1qdLIy zZZzWC5c4l!CG&9to$^(d_lS`%kMG_1n)SzMSo;*|#^?fU zi~B@Z%XMh|vgvHEU|L$Sjx`nkIM{mMFgU(lXCzg8# z0ItQFoKkQTxFVdww5YDBB!`H-k86Ej6i(sHhD^pNnS-8CO*(Ao+9Db4lX8QHwIgUu z1fhEuW5o=iVcVthUEcNV^FeHOfz|*+S|8-FjCFE~Bsltt6mOTa2z&U}Bujmu-KR@7 zvWf}*P%rnbGz>qY6ocDspYFO)pXAodlXk3NqjT+##7!RUlreK^Z!4CSQU3t!RLI{+ zG`}BY4j7(^m75=eceTQ^SE9c6*LJzWj^iNmSeDPUy48Xog=`MPn3@ocHb7w4x9Nn5#gwkxI>w}H;rXkQ#LgAeI zlE9_VpNk6cRcocwyDHHe-auke31XnSRu{$D9GjCgYi+!26TaB#mtg9oG+#ZLuW3*K zIC|!6E~uI7JFs%Qd*56?S0sBR=GD1+@~osyRF=3HI1@ZVT%X+6&0n)<$s_ewHmWo)Yxj+_?*uHikMg zcs*2F-7tjuS10Xrz4pM$b}pG1TliC?i~AdTx3d;h(^?)!D1_Q!VZ@Q~{>wfU}pdm4v!VsGvGIPQPv-PS6zAmYiG-J)aCb z@nQoQ6(&)-r1yB%ydtZ!`3DB@IpSi(KKACp$)~DeavK9HwSviV9b1&}gBZF5U!j=V zI_%(=gFE;eV8&id+t(EO%7JP^Bj|}JBt9gopL%WHOu+tky<+@3xP}K%Y3R&S{(ITN zCR?I|qNqc$!Kp?{RCjetCm3GF(Ix&RcUTDB1a9~+`U378I%RiLU=oZIINR*$Xs*#| zAVtnp0r&a{?@~;^J;OZr-fAD@O8!?;BNB>m(?@9dfwr-eZ0{ z=X9bSgnI06QLq8bz7DGdztPCo&fZA^bM$Roav6)0Nui*oL@@?NMdDK94CjlR@` z@}zX4;J!xdrr%!7U56+jZdl*R-2V86on7EB?8ZVPZ}QHKJ(Zx{#b5K>jneA0o#HgG zZEhkePiJ!A_->WxiRL#zx;akG11jG5voo}orT20jcZw567B?qKAgle`iB}7p?pbmSdS< z*;;-P9Mrkq?fm`5i+2}jCWIw=utFj41NtdTsT_)KO9E{yQ1n6+L-9pF1#WyE`Tkrq z`;aqp5^ugbV~A|kVJH^6wiW6rcJ{WluDU64y<5EkS|fFUf4+S-J4NVYIh33bpQ_w&ohnIosV21d+z+z{&%A@}G8a%wNv1^p zhsGK8fX8B5|1rvt@}~&%3f&D1V6k;~{0X&=>XjGy|Dkx`p4T|X1+_O}vEw}SvXlMO zFrLeP@l&lZgT)21bd*>U9|SB|EmTBASB zvw6qhyPQ8t{kwux=)3>FP(Q-GDBR|f=XLOEucXYYlZs7zgne`;;qA3{!(%3gqTl47 zUzL~QqW%}>+wv_TCs)JhOKSK?M*ulLlcx05(ArZv7h9`TZAGzJnj-z5#)0ws2w9u| zWB)Gw+#u_oi>=8C&kugylLz4cUyJxpvG{*%sZ6E(R;ruJ6}eX8xCbX?kVpX5h(x+X z=s3D~9&XjrAO9Zx@1k&H5t2U)pHl-x8K5Kk8n!6!(Y)8f_4Lk*-E|8Delp2M8Mvb{ zv2&cV4E;fr7|SXOA07rti=DdnWB2HPRDxEJMyqLQGSf@kt?WGImvg7D?@>8Qed}xJ zzaWek`QHCJ+EoJBlCu{I_D~7&4%P-Q3sA+3XNcwv!O2sD{&lnD(>A@ZMirrJ|0!TQBS{k}ZbX zQ@auXC%lc)LVj@dcf~IYwxqG=LowM#b^=CEu_OnbTM+zDiAe-^m3NT99@?nU?)a1D zVM&4q=j?g2NvDDsIMW`-5%G(6G{0zc?YbwH9zH@vMo}6stO) zW&*j8n66@9=Ku6picw~jh3U3jBB`;>|DJn1`=28omky<~yL@7t>Z@8^aE{wk~0Ombnbm40ngs^aLCfiYl&Z{DyD4%aK5!E4IKdh-JzQ3&h_5t$On$m2;^6KY%ZL&?0MdK-d^Qg87KG%j`0v>Q33KYbh)b*6b)2V@TvG#uz97q?L&D=B zE$kMFUhF}~HA4&>rHEcn4wEgVgLDIEpb&+*q(t&dQzG5Oi*<+hq4#Zg40qiA^<}=V z4fU}h;1kGef4?7`-!_aVHy#f&0PTu35s9hJL%9#0dp8e&fD4|!jPG8cL#$Ln-?sYZ zQtIBJ#VYWrUd~~o^OMtnA%{%g`Gc}VFEYYTl}@aVE!+eT^=%aE#UvHSaEzim=?_w(lNv z#1#~>P$NqF_7e6kc_oc6A?PvkfuN^cO^*}6)dSf+-Ecek_M6}r4-+2P1WiN_V)>&W zIbm0Q;=gp5el$SeyP2`WKJJS0NO^=JJ@)rcM0go&=|H}^<9~%6dwy(tLj3y3WueRR z_zO>Op^}#*pTWCgZAOr4)Kkrg!=2;?X&RGBif5u0kQ zKKHv#Hb?5@0~}}Nzk>`9`>4v0wf%uiJ1X5c$r%NG#YAjgnF@dYqKRasF2yY}+iZajrp?S}j4l#CtbZ8%_S zJa!`@!nVv`JXJ<))7<{IMT}-1t6Ylny<{I|3FJWN*59XWY8~*fUwb?9EavNwYl~GL zw#x#+`T=n#kmh=@o8LP%eiRMZ&K^y8ks;Ko%Ig^d&Q23IvZg8Y$UGwZe)SG<<#Q&YL`=%-WpziEfFABzl!JVd`YuL1AY=F+3N{msKe2V=ai* zOU!b0Bb}bWeb)=7(swoJPQ_-6u^QrEb_0N{)O@t5ot)eIzJ0gJnVz@Op}s$BsbXmS zPxe+3&IxGjosDXj^*N^lpVja8@+`Way|*INOL`%Nx(4P#LklSI52GN z0_pH^P4e7t%rDt6T*)`e%=>1UOdXSgav>}Z^3<~=FqRMQE zGkSCztFB~~cwLW%hOaQgm_L03!TOLE<(9hf(z)IErg2A4mhZftKq02==-|)*7idUU zI8=#Fj8XR~*KLvuv3tTJ;E>S}ofsu9m*}l?|4y?13dhV5GnWi+5U?xKS}b07cF4!N zTuz8hZlCS~5oI@Wlb5pAS)hcQ3hAH4X#GI`uu!4VuxqSyGRe#D%h4;_=O( zK~@BTSl1W4MKZS+l)R`)8E}j;L~u6mi-QN=ayh@ zGx9(>+e|+v;iyyCOJ>#TJdR*gx_%bLR58%yh7 z+#bfa3d(<1SV*)t;Ilsl7S!Mj zRlxxpmkZT~%amq60rKkniZb=arul71Z}Kqro2W?d`_t8nh|;@3OHPuoi-0_qV0Z`| z;4xd3H7i+SDXO|AAx9ZI?-`g8G50TH(Pbns{8BT0?aG+fVGeqgG(nWKFq|BGm2H~( zxlE~xV+1k?A!i!4+<)N}!eeo>yj_!F?3r4C1iDp9%qSjbI>Dk-s7aA(Y>q^H)IlJB z>XUhweMo_*)0yYqNWv{*lW~Av@L3Vr~C=>SeV0E6njJ1Cx0rSF7 zJO`|SQ-Nzazws_+d05$|v%$|>3QX^Bn~9O(@c223blzWzwpU>rh(&xK%Pg1r@GYm0NkyGq!~wp_%`*s=;%*3w_W*iO zbz5XN^_RzNG)<7J{N8V|rXzc9KDQsoDiVnalq>-h7RDA&DAFT5Wt!5g}g5Ms9 zBfqEN@6|!B+i-j?_yGlKu0fzDJv~O0>4jrdYCKWPgh9@-Ypf+Q7))EQpq5^QXNq72 z5sMOkvaLzgZT(ott>@ivMZMAr6JX8AW@2(-;G3msYTo;nYH}@S1iXwuSmHB>{Y~X& zOBHe~vT6~@+n!+iDam=DYSBjP>N)LIAy2+?)yjDttRK9qc_vqw2tm|k*jQT(xY)Y z4ktIfz4SDxZ_+jl-@c}}>fr1s;OhOdaULiR{$vVF+Hgt=)n1=CiNIZ`6ye}sV9!ko zedhAA7I1TE{;XnGTQvjsviWT3rJ1Ts@3!gqeC%cCL`OQ2zoL5@G!B1nl0OAuQ?%7Z zXo*8Gx5gCF+t&)=xAVN+DPaay2A_mZt9!Rm@Ex`D zhNejk^Ik#G4&R$|L+7Y(-u%EV8yt!>!{CIE7YK$1<-x9;RtX683MB)}kIApyU`Lx* zF64{x=4#aO9o_go9q5;tmxVi}(sc}0KWyUn&Cy!*V$vzP!SCumws2|+Rn z-MMZHlNX8JX&IHDwQi4O_q}+=?cn962t7L5r`diI!P}4+8Ems6lt~NQQ*s?trED(i zfHb2Lq!<<3t1%66fTMwr?I3TrD7*#SBU(|l*fV}kdR7q6UwENyc5PESTQ{*Di*`3d zfPG}PhCdi@e)`FW>}viA4>-?45JWGcuVw{@Ddc)GUa6fLr(bpZvZN0y%D}?GEgQSQ%)BsjE-KhvF;Oj$cNq9hwy7(g{B^Otg>b$Y(pV?q^jOzCU zXW9tw*Jz6unbI!(;PMj`P76k*@4@$aPPr#-f35Ta1}5)=w!$Ydbf>kTB}OEMJ{#6N z4pNGEvY_LrNvt-QRaXyH(F$Tl0)f1P^a!MTdh0jsMkWr^G`tbZfC zW%-SD^R~%5GSu-@nuD0>E?wHkwM@B);az7AJgyY;%+Nhwg7Mp}gRd z4$ytZO-2tU)WW6W^5;0Z3QaXJ&kW>1Yvc`E&4AsNZT6RPg*KliQ63GsVFXfK5FDOv z_ylF-_3qpu@%pS&!0s}>J4XVwT0+9Q{TVFXKiQxhQh!=KOc?wxS2 z23?alH*UbxVW~Pj5mS@x3e0~SRWv=7CZl1lksL+exX`t>*=|{BbX;+ERB1%8%It+M zm6JUMAtb7QD=TOdSIwr`5xAB0^WF|Yh81}po06YG$|^q@GMq4$5?@m71}^R_4ZZ=5 zXtEXOLzi@)qe2vG@TzY`G4$%x?UZ-Ej>=;i83{IXX!zA7a&&}aV{Ln#?5suE;ED3fHO~HK8($(a#%U-sTa*Zq@ zr|rH0_N<5eIPoebc*IaVRqh;|Wd9S(liTnz{{uT(A>Bq8YAcYEpFLfz66yConu@!P zaD@lw`*4cb@VwFOdd@%e{2=sM{IO?j*>uptQyfvOl#pc3h9=kFDHib#Ls}Q=0y&~0 z%5I5j=j}>9KlvAq-fi*{86^n2B1RInT%{d3@3GzF_IEi<^SX@K+v)f7y zaId~j#jQW?9rfb+&Kl^3v_82^whw+PkeAag((slBZ5akp@w@JfZ4dp@6(0){_X;Y-^k`A43sQSGmM$Z!PD#pbelNVhU?Qh} znTYA!F4n_?lL045KX?ldIqCQ|cx&8A@-&^RYLF>48UG?t^Qw81rr(o=O*7EEK8IPn zCM8H%l)pf2=Q^0@Xr{(`mYr$4A9#+z+D?m|g~Y!=%7Q!=evC|zz(SGGIMd0Fh+Bt6 z-L!zTcP<9vv%=&f5;WYJEq*_Weg1RI&ImO+e5P1bTdmP>4LL`#3DD!iWhZbd|D~ml zS^XnwUpX#UW&U5@KqD6{qd23yHqE11JLFvk`^x!P6YYkxb73)hsh#^%-~_y*M0 zMzM&u3EQEbh9L_-%Y;TR19%Cc=V}JB>)oTfBIG2I@eapvch01kl1Ne zSRLa?^7!aTDxbVHzrovJ*=zpDMdegv&azna-EG2-(_;4PW)Vq?hT7WrBa3#47G35U zt-oOsLWy`spo$f z0@&Bi(L59ymmJGvE8hQ1S*tZA%7Ocpgm-6kHruY(iqokIX7C6n8xM)-gWd?$m`i2^@ldi`%%)Ck>~Tnq73YG&QxOo%&hU7GXhOI+uOA2}1MMaC zu1%tzzmHJNG(&8m9l9zHgR^H9nvt*ci0>=x(94=&t_SWM<12Wf(=&e{ju{iUEfGgH zK;_WjAD2y%F4=iRZL8wL^6UD8Qd~E`+&YomI7b}Ku2EB8nIY)2T@5$pYofJm2WqS1 z_J7^Dzq2?cO|rxNnx3trNW?^c;<<#j+eULI!@ba<1ULIjjp)zPq7raQieb1~?r>hI zeIbbrY1B1YZIg)&0W5PO4mW#McaDMX7GOhHbbt26Pz%f&I=`x8f2!)PYCKq-U)V;Z zTQC_gon;1#dFE!}I?+<{7IiAzwRbIpjc|IuSsq;zQW42c|1jZ31W|XrRQgWjx|e^6 z3hy3G0fvuNG*qXR=I|mxblyTPac!6DgD~!s(O&;Iu8e@&^lO~2w2|`N_X0fc{pLu_ z%Zf!SnV)jP3Lo`iywhM7#D;ZwavBh93Uk@j|5xRgndGUjgHYD-yWb3|v-wq3&O28U zcan?S0ppli@*7NPJw{hEaf9mJ-*?+*ny$u4bUO3R%h&Np`ur}6zTB4*4JE%3=grR( z{Pg?2MdSb=-@bW=i86}Y*X94Kq#}5Xx_9!gF{j7E1Ll_lsk#_~G!^QqvmR0nTJ<)= z=pU*oBIzhb92Gd*I5Tnezec>qh4jhyzaVtM93G>{9}-@S487kSOH#B}j*o*vpl&If zfqMC!Ol=G^;J#4slaYQFLb=5L{~2of-&p_e^XXGE>Jq!eIj+@hhgX=TsV(JxjUQ4( zecff-&}tQlBZ$Lq9Z!Me!glM;(3kLCJl!@Av)Vh#>vAA}&!6xMLTH7!Y=rtoo|KYM zSAT`*#;&e3KYJ6E;r8g04z4cQzpe@diR2ew+vz~HN84V7_0&OD*eo6SNW z1B690^iE>OUdgd%y*i?g`gJ}lR1HjdmZqMsddxE3^}7q#iwWw$lL#h8(m6d|fY3+d zq7qjVU>9S1nVo5R>~QzwAk=XvndkW%ol+~O>(ww}cDs~LvYoXZGdzVPe#_;byou&x zeSU6#KL zMq!C#z?#dB>I6@MO_83P;rSxK=A)#1=5$TbNdCZgcCOWR1|^XiIfML-V^su6H+j_@ zca_?L)b>!xdc-FWozYV4(L1UI%}<#;kU6J2zaPq;A5lHtVgQ*?@Qoq;LX6M1*_ZBr z%}5;AwyY z`Kn&gfTZPDCSw*}^49|Lp&l;^FYOvEeH<=JxD zd?0X;Et9{rw)#isxe6m_;)QmnL}#Jmi_Z>O8g+t6Xk7S?NZ{(OlJS7GPo4imC>4jS z;~z*=UYEvnkyJj8dm2n`em`;HA0lgJVo*p^8o@#*J@-1G+IQv(p`-LhwxC~%Cm6+_ zY}U1Uew@LvbPf?mA7JiKM9|<1tpyvt&s$Lsx&6AJ7GW>8r3nH9ucEBF%g;2T-hyy( zJ|Ni3gr1!rz10AUY%X~i2p%)`PPwo1YeH16*DqQzJ=q0@4=HTzR6qFe)fiJRzgS;G z2DSa@9`z!ue(%i+0V0=c{J&&id_V%+q0Pp`Lu=smh9BpXqkL$#&7WEW5LL+txevbp z@G&3~<80-(HC{;lFgzLn8K7JYqC?HX}edHIw3X2G1X2@>EL(_AYY1$;F95atw~?|^x#T+ zz;0J~<-NZ@%b^dW>8l)Fkh<5yFmcVAmnAsZzxIBB3gw0eRa|aD!Pt|Fafid{Rka@J zQ{NgaYxH{$6}40S6S%~>)nrqtM7dAqj;F@Ibb@p9`E!bB-!c6hx5cPQZG+I8G~-q5 zxA4XEyWwQ{r1(W7@Y7&rb+k{feSGC$rA&h-{GsH-P&b)4LK+43g)B=ffIgS}F0+@> zn^m)T%;WK9>o&JW0cT9@ak28;nY6OhunJ=)hhp)DM2Uc=t9Z>O)hfElEJXMI)A;%I zPS{7^cJcM3BtEN!fA%X)UGNd=M;Ltmt1jSDgnoz8n!O$D5*MauFhn5b?RUJHCyqE# zcXHtFK#L|fM0Etvj38HQRCa(IfU;wBf{y5=w* zK15mbD4-(~f7pd%$3R;d44cjC-$~(tFADnz*51L8ulZ&xWp+Surbfh#@YR$Sdk5gr z6%r7UND+-UY6A=TRcitr&#f{jU1Y)Jg%Zo5=F!!>bM>Uq`xF6Lq?mxd%MO%1QP~c2sdjs7-)&-nxj#E;%HvTm^sN z)?9dz@*OAM34rB}d(pT5gh@QTSUkQ$l^9=mwP*h%3U@X<(4eirfaIMnC<&<2^Hv_X zE`7JhvzyRp>SE?*J@X(SX+7lTOXs5JFo&KcKeo&dodpi3PG97dt4zo9VMY-fS&NT9 z%%yq902poeya+l^KY$oRan*W<5eyK(Ta7W{b!~-?4`Gk13imHS9KQozi;=s z$#SuVo{<|6Sh&~Y!clO1H|;jpcpm=|WF9QO;Tz|LZYoV;g;%OQyDP&NSMYO8+V?K- zTRF$K%Oq3XduzAQ28Y;r#nv6Y`InD6>W!0FaFpFgi!$9nI zM5`2z@Fzh=7Rerq*+!FZKQ8b$oi~fw8odlz@Jk)Py}7h2cVR##SN8Z4xiNFsydMtO z4r{XuII!+q3SjA{W%YKRnartCY`Kp%z$XC7*UWLdG)w{Z}EuO`!a|!}axn z^G8Ad8qt!^i!BZVT~12m-s7^4 z?Z4U`dyS-|zg4A%-QnP(#IOj>yuTXZsnnN$O}j$c@{I8CVD^zxoK74taRW$Q&ca@Xbe>y@&-t6S;R-acpcqW(~XF8*G zCg-)~>OY24J0g9}Hy^y&;ZN4I*79^sQe=IWYi+K>5Y@L$cAT`?SOhpN6J^H1CFc~E zb46sd8rfqaK74LHew5}H`_@!n0?L=P>^O$x4C5gpbz-#jZd(sQ%_6$lE6gbmrOd}MzHWkv? zKc#M+hr0r`JnTTNw~L1ZLhj$l)H%CUf-h8!h>Yw@cf0Tmc4~3Xm7j8Crpr%}n2&Lv z^R&MGI;vZ@dXgs`1?A_UyVFX}VRO8Kw-4K5pbR~@W#GFy%hP|38}_IHq(=-sj;Qat z#guyiA-Y$9A8+?)vW}H|_ObQWDR{ zPY&8QzvTu3lTma}Wdxb>67zzNR85&~1s>RV)&zd7fjYm4CGdC=9GQ#ZrB9w*Q=v$; z&gL^zP+mINdXmweibO%%ywm5IBxPf*q7(amd)>m`ji#OlgMHB6wsE3T!*F91B9b?s z#PpX{C`}WI!fXW{runu{kc6@QQCbEIp4FUibwW28A8HVym~nKcaP*DvLit9dx52|u zFjcLTR$R?BrTzJ-B8|8MqWfI=TuZkV`PqatZ0Cx2E+}}1x;~m%r1H8tP|JK$qbUQ# z2CX|UGjno?Vw{z^XppAD3ZWS%QQBM7mqUr+XCxO6`(JHN{S0;SW;zyGRjMfG_zxU9 zoDD>NyGZox7P|uQbo$$*^Yq&@D^RN$n$aVWj_I~1?Bor4g+wGMh1Wgvu6ub~yI+Qb zzqD}kWNLHEF_j2_z~bu;vrRhr9KLg_Ate4*5$Q8a1D)hfXRT3_PJX;?{ONq@>P%Ne z{xCv`$njUxN27tAntk`yBfcNK1x~s<$7qgD{=da0-L%V(yuo>_;o_~NAo}GRHCrjG zs_jgcd0wb8GYj6ns#+amFw@N`wk&5q!2BKQkSk6xg!pv|Pm)iJmXz-0g|`hZYfX-k$dOz6LjLr1v#oZ%<>X_ z{&usJLfsqMC<7TjV$DXW7)z?7pdpjkplca`b znU-bko#B^bzE{i2NQWj_wRZ0JrYg{h1MRMn@^u3mt4fyL>W0E~RzNM5Vq>o4c+p!G zU*m=q^ke#V7QaD^$W|e&hpnA>QKv*P0CPeoS|y|+Dgq7_7MYTtNW`;|05>@05_G?^ zhVIkQ95gu5+IieidBL~(2PSp;N;C6tQe{ZP@iWFiT=>w_=~rmta=V+euyPc_RZacH z>8@VC-RVu5z)AVWV0%o$-e5lA*hJB{MMjh~&{7bE=;`+2M0Tu#e)&~mw%VC&j&S9n z72?G4CU8;EqNszM;-wMlufl!ZZh<=2ragX;FXmh@B=y-yXZBfC@(q22-9R?s8Mr^) z#2Yck@=q5HWB>&j*Iw_|qjFwY0$&`%Q^R5wE*;JPd9Gn%!c8}F#`20ILCswJ?_dK0 zA`)K@y6QX#8#683UeW#7oKW%t+SgU1U9fQ?N?jBZ-^{!A;6Z`|ARo}MFY%V*6?n(9 z>UIMaEq-v=^bWSSZ+^~|i#W|HyigVh3#Cn{8W)SYpH>WJ10|vjeX5@+9w)eN{??%o zIc^|^za1*GrFSIL1crA6v-CCG+dOS|+6_M$)O@Kq*mkw{!kR3=x97Gl4}tvd@kwi* z+)0uDZ3@@ahE%;7lK;|ZO5)Sq^j<0EMra!uK=ibTAGU(^r7Bx=&&e}s#ws=Wb6Ip~@7^d? z63CdwvhvrTR}#w83#VpN1%@Pl+bGRQiLD_>$gu242g_`kzt(CxKmvx5HeMUf3!q1Q zL$w=o14qmx2r>Z4RH4Y`*U)Ry7>;RH*MA!;4N>nE>O8c(f@hu1n&R}h-mJq`?ffW` z@lc2)*cjMF@hK+cOt~Tgy_zM0u(v-anKk>jxa|@AC0?{M!lTS}Mg!a=HDyH5X$f4I z1)ZuII1ZY(js23G-fq@_N7lldJ+c>1H7>-1-;t*U-8S8m96!(-RF|jvUXa08&u4(c z*haGBw!uqV&U5Fi2J+|IhP*Zz)v{@y2)sJTw{c59`d9fvQ>sKAtNyj$;&r|lE|=u8 z{bi%3Ve@FgGyVlMNJO@KH#c$o*5tA58{E}vbL|D6iiNl6W_3z~2E(0m<^G7l8Wsv^ z=%o>j;Hj(Xh1Ohq4q~)p4;;uzS!Q>}gaB5N*Ihj3?E*+jfQ5VS@u=hUU$MY>#8v?8@#WC zSx(~AaFnQw(f*0*KDL`gGi)I3HxHri`Wi!|b}9K_Lc%<;kl=iGabHoQpVLECJKQ8FeV))=v?4S$UHG{hKO`*hhC(Pnw?p?)T9AT3Q*Xy%&M2m7H` zoWk-SVNjXr$M(~=^x5#s;tGMN_jnF&`J`<@G7TK zXQ9#e5;XJGUt+kUyRwT6IYf)W(pQtV>WGL|i+vL=yLc|5(C|t%SDDN021M3O0U^#O zc)4^WXo&FFlDO0ocSl3~lwYCPWC1b$D*draCD$F8@v|4i65q0I={0jSX@J)AW$&!E zec_AQ8eZj@8m4wipuOn0(t_6hc_Jgl+#d^SEVN!+agX=cMtr z#kN%O2#=EYTyUd)HgW+6p{iqzT=4eDh(-nF{y(SFE)ZvWjZO+b-|eQqUiRYu;qU6< zdPyElNDq?HxgW`aFA{#1o1pXu*UWfC{?~2V+XJ6H>sK-z#XHj zmku3TG>92>{wfFs$(a+JpA_JM}+>2P|lFhnX2x(jP z9p@9SRD|Z7ct{IZ>471%xQ}yrhBE{=-Rr9pC3LJrBG*tui}LI>6BHM;ZycG0Y6g(Q zH~0chhnf5MphW=V@TR0+brvw$w2{D7!BP&ddgTiE3u5|B52smaKGm`8a&)*NvyX6&8&OeK#;*R~{R$ zB>xzjueEeD_RhCIA1mdSAG4<#mRq-VGMCk+|3$p5KSnpJDX~kutCnQ%dStBc`f=9p zt1lqX!}Wh*^vmqhspl$G&Ne+UZ=eFv$237@uIUtf!&LgL!=)wa|5IDUzE=UA6rR$~ z7>rc1b(h3g5{lVkSQwKS9xhGG4Cq747KYQ{d zo$T{RIlTa^6O?r7nsWLc0UG+%UNJQ_-^9UTCtScAp6edXXp;C*>nQnd>sU`wgX?Lj zTRh`*({7<~_3_Ur;bQR$AAN%p@#~}@C2y@mnrKEH!vg6v5Bo$6@|TgBPL$awMdWL*oY-rq#=R{gd)u_siTDL{zT{6%G{_!zXU)t z^oC*&@BT_-INA_=OoVVyWdc~f#nLtGVGLv2hg^NQB3*O^r4?x$^)g~Ye32l2hCp8_ z3bZZ;p;V*vZ8HcPb^?;iEAPse3p&I+DaRqtun2G(LaqEKXHN3_B=q`ARiDjD(vG$- z{g+&zzX=1zzoqS-t)`CUhpU+4TGwZPlzJi{{h6%7FNJjKp=XD|8%^gRE7hA}y`gDF zk1CeffOqhG@oszNj{5z8XAV#OtULC+iP(Dhi6Zx4WrZ3CG-a$2s!TLVxH+MtnU`ny z)hv2h#F!%1V4DJSLVubv7}3PTUC()xWr*K3f=?E3g|J);xmmNs2o6NP?mO_u6n{n^ zj6q1Mw+DPPErCr)4?3c&vb)o|39Qma73jzrxC0<}fJ9}0r9z9?+p#%U{T!#B>`Y%~0?fN`|g2(>f(@TqM&X{r91!Oe94 zddfqO@oUDc7Er>$l_Pti)(}YfL05RD<$HkQuBt1;>D3W--{IdloVjFXr*{cBo1bNu zzzTr8Ra!`AUBTdv`S<6WiDybNUJ`9`;c)_vuYg42WfUJ}5c8VGFVM`yk^PK=S3?1( z3OkNe-)zF8qw&AeNhyfcm2Cus0fov~h&W?KxAHATII<%F-vVw0+&{drpX%R8zcP1Q z71XcX2V3!P+YqS)=$ycA!(;NCx>{N1nz=}Ho zbSCunfujy^dx;{Tc1aIyUl#tA8InW~O#@DA*b=f@3YZyj%Fi@>>8;Hk?AAL!F?9t|}mYEtkOmldn`azYf5xNc^wMF(@A$^4~#*gnanLiXhV0<;Ebv-d($=Pu}d&G{{;&8Wx$d@nlcu!3~mx% z%tF?hPf3r@h*lzeU*d?4U3Cnc@D3lgOT#NIHIBtgSwtq`1Az$>2a!LX{?!nE>DKn8 zpf;!bU})!*tG^Wd-%QSb^`R=8x{{KLqIw#Mo7bSKj5?NlQ>y7r!WLtA(rG(shGL8j z@9BNmamt|v&y@GZjB>M3i#KzQH7Fxaanwj~@N@-(L^ClBwiOf7=#r__ICKPu+7GZr zWIw;7b2WIf`<+W~6wiSBIg!wZvKZNW1-o8crRi-Tl#%t}vsQU*;U5|D1y<;Hm+4HE zO^J=4xGZw8&JU}ObfhL)Mh;}?h9Wr(lg)=f?hM0$l_mPG8#9N7u!V8qQ;0p~o}3fv z-w+@c=A9LgF?Pt#*>`;7D#L|x;0*iypJh_Gxi9)r$JW1J9S+faCgEYSaTr_2<-@r)YK=TEVFjR5q*DBCk?B1|xwOsqX zpbTNZwHBOd)xr1Xxz8ELsw?YFB2CltflZf|9^=Du%P+qC1#9c?y!!{T9=@^wWrzHR z1y0{rzrd{y8e8}-^q;O5n!1l@x6W;m)nEmGuCkv|R?d8(oxKL6dF=53b}CLTe8_*@ z(VJ|vh@k{o)@7U&cl#|5i*LcS-%N6x?zP(rmsJSG5k29&Bj?5W>gsVtTlTT>a?CUF zw}lkB50%L{I}5hE$|{jw7CW!N;A?_!l)gBJE>nN{H@*UZ?kEu>Vg=4X?)rG**wqIX zyTOMwyPAtDsc-LDy`Ov|o{_rU#GIa~jGnn{Uai%sOPEe-?4a(6G^?`uY+PJF30PW4 zoAiq6*bhKJSBbxz>g*X4!H5Ex;)AZJwBC@w_w5f4d-MC+WiaQ~U}8Jrd1}ahZaNkO zE>-N+6#Os(wV>2W4G1X3zX3dRE?qIq)&->E)9Daok3NL9XsWJ1*av#I7}`hfztug| zo=uburF)^V8MhGP$`muUu*g^`##EF97x<$#^kph|q2Z%>V(hR(AU}p_{;C$Rd&;THX3IL|a<+_iA;|rvraC|pAt|xf zRUN*9tc%5?7CRRcNCh6Ih_AaveuR*|UC z>UJp?DO;WJBLV4*K%mUug@WdA)u6@Z+g5T^zeb5x3;ds~P%Ce=7^WAU5hioI>q1v| z^wm zBX0YJyVDkBaN-+f_Up?m~gSJGJCm2l8gDPS^`^4zU+s@Yox_A2KokrlK39KWS6KvJpHB#AZ-M zjKY~na)QqCm5v!`8`Z_O+E2v(Bez^1pC+;gwV~Ihn;-!i2HWuE{?y90$3J>jBPyVC zP=*DY&7T2<&3W(7H1BX0Qj-fi?0eTFh6?d7<1&~1H$8&0U&7Vj6+2u~F>^*5Jlx5q z%=G*K={lvAw~1ot>VB}T7~7!EVY`-bTHcIYR^$cJwX_W?mTJD46cTnYMK!&K6!grg za&BW&{N^c6Chv~V$uLvR~^w#o@jH1xAWthZ7_K{!3Lm{fc)q@}y6r++jk z5^ao6aVMQ7Ade1Sr?8I(R(RMmycKTrKE3C-`X0A8!~_4b%|H8HV?aDA?`NgWupod8 zUtt}D-8`GY?@33Mo=Gz4FbY{LtsoCGQDO-bxTr1Pf~(ea>GU@`#I2TxgF7vX=$zTm z|2-w8ox)VImCN6qNDWl|bKF>W;_UI#1jOg+E-{lDOg z+aM)9q9Y$mJsGqkRz*qlR6f&_25-#p(6UD@-q6U$JNi5b1VU<%RZ|jz~4i+?H#v~d_@hYL$H16hFmhyIMW#`i& z_bMunb~{TL6l%Rm{GOJg9~3jeHc$_twY>$8&tO+yB*T%2oc`_uiVRPoNt$d_?P~IS z;T}16<7fxT!zW`(e2F;e0VqKGZk6V9@{a3X<*&x?1Gih1u6biZIS_Sbzr*XkruhMu>Q z!imq+azPRL2v)f~5WNAGA<%W$QdVfzQP{C-WA%MelLt=v7+#B9xZvK?6TWd3J4KTb zMKg%N1o_0u=#jF2Dr6Sln<$J{y^d^)na($~1y@aIXfQv+sE*=wPp|Hko*@OGvzjs8 z=>4g}U{}wf>rZ+Cmp&^67OS*rv~MX<7lqj$W|E*$7ZC*&Nu?ixH=35~pSWv|4G$Ol zoDHtlzAp_)OHR&>t{(4?@`mNv7*9t^E_h{GGMMx1v4QU99F`#H)8??$I$7ZTQcAPm z{ouGo&P+k)eG2H|vT+-95W-useLq&ZCeSo0`@=l;{&=~dc$A%Qudy0WAjTmrvbfr~ zGdTRRS>>$x&x#w&P-3=D0D1mz-3!VlDU;p)pn^kW*f^(grgTHndUl9WkQs*T4uc<2V$3uEv|v)g@$EG}>6K zzPn^pv+1n|!~4tnBL!+fXJfRUV|Y+eYtx!5dsMZs{sf1kDE?O18ubn|#tDQTPiRlp zrE78~=4+u-WIdo3Awtj`-Md)Mb;Q+@?}`*m>_@U_0i;?4#G}duPS+b0Uu*W2+2(h+ zvNM^BP{Le_QjsG60Fm4G6z)ugx4&~cb0^aEK?15AbwCV^@9O^eWJb#v(6A=~g4+Wq zqjZC0+i8&!n@57Y`m|$*=-C^#h@(318om{UvqhmSxFnVJ(DoA!33ZuH{rtFlpDgI4|b zB8RD=fcGbqypY7r(sszBc@lDp!}6CgiKh9*AC|1Rr@$}yUXB7cBxs@=ydGv+evmW0 zLg1`jO_us36^VWnfM_Q^u}eOs5Z;DMUD8klL~>qXMK=DoG7(=W_sqHe*?d^Mwhbs_ zpQ=|XEZgdVwRvI6)w-1W^8g6r4;CSqkdItlpxe-kS#U*D<5W=gG*ETa0<(RHp(+B6hw9xf56hem=qkWiReRcxOMGtiu4e#q^j zf$-+O3w+GBjwO{svPY#J?^6ly0ZyiZCR@+os z83x`R|1u{rgdNOiegrQ2bXJ{B{794u5}igQaQ?z;6c2gsV_#ca*V5K#_60)$?j)s#I-fh}sf~ttS`Z!Z2tF`m5d=LExZmc2}VRxC!jqe*sxWX>#-IYrE$JYn;+AX0I z4r5Cah&+JjM4zTNvmT;Tfiq9s6E?Lhx<0HX_4sUT#Q5jO4t3w*|z_5Y+?g%m((j6Z#Cf ztfW}~*)gL1J&5KzfJ|j6f;Z&TrD$SYeW~z0`slXEtuZ9nrz)=bDfs~}QZ;B z`PCe0yfp6fZ(7n6LH2!w@wefxMN=m!y%@e6{?F^)Yu|29Wyb~M3(DBIKo{9#p+J*>VlA|khR$#jyPDJBWgyr^2Wlr*M^_FHTKJ1cHn ztf+Vm%-sk!7iT&Imo|u$WviTe`}xXLJLJ};O{kE`xax*y-On8_c{g>`q@K3N!{X;^ zqJ`7bALk+eVEB=x!RUb?U=O;kU(AzI07V_1iZ(7ClMPjmy}fIg zI1H|=*=bDWHHORIe~fhYJ-N7aZUs3s!AnL9cFa@l1N0`OP8SrzjZTg31?pag)Ptw- zTb+*I=|qAMgLkB$Hi@Qt5D#DaUo+>~KBft1K1PdJf~T$?ESe*#cv^`vxVb7HyT9z= z18!dmYJm%0Yk{2%44c|HL5B8c>yzo4bY}{Njlcrrng?CvJ!AS3X``K;*d(d_1bo&y z{%_o}Fv^}~N#_BV#T7UwSjYizd|gzfMCvAOLi4t;#o(r#c4`rzH&+k=@b>e#y^W%p z8^2jd-CNB+o}7}}SIDfrm3$%I-rXQY0kVv1IDYF{uvU1<#t?^h ziIR)ZH0^!U`YJm<76u%WW|>6wl=LD{x;65?x$)NdV)%c#rW@@Lmf!iwYiR$$CAI`` z!@Q_lVEYR}?gjshzT7<=QeH4UI|&n<4_I(~TGYKutOSzwbu{E5=f7;{Vx2GU=P%Y4 z5eqt9VFaTz935FoB2}?B{_GjYWSG%rumDwIpEiP`tpms8V^H*M@jm!ryX1%1e_t#A z>jdVAk*R4>aNhujdT7eHSw2tq#u4`|{f0fSW7gI!OG>w#A36 zx|hw7^c-Aa0#|FObGBT}9Sa;lbK$jKeSe%&XbI}Nj4ut-lF<_~i_Jo!`kbY!FY9yP zj)4uHffl{(oZtBhZ`S810xeyt51r=X#f(NWN?Tjx{J zO{lF^_ZXYOJeNYSHqBQ2UNucU1m#%=okPtz%n{|J#DebsS$xYubaYEr$mlnE=*Z#I zZs{Xc$uJ?%ec0{CJuv2Gt)bzV2x|Jp0(j|RfC+4>kL=+G_CA zS?xTsD^eFr(0}Z3+X_Felem}ut>srqWUaSQd$zRkBxhiY|K3`IF|@lYtePIH)_!cS z(JtV8(;Rhw+34K#w^hos)qk&t550|P{yJ5jfY0M*Zb~NPnKQL>yCH&FT~Bd~J7x0> z*;~NE=v?G%iNXF8X7-K6{u}&$F_$;((JK#O_sLk_(Do@$<(_;AiNf<8!bqME*4DM@WyWRR4bQZfPFzk1-_+VXadwUo z>^qyBx#qHk{|~Tgi$~k8XXHC`mg3_nfWhtzHBEQqfdWA0>XemXGlcWBG4A#7e4vy) zORkJOpK$^!v03rAmTsR&6FSyxU=-0eZ1+^wo(D;hJeIC+TFgv=kXje&o8-P<6O$6F z+IDG!v-);t2U@8&lW3FL=DDvlo zYDcEWOzs+{$xDOa0GXU$ao>MndA)ZTtuDZ*({MZJ*jBf6A{cb0%Wdu6RocA{txcAr z`E7PDB_`BXbC}1zZ~Pt+=4k&bCsj{K1v+^Mw|B{CbWR8O2N(|7w-7d!a&~1*Z*)CW z`%Bv1UfyydH4H0&Gdc!P=x9JY+gOPk$F*zpkBmhU)G^6Oq4VpVJbCyCG+kVZ;lG`D z53A;M|M#9kD-=}nitERRI!z-nW13Q77kQxdLP)U8XVl2XCHiX%>2g%6eNjDzxOdcp zb5b?j|BZQuX6IdM1)^MFG=NB_R(r*2Exs2J;|WG`Y%Rf8nR?u;GWt3dL?{{K1n|!$ z3zqBeS7wdzlI`i-ngv1Lz)5h{DTcw=UA{TB}Trb%ir1r8Xa(ConK~VHXQbRZ;nUym?m9G zG9RTY5Q-M<(-q=Qu$B|7);j6&jaaQljWyOHvx#)xf#5I)2yFWARHT?6Zc(mdmH}7j z67>{Gj@xNnMi;L`)IvMo=}AbuZ$;{j^X*RFx%ug{b((5>SKzh4Fx-v^UnOE6|wKs?n_=_qSnR)`GLYCH(_ZXqi^qughRI zo%1Jm8!z|%{+=CMVY}CFP=IkeAkcp8$GYikfsygu;MY>QboYHWb#>9}JCc4KtTcyR==#T}0 zyM#jLIB2pncxPw~7F;+DOC(?5T;D@l>CPI(@Ly zv>R$8(DZr1Y#zT%4z^FVX=Z=nUY^U8s#s-XTacPhSLN^Bd$el7b$o`ymn*WkSkmV~ znz}$^*7cAg)`e8xTt4EEco*TfmPo7H)gpkDJO~W{LW+TFn-yDxQTPcjE{M@ zN;yuJ@tPh%EklGs*G++yrWXZIKn`nD$M&6i&Fdrc3znT}v7#8>#l~WJ2UYRggH_ zDWjNUrO0jRxy^<|zDRNHM+CeC8ShCr>ziEbl~*eD`NiV(7rG>`#lOrXZq7PR(Fj0* zsa4xo zCA$v*$)bllL5ES}iJLm4oCu|EUpp{Dv&e#KcBhZrN;z3`55g2O$@7&VgW z&*kUnZx(>+yBUY8-PUb}hKZaaIphZ+*}nM(vU(@m+Ec#*%D)crSNM|X>{OV+%09i_ z<0znLiIiy_@-6DdK zk*_tU5?O_GoQ)ov_L7Lp<}u}wsR=9t=t_!HkvIQ33a}m+v#SVnpl%M^FDnfAU29yF zue~SdgOdSz=4|e@hIXU6d8V@c(|;nvAx|-90^}E9I+iW9~I*={?TL z8dkk$q+|}a%m8ZyywJRC^fPnm!j{z6Gwj~xp!opsXoZODJ%cSHyw97cYK&ruj}#M z9$lI^mQRXQlSlspcMwD+7O12+bI<{kY zvU8}XL!cj4OD*(vqvgK-*ZCjfMKJqW3H=>oGnI-d2XGAbvm_CGy^6rW^G>PmeSklm zkQ)1EjtQ`ev76@lv%)lp-jmDt+CS$Ol;Df}!FycvPnkxA!8968>Z4P}VAM=!*df7g zIw|^zbMm>DMp_ytqpy69SrEHJkgizR+9HCr7kU=AiGS3?*Vn9FWUQzMx&`Ea-iVvP zo`4Kby}x&7NiK5lmts+MZ?3wV9o;fZFt7j*8E~NPU%JHz=EU<9$laY$kh!VuxW^ok z7VybIg-SXu!8TL_rsLoORlDYfZkg!dAve=Ix~=iO1@Bvv&^AWp%n8Yt205BTO~OjB z8HA#AV~f9h0jO}=axxu)xh#im*3Nn$)?s1QtRod!KhK!Zn}!8xvWRx5MaKIOx+|V^ zsS4lL)fK>bBj#>}d`98^LgQ6ur%4xj0D5MC*k}HPX%2WkJ1R5LF?^Xp_*PaEHG(5d zT%)VjsPg^ckAr9Rf8@gPVv!DE`{>lh_y$ta8zDhbxanjxd3ElW#mLaX=gknSoduWu z!r2z4JhruVN-(k6TG`RhIjI`1(Y#6o zZc;$uUdvEkZYXj-Qo%Q8nVeLE9v}V|OiuR5bEn7!b&edU)5O#CV#kmxW+~FhVYht* z%kH%V7AL>nRBlwy31E`@vQgHfD$HeIO-de@v3QIKf3`XlN8y#%%fRW#O3F_!F3h0o z@kOBGXdBy|#(8t?aWDEtZf$Wt02_WfI4_ZsPVB|lH84Kzm@yR!wWlAOn_~=7`0d5h z5qmJP5ptI+gE+SuCpvZw^o=(D8p!Dv*BvRgaMos!_u(@R0U%&SB8gvLX3gLjj-E_6 zZ1i{}tf5`HQb%Xryn%tnbG5uW$JBZn`uDIjue(qB3e|7N8>$#>ea;R|e0awWm#-cW zk>E8o*|u=x@vxp`rh5waw7D~eum7)nZsWHJ!Yz5Tf-i*`mIZfGFW7n)2m2cxD1Fzp@^`i#WO9Mp zTenHY^FjygxKeBxTkg7eg~1|pghHSE^C10!IT{+cx!|qBkD>y&EX*q(LfeSgWp#wv z)VwznR{F|sWm}6wYcI><1|M0YKzrNo-$G(0x(B&zf>!qyCrLEX${!Eb_E-h8?m9UH zg~72OrG`$J3 z)e5x(OaVH4jJdI>iI=F15CiM@*)e|V;WiKo=UL%NUc|5(q&YLHNl`9*N$uw~s#N`# zd%*8WXvH2!uTj1sO*ohy9Xcb~^{M@*IvV7@y()5K^o6#hcXj?OLMD;_y{lS5p_7!w z@)6Y{(qX4;_jRv2c5~ZUVI|+o??YB*UG=<55<^s(j5rR*X-2=4d@MCCcdR|uJ6(p| z3Mba6ZN=|{GGw_9Z8mIaMk2o?+`JLA=dhmk&U@~+Mw3PE{>qhsaF#_k_!v7CDs}kj z8!zdj)3KKnYSEN+<&=r`j~`8bTG(?EaT!bbfn1QrKvJ6=+x96fqW!~_v<}NEV;_Oi zVXmc>YM=sc>>9p81Gpoo{b1?bKS^hQC{(29Tvk#beYEZ$`cAUl?<8P($P)dhfra)q z{VFOm1}5y5Dbjx-Wieh`oBsz4GA=!Fu1nSw8dnYWG-E}-To!1)2N-PO8h5P;q5rzD z)G<XG*^HH<@(}~jlxK@Hy^9~{V@NXU4)T(vW2($2vG>$41kh*utAnN@!?xwJd zH39&R9y!L4TlXn*p5Zx?sE~$U-l>Jp88+<`@dz4rIqIZl)fms=eLQWapUGh2DKM_5LC27Yb(3ea#@roQlAZBpcY_9|_A z{&M%kdzUoe+TD-*1imtNjkeZ?SP8FAq@$mZobWG+Z+sj*Jp&_Q1P@#MbE0RSoh8D@ zhW%>KIH1C@3jsCG#lkC#H}svluTmykGdE45{v!h?F1cd%K)U%&QK+V5w6nqVQ-)gW zZoU=dDp?iH1EP8%J^p%fZ|sDYEd=UVQ>Y$$T)DY4FjD+`!SeJcR?Sjy;4BqeHtUIt zg5>v5-C6mtg;~5|eFB0(;%>yfMNuWyuqWdmz|40W2|?b~f;4JOP>ib$^h-zuQJgf} zQpX6^wa8+CweqA6&CC3DBKLaPPj`Pa%)_SB3!UEns2ypanfVZeD;oCh2$}SmA#5)3 zU-LjzpiLjpZCm?`kXGROUu&rdQ+Kr#wp6y+4JBr&#TCGLle# z7yGnxq|VjImiqqN>rdt$6&Ku|?LY5QKJ57Dntax(Z|F?C#hrv{$GC8q<*58-J|3TL ze`w2{Fp0SF7O8RXPuNK54T#VWi-{{unpT$7w&2-w&<~!^*#uj}9GyF`R%Z=P1Gc&i zwVbXpmSV_#Z**l+gvxv^_{J17$L?d#&<`0LQv0nzOBxoZxpIOrCD+4tkvEkJc#d zCUJeDO`=LMDJ90Bk6q=6-0}}S_(|w|#I12n|botPB?zc!EwLQG2 zGMi>7QZ~yde%L_&CKLV-iED@To4Ag(5va37>lK2vP&xG#@;gfq`jlW*a24CPFFjAX z@x|WHHm%;YsEbvS!`DtCXM6y$OvrE90-m!OIM(MS#AZ~rw@4q1RCXgbBX5pw3wa5n zA3O3p0p%nkA2vzGo1?&p zOQGTTKu5MA6(_Zm^4BT=9_CNYI&9H=Bu#7 zb@BF6SRmSgos*?br$|=v*YqbL@7*ZaWqF$Kz18jQFGr%*UQd}>wkj^>YT5GG5JT}$wYdVD+b+Ni4y*w&Q{(A|1tOyJ#;3ZOp!?_Z7CQSL z-)G>_&$6>_uPQ}890pebd8>khIz=sk7UondKt3w{TyQ>QFLB+%9NZnCe1OQDmdydR zQ6dbJ-)J7BG;SQNg1e zwB`s@XQ5^@cU>*x*~Bj2U903(wUWNkBjAE0*foSsaq|s%lma1M;Ht)m8tB<-Q24U^ z%lj+NzV(}fc+J}IX~Jx*+!QJCyouVbAF3vGu*sJsxAyA_hF2wm$c-_4rpu#tkV93I zFo1bED(h?l0>o6e?=>#f?D!di5GgVkubU4KBfdr1a?Z`6L42>14wAD zCy!fC2IlB!@>ie`CN55*i)LDQ)<#^ewca1z$ia@ryX^>%1w=mRH}|5;9yLN6R z2J-OS_Lqce+zTmHIgzPJ;b!bM*J@T?@m8Iuy*t(!APrtVgA80rA9?7UKq>7BH5Lt;)5st>!xRucg zz{CG2QpLRzqxE}7K8NDA&Dz7Kpt~#mcU^M_|fzIoU}B#*1|sqxN{9$^fU!B z%`ah(y1JE$+Zi1oOD0SfGa)Mj+&cpc;pLO{n;9g79!5NX0G^d9td#BD|3+?h`RBTa zJsO#P{nSwC{o*-0Tc+M^A)(Ps-kH8 z>8_O2-Py;B(jq5>0;-iEj^gpO%+1>xw%@%KV`4DCDwK zwNB+@a0%A@5Y1}8QH|Tb$k`>;mbF`joKpxe>x)E_o6gN+@D5^+G(7EJtr945g^Er451 zKv2z@np=1lV(uC+i4JL>5GKnNg+C)XB~&jg#IzPIhSpe@KT#m+1ue zKXKU1BNAM_3R;Jho3F_EQ6QTw^@T2rcxMKcfnA>K+FklW<9jQk87^U%DnZvr@o_q$ zaUK}dC`OQB#s>rRA%65Ad;|@X^<36H<*6Ur?Dz**)bNg+HZ7Q=Z96Xec1s zhdrA3Eirwr6K>y#b{(Jb7qe~gR}jm%xV{&0_#VockMi%d2np6G5#F(cySJV>40(m( zKSW=JwGoLQv(7Ue6p3|`q5s`yw*BUHa7@3+B$3yqwDaCKpK%_%RUfxkUC7Zy9rE(j znP18Y4Qa{0^%RtCTyXT1cnOcXh2d%}jJzpWqQYp_qa^`SSf2m93*w|i#>=|T`l4n< zm*C!D7pOah3B~3a&0tD#Rz6Wq)Zq&nMOUT%!$iGX zhtTc*byGu9V&k@Yc+x4@V~UQS zT(2|IfqqLSEl&Vu9gl|!m*7(#^ErYw3v4t*qGAE{Ku&py*L5=4KPY{HrPTSB90rIr z-)pKFZ=d8sW74u&933^AU`87=bOLMN$-jt-)xlI6m|f&uusXktCVN8J(1d`&%x~zX zrE9isfSWV!qg3;g_Bz)NAXQ;KEbUCq!#l95h&{%;JyYR-C8==2dxnu}aEz(64=Rw% zh2J36nV&PJh&_%r{xOZY%>SLscjYg;KAG^)mG&79wV2R6fgI(9{(S5W`z!POs{iF@ z%;L;d#Y;ymN(|$m+60g;gY4f0^x|fI>O4k|0n;Xd)?;9uXQ@jlKD^_iJGDy$#GHYC zU)%w|o%=KBGEh~F?bRLsmHh%2n7gQv==uc8dW=tcGkqeWtUVMGDIp`MK?wmpB7x`; z#+4n?xeKN$mPW68Xgyt^U(U}4Wb@nwDK)M%T(n}P)KYUkVrNC-WL0nI@nf>*K>3g- zbD+aUnL)$~X~ze1@FZXrN%WVyNJ1fGAgfdK(|v)#P=-icW=B~)#q8x(qLHTJ4@;WE zhO%w&mrlRrF9D|Szn_h&m-!9DJBAzTMqZ`mG8KHWGgo2G<-#5at8kUn=+bf69kRRsyBhN^ny8YeC* zOT){JJZ!Jz?{0Aa7R`LxiojH{BH?y_(ukb1EJlkdj%7-QwSp^yNrP73c{)kDdZjG0 zyb3eo4+E~*?qzpMXe*ef>nMMl63X(-p92wFHc3qnhE<{bW%1Kc|sH8XJL+$3>e*7cIJ+=q?anAFy>%Y%#DoOD{L0!od*S z8>E%xrqk1gXUIq7+}BmjO$c~f@sfr1W>{Jj*SD3?xVi4%1Pg-5SMYIwb^GP+FSU?m ziZ{=CSp zOtp3F|M*mcS-n(f#Q&gmIx5k+A)otw!%ReU03nQ<5SFtgBNefwp}}|NbknZ_o9su8 z33xTbOsqS2g2)FX2gCx0sS&aY=8SG3h_XWTRz9($0iQtTdJ7xFp4Oe_z1FRif^Ybi zmb7=*6Vy$aYGMa$d^(kY9AVAF%L8>P{9 zz-{iOSXf1(xgyK+dvdRrcllz8WG&_;TT;!K_?Fx8NHz)|=yTZ%r0_hCEQX?=j;I~? zWfd8?pqD4@K3-%Xac(bz zty6d<#{Hyz79GB)SNXLhvL*kqZb?OP?P2>`Xst-rE7knm8VU=HK?nVD zjE0mcyJm`;J?zsS5WKy*m4;``uc@{ezG=H;jTj3fM}>Wc;?=@DM@!{?K~@L&yz&unP_kHDH$QLs`f}xvf z1R+)In4g4bplNqqf*-+;wlF%o2i+fD4OZ|js#Sv^P1YX= z+hFz_M|+zdj!6$Am0dgL%>@*wXAc6uY|GyuyV2#)w}618-`(f8d!*s%(x)rS#*uBB z%R?<#E9BMIjWtCL!(_56ylX^x;z5>$QtY@b<+qnS^LtLO8AIr8+T;ww^!viDky3AX zBYaiec;xcZ1ujei!0kIZiLwFmf(35WoW*YNuau0$Z@u#0;jhpI=TYZ)JUfK<+YE2m z8iu|{3{Xz^+XZ}n)u%W@?wgiFP`uZnt zVW@60%=3GWc?LAntWG+Tvex3B1(0u4vaR1DWJ0VyXlaTC9Um~nJ{*L1YYaWnj%C7gJbiD4t%MCvuw4N@CFdAgN@NSYp7J7W{@q7e z;&><-cM$MS34oD9iIncqdo{FI*FA=O;*|{~vKh_A3Wm@89ee9|D!`8$W}hG8NG*Is zIoJ2JZxN0ZBMN6mg@p+8RfLX z3z2M&_W8dtx`4#;UxBkfCeMn+tM+A8Z7X=Txi@x`rP-=;;y*NW1yXK5RX@rs;Q0Mu zVTT2mSrvE33>(Mna@T-0vK>AO&c+ACkgd3-JgrT;O=2*QIi+c!zaeJ`N^odatzjxB zKbjC^>~RbKz@q)E={X0)a=VZIlSLHvgmE7ZLNYcW{iqU}e7TVzhe32QldmRB)QLpP zH4-6V($7}e#aiP7l^hH=g;O1QRm&tkpyzzcE6aq8o>AV7g=hyq~Vt zehcw&9}MAyi!wZ)TMD^AhK2x#8@7nt2Tv>g6Dga?XL?R<#j^ud4+KS!tAH{thS}Yb zdRFt;%PW_-0y&jOT?GDjK)6A4=QFvUtzlO&O3?)D$mAYNw|gAie$W7j@~&wmf;JF zORuRb`sAM+u8F3rFM#iK#H1eNqC$_J3jP6q#}Ka<{PPLhC3*t`(ReB?+?&6z3MQ>z zr@a#FWr+A1<0N+2!scM(?V}Jc^?UD#Ge%J3$fw?wpB&eH<<8A_nG)U0NVCplXKh+9 z#jzprwY?R6mnfusfy5yB?&qY}wK4N^&K5Wcos>egCg*W?p- zkDGI>zen^F{*2&HLcd5i<5XH}rkSjct76|CG2zwjy>Y!fGYcPqGqI>)8>V09g2_Jb zwu)}$QqD%~oxT_8OD4{_eE)Lc;IVPGQq$e7X0JGBzDUV_2IfWsQW2dzP&c)iNao!m|%x2Q@Dm@i86*yY6NhZioFuf}?g{ zvqL_1M9z3c9&!_ywYA&FPyjU0&})r&UHL$2ml9L?3S8MC&)B6{q{YL$0T!d8| zKgLVKcpn7Q;^-Lj)NtUfGaQ|W)C+=T<44^bL&8c4JAa2Mx7>xprM3(VE;o(j7DjY21Qy*LKxBw5=xI$x)B)CA)V4)f;2L^MhMa% zvC-17(E~<2`##Tq@%*xL|8Sq}-0yRrz2myB*Ohs?pcD&PBE&I@%%N@3fZj}P6LSuE z{u{Ik+1NiP8KOLeRnsIR0>j$l{C2n^DCS|nxtk@i&)uJO-mrzp`jCe%SEq&Hr8Vf} zY+|vmS#n4k^#6upyIjTEvyBAB!cKovq==Wgb%ryL3$H#>ddnUyYp8#EOxzFP=>C%~ za#b`QfXQ}WhBH=w!T!x_?t!A!e5X59rudUMIp9YLE6(>P00E(&fQ*-I*RS*S;NlKf z_J>DaRZgU0dukf3FW4d&I*Vd5A}%|6oBz4tnA-jmp)1#{)((O6VGg0d8PP0XqnRYc z9O&ceTv!k3<9QF_qA6tcOo+yXQ=aqd810~sS51xl=wv-(uUvP8=svw;8ybwKuwVFF_KV9l zeNwcLNshr6hT?=|jdsQ>RL?`k)@n_7Gma&*9l2~z(`78IZ`(8ak4>|d>dQ=5ls(z| zgsKzM#!>PAeC;Ml4y4$*iH1^o_Z>y`yQ}(yQ&{KlRSXAf*n}&+zqC>3-0Ed>w8c|N zBN+^yb(UOu-_(2-O-W)ppZT>WneL|G6>Xg#doDKc8t9q9KRkW{9g0Y^{bV5IXcHE8 zR_)vt!+`?Z_p@*f`fW8NiVXyr>50DSpoC$3DDtC@FTnaAC7~|8?4ODz!f@aH@gODi z_IYx3M|sbrw{c(I365Kle_`Bv@W!CglbfeY;OOy})U8ggb_1Vy-|;HNT<;|l-DVo@ z4^W#7868r#TVwP%xGnrmL~4v^rIBR-EkweWU>9qp;!57u%vhW^J7*}pa@Js(y-$#b zWzBLKs||qo_&La_k(qn1ASC_ln?&=1F_*4Piu#zqaSNU)eESfel_^TdA?kii2=If& zlp_lv|Z0BcHbp_>_Kwi@C|#l&-0cG(ZT?G*!=NB z=)_)ENl)zsZK$gxMX?hN4vI(x`^|qX3De(;&G|i}$Lo5!k7*@XHAyz`Zqqr$XdMlr zrBW!jMs&p6?N=}7m<_-kcjj3kR5P5LZ{CDmsw|ug6h8YSZ7grAa$^ec12bt%2DRnB zX#Q-Uu%V_-R1vKob@5*-gWLn1sSJQ5E&YnlgXRm(qUHBZavVAd;1kviwmVAiPKCAA z6;bK)KAWrHObrd4u?fn<__SR&r3{J%{Q#%WZroyID&Qu0J?nW(>Bv+gGC}xrm55+` zm(&h#!OC>ASnbeUF~-+7fpHHP%WTWLmGX4Br;#8VH#{fq7-`OwP(pKN24CH(FiM)d=msiEA9L@ z;Dh8J^oKo95LK)iPeHu2XN5@+LdT=--VCBa6(d;H#)uftFof-0=UM1VO6|2DQ%M6g zmLAk!@tYJ}2a8OTk%C% zoEHjZZF=-i3*_nSbWoAz9FG2Yrm3dH2F?`I2y@{aB0vEN;uBt0kH}|Jk5lwfo+3Y$ zzFIKJ=My9aJ*Ea~9^DklWJV54{w=t4+1mcE^-gwwPPjqw=Y@^i+RUi5c+N!F?km*t zG98M{LogPc>fz1oroBLXnv*a2sf|WG2mJhL3g!5hi`Q`O;L2JVq@NFu{gppa*a5+| zS?oUVad23>GgSjV`=IuLARRnv*re7&HvMWZC+|4aB5EUW!$bl{ykx>kPlnI!O=f$h zTTW_T?BN45L4=IBgUeihwUP>{sRFvyOo1L9lxDm#KUYz&Ow<6U6bI66M54QJH%Pd& zg#we!o5?E-_Rns3R0pt!d^CKoB)c_vH5f-)_YDpR=h@iQ za4xEj^Eb)wDXk(qJAa7Y)kDh-N8ymoT#J|h4Yg=R#UEnj=_^GUZhj00A?~m2e|o|h z@mn-Xy)ZFydi6-DJT5n6`T5&^rOY1eGN_L#xp{`2R6grc-daHw|5SJORQP_qHajarOiC{f3Lm&u+jy&9t5RE447rw8!2+aS<|9})#==S z1O(Vj&FFXp@W6*UXMR0hjvEpybBpmIf{+E!&k<(C`;YMa4cT>F-PH0iU3(7KA%V|? z{nE0f;c4hhH7mX7@~BnyfAUH7#mGDU2g$!U97v0cSc4 zWvy-e#-1EqQvD=n6DX@>`bE`Bkd|(QQ{d0SqdTU@TcP59r92255oE+M z>aJkFUwm3QKE$v6A(K*E{D2Xsr?FS$Bib#e_2dy7W@4^v6^<|F+02k&5Gf5)$t{$r z1^ZX*fqh?a^hEA4G$a*7+_Pj~id`{d48V{pi`d;Yf>y74%37A9&mhCu`e3?)hf~R1 z4~=0g_#e*k%CgFBuyp}v>oCNuF?2@Jo9$O!LSOH;d`vszvU%&7N$+JmR39o}qNPiA zLCO^OK2qOuUhB6Y;}0r>C&9w&bnFvU7n4rAtH=WDVHI752=(TVy@8L#+h8{MHImab zI^fCPjsZkd3jS))>I0lsRQc~JHzjntk2dZERWo3g@X(mz9=8$WowHPLdrLZ9Q(^M_ z4oaMw;0e+4S25Mwcz}M}B8He<@z-a0ocM>^wfi|{aLBJb+#M>1*waLRrl~?5$q(P_ z1PQtMdxehgOmmHpbEk6PkAGoJWRK$xgRQg4H{IFXPe|R-N~wLxNxI2hzXCP^;T7hK zkKi|2;b_L={mBoAh8b9-yfG=8uxV&~c@jWUDWGdbS)|KVI#}a*4dDJ(gLxye2(1TZ zf<4wjy<@2^300%y8iTk({OTVaqgZJ2Sp;f&;50(2y{>Jn`KS56$+_S7L@*vV8kC!) z6m}J;P1k@f-jutFn)`tzuTem^E=aH4?GR&Yi4)ZYj4sYe-3}v_W(ZP3qhzQpB2WKp z{Q5m*{`e%d*y8Jz?H)KPN0wC}S)rkNn*YhQKQ1@HDh(xIER2;_bWHfOq}P+&9alc# zAd_`)EZEBHs~w!gg^cd@uuYMaV=7p!!|7#>X`K8o!XCcuu9|KCT4H5CxnzIL=uxHE z8z5{T;rN!G%@uOQaFNQxJ-p>7UL^e}NA}S9`}BZ|_4V-4#vG@&!4G zYcfL8e7lRLly+oL(DOry{zPKH;pb<2nQLIU@R2OOR-N=2;&f%J`ASz6?~OhS+R%& zc@z8c>Wq=f@vtggqp;m`z2IBhZ;lZ9dr`ossg`CDyL}}-eD52tpwyK95>7FL^4+T} z#>*59Fqixr1BCP11*1aDvAp9kLtn;7nPr`>K+y>F5(IeJiaAzN6p0HP{dShWR$cT< zcKfW@EF`mmPE;-n=oo~TnVCkmOWSQKPO+O-Ai1eJb(aB?Ex#8l5SEe5UUR&|KkZ;j zJ1*o|0yo7MN5e z;eZS>d?~aslnp7k-c6KJjk>#*+CLOz1+(x*>U3EF8+tD~6+N5UTpJ`6&X&139z6kJ zmtmB%7w1kKDemgRkX{M?jn%4@z;BMXdRq~kwq%!BLHFa%>`@}d34#x^x=tEoukVE2 zyAhUNAs-UAAAF7qH-AY&y~3CXxs1h@a2WQAe*e_8oPrx)R9$O3mU(oi1j)rFiRcU) zS}59gW&?q}HM&vCZl31zC_@)^?em?mRhf2}qJQjnpdM5pK+xfD%;G$*xN79XwhKqo zbyrjAKppN@rq0e@ZDM1W&9xw1PHQU@j=1`C#sgsMY^czJbceP8>5P>6H9aqIqzp|T znXWqr*s{1po!vhZf6!ZKde(}+(Fu7Qu*_>3Om`PS5{BS(;2tVGf3D|k~cZH*Fu7z^p6uZb-9@sCxC3k^$GWrVrzo6ruHkh<7Ltg%;a3?@1IW3a@ zenNM_JKL>a+*nh0R+Yb4y`L3+r`xkAy?{~G)FwAiP>vQ@0%%ijIY_CQ*X zsE2CD?K7syS(z+wn8e5m`)NQd9rgB=!ezoTDIHGfcX%n^N1CN>^%~6XR=nj;#_8DC zIE$1+y8h!-#7$(4ym7ZJE$KW~irk#*$)8O5JZ@2TU%Rcg-Y<-nzW6rX6uT%vMntd* z7YmtRLb}Tr{sGYwK3dQT_;{d!mk9EdN&ur^%YHiYkD33{|K-0HmrsGumEub}wx^{X{3$->pp4@E8jiunP&9rDd@LYby z<)6nIbxS|_XX*S8a+OqLLa)Hf3TgmCQ@wtb?=yQhST2#cEe(dn6O+^kCXriA)}84o z?H*i5al+PN=#nF(qpgiMB!qE;gmz)v1;>bH0{1o3bQn9zL zU*2l(Ok;G%(FhxNv2{8z{Blv+EbQ?!wZen0&U#b!s`i9GPgg}nz8z(p*_c}~zXYa0N=?v4a z7`HMi^dyuCKvQ)roqdo%Ip~Sl>b!uPd6^9OpRqH{c`C?)`L_f&)8yF;-u+ce@2mqn z(+>$#tK#wdpDkBL%c>u$73gkll|$z*TH98*45F63fU2SM9wRspbj<_X&#K3=6Rw+u z$~C=`w|p*$3Hxs~qxtE2QG3Bhg-XKDk7N_VEq3=@D}-M$f@Al83tDxlO&hFhtnZCY z;a01^qKrdAtEfQoLCk)Jx1Wz%a725m{?S0uilJ`IaNP2(Rh6qVRX;5*hx9MMA&fzRtc9)CC2u#eTqm=eQb+)4Yia3)t&DG z^_pKMm7!qGkgXNNAeCpbp&vK(VgnL4R!!78clWZih2pStg2^=Kl(1U2xPmi^q65W% z`dGJ}+vaSw=Y^*<1i)A)I>;(_Pc*fbOE`~IKBz0S-%+0+QE;4pQkHsWp+7j~iGLIt zS1XEF3T}TT$H0SL^=FwBbdePJZGKR#4Q=^u1g>N$x~A(a(CHdIlDw}FE^JIyk6|g4 zncRQC_BPWL>~`gNL|RKwUtyVkD zswKbq@kcduXi6R$KbhN+Z>rNsgU&bINgoj?8I;aZn^;8h~B{W4jfwX{v_6ii1wpJ#*v=dK(} z9o_pQ8$jXDf%SN8_6u)Q&}}Ro$YiyayneqPq%lkGp-}+-G|Nr!msr{)=@T9ua^gh;E^FS}rZE?y#KHRFPOa+DgWzDN;+x`p|Waw3agnP!|J z-wusK*Lld-_>yQS2^^<4wRIm{JT<7P(jfb z$xF+zsgtVO(#4-rtC4-<|BMo>oMSOF=7XlSU_2wsr$pY^V)zG-&fpy5|6LgZ;9N}q z^J*3Ih)+-)*gD~3u0}P1P0w~0<6TAn=L(BG3mHHXB=^yFn5tn6Sxbx@-+mi&luW??f4TZln{xoEOt64$xp-64M*Uwn^y7Qw7nwy--5+nh^S-N*dhpeF zGGF)DCS^D8o-nRprHf`A*!$=tj^r>{vskmdHoL=sqO~hwpwRJ*vBwWgljKIss@``r z=ts}Fvm&V9#1BwNyKJgO@R574)z-~@_Qt9bhGAO)tM3)6~P7Cz`PaefVB@EE-n{tXL0fgh1w$n~B0$Xn?IQ>EOL2HcamwKK88c;^Q# zeBp@^UizQbMBs6JJVJa06&ZMh2jE+N7o}%9OZWD3H#hnLKdX@??F#MsaYqNx|3Rng z1YMeQ^I6}W$DbS$Y^j8^R3sxN>gip>q*DLdvi28+&0J&Wonf+i5{Vb&O(bPpxP6^ z_Fgx)YCP?G0;4zct0N@tiepJ&;T@W20Ma~}yR=4kK=;VDZuoa?SS$gQylq3JLeFFxcJV&3NF4bqb7N2M1}1hmU~MfNQ|*3@V0)shVnhmF3b>H)oRU6N#g zdQVl6=g{T8VuO?dJ`1RVV!7(!>0k7c9M((gm;{w_<)Yml zb#iIGwpUydpxS`D=Vzj&tBjN($={9v?uXrVe9O?Zxk1 z#oSDS%(}i$<|%p?)U`;0!HE8HEWsBGjQ1R?NNiZdKen;wKXT@VHF$T?f(|?KYlnj1 zU_qbkWv~X3ZTz$LO#1f#bu>2zv5NAD&cenb7FcXq z9oix(xqd0#f6t)=!WIvZ*V!bNz-x~_2@{5S!NrqZG>2U&ErqFih6MrH`dwxB!GBNx zkiW|!dJ{qQ?B5RcxYqvX=E;e?CHu;%PJ$-=BquS@!@pt z=GH+G(-m)L{Uo4Xp($sTicI#mkJQzXYLO4g90iR079*3gc<=wZ1}A-u&T4yYY{su; zHJql5%?(n6%0H|E17Ol86Teq>X$|GNBVT^gF)Q^kE#xnl>B#K&{;#GGO^fac|HjQq z@^V!Bhi4Y5X3f8)<&yiaGb{)Zs9M!-KZz0|WtIj3o0`F8mFF*7lp`-~QbiAlB=Am> z;|Hd$Hbq(}`_)J(K!TJp5@g%yA%|o(_a%om2B+(wJxS0c$VhtxtBet5WS~Ch{?F)j zW$h54Q0v|1{ls)v=uWpUqLsV0$4llHzz6TgnDCm&+-2AU!$oTsYvVTMhH%D$+QowM z5{=Fs(a|#wGV253vVrI|UHo1syqT{su(&&do0}3|!?!oHK*&psz=NxqOo>eoI!DgZ z&QJjkLelEG>}~T{TP6E-q({u#|C&V7#^ZaJ6^?LJQUylO52@!(PbIWW5~!@d;Ak6L z2Q)Sgn#CZn8L$&S(9Su=H{AaIX^^(xwo8!spU6M^$oG9Y&lBdDSwlu|2ElsSk$g;T zj+7GHjnD%PJAx&`t|7a^C*xgHr_vn)=}NBWG0KZBIpRPlnRXov|zDaeXOQ)Gtq7Bc3}B zJtP>;lYIK1ssd*D7LfRH^LM1LBbmq8@e7~zcnl>^GTXbg{=viCzS2l9u4+x$!6#H$ zGc77NLw5VJTq4nHScKQWf~Y3r6&Wdg_>&h^cMAT!h%CBxR#XgzEbNZiKZuFq&V$;T z-E;V${s|ALJ{tys`sGMwUr3L$4qR2Y%qMI4vzfCi%WTxzyV&wh9ziDFp{|r>EkBJA zN25$=X`iLIjeJ78oJM_6Dc|$1BpZxo+LfWie(7K4D~Fknzt43O&G~DEX-MXRIk~?X z@Agnn3OnUopA?e0J2#UG(Mwv!;&PsFehPU@p)w`2^^1_FuO>;CQJA5wYJ=C>MOp}% zNL$nWb-8tp!_X=^#7+IAWdw5+=lx_djIw1A+w2h~wXuJDDQp8l1X$^GsY#3D!4bKCvfOCS!IEt< z)IC5C{;-c{YC7Dsv)!2XgfH7<(N8N6ndg;XR2QkI_~M0?7pvRmM5FNx?Tz=qh#UQ4 zhW3I>h$?2h9nVrncWK@0z$%rUsuM}(jX%Nh%SopA6K8BlKQ4-04kOnlU0NK5i!>wN zgT5ZV%{I!M;oxKI7kYEYDKp1p_>@8IXIPQ!hZ~rwHdKm9=va_qR}wSBxS6DE{2IUF z99v&}KpqTZJXN5;d^*v~a9k@H)(F_|JoxXvVKf1f)f(z=$Rr|0&nsx6i|UHfu=io7LO#fq za6l_D`veFtq-L0NQ&kXPZtg(N{L^YMPdO-(pf|}v(Sn(;2FAG6zi#63V^?oq+%4~z z7?M>lyiWEz4Rng8o<)2b75TCk9TxJEN|;(=P0uS4_nc1)pp;9q2cEEmOt0BFsN-ny z-vsjHe;z|pPkiTi7cjl)vZ5vabeD7aTxnuaKZ_pPN>N(}n2*r0&nuc>$d_k=k?!B% z<+>~RdnFwAZkzPKBC&`?lhw=o(~y4oDNP*BG#Pl1$Gs^oGkn%x$Y1hZ^KGST#jR)T zF&j)HVSWjYTkU>8Kl1M`cjjxG<3A_%qesT-V;7d$=l7C(ZuaX3<}p^@!wZ>ZjrTh6 zR1c*Y@k+nAa;zEUP>5|LP|&R-Xt){JHe>g~Bq;{csQ?cr84GnDm1m1k{~R*!rHC>mI1=XGj#)SZLz^0@^|eD^rB;$+V4O zFCO(dWi^# zZ$HxTN|S7+7m;%W`f-&zmwuqH0D3)*)wA$$i|&m z<$2VZI}=X+eae3D(pLWHF*jBC;eg{-Unu2i&XK95CwpU=L@@Jyf<$lqcFa(I)BzvR zvD9Z+_!fI>wWt*0uKc0cFm||kTc}>R&ADuZJ7nw}yS9dO`qdlFZ!F|sRXqvd5-waW zJfJS~-!1XQkz-DV z_z2(G-dCC(&?~#&fK7XUN@QE}Ak)+T?59}UebsGjbEvI;ct!a3G*5On_NbCKT3?Oi zBLiH-i!?YK5=Kbhe~C;g<_#=!D~e=`2;KM7T4fjwk?2v()ma(7&KjbgmG{5s|29m0 z85&`bGd<#1A+;t3WC`stdSA>BquO9$YUEp{_WEK@ny>R=n{Ul{@wv6l%4dD@(trbl z?kIgrz^#2QrI%-LuLuV_q@*x#75bI(C6S(Pm#Q$NeRV!2@h5{phVXcnOr{$8GXxyB z$tJG;9K}22`-gKVxZ9D3H@n)=CB-0@yYl>8=+@RgVJBdQZd1s3<&{*!V_RnxBQd5A zX#PEA5rkt?JR*o@BX2`nF}HM+i=-+DnI!^sUFbP<%cer3pRW)3^{8v$L_9tCTm}ap z42GS_DtDN__v_iGLnK;QcT|r8OmiUNBIUxOung05%It=*2sxkyt0eU<;U`J$o8&9$ zOi(9Z;Z-AviQCumZYB)rPvnnP!4tUcUMAjyNRZSh?R8836B)$SJuz_A5ssfmu=dtb zpX-hSVBw!Sxf2rLyn%9F(0m#aPWaR#W=GgClAc5xXILSgubE@Rb245ozQF2Qs~!mH zJvbutw!<@Iz-tRw-JI0O?HLk`laOOM1?XC%X(4?y2?J^I1>pf9ZV-5kE_gdSD#Pcb zoYFC>!#J$rt(nDI@2jnV1S^47^n(a`wQb)&BfWh$I_m5cgRjn_JVxRRwn_9PIzEkq zGHW-O4VER&5{P$e@K2NVxN2QrCf}(;U2i@qB(&F#^o0?73AC)@si=PX>ATP|!+D$DgzFOH9grXl7_(2VD!>}K*k*m)C@Ik&1fjliCJw6g#3`OZ;Q2%&Tn!8 zMX$7+l`00q#N3b^Dd>*x8PqQGwo6-vzs3&5+MG*-lz&R=m1l&YsjG(b1K8%0D;#Q7 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 literal 0 HcmV?d00001 diff --git a/packages/vstory/demo/src/assets/scene4/title-decoration.png b/packages/vstory/demo/src/assets/scene4/title-decoration.png new file mode 100644 index 0000000000000000000000000000000000000000..a7254ec311a4a75e324e99ffa2714cbe47dac4fb GIT binary patch literal 2871 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 J { + const id = 'Appear'; + + useEffect(() => { + try { + const chartSpecList = [ + { + title: 'Timeline Chart', + characterType: 'RangeColumnChart', + options: { + title: { + text: 'Timeline Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'id0', + values: [ + { type: 'a', value: 0.36, value2: 0.06 }, + { type: 'b', value: 0.66, value2: 0.26 }, + { type: 'c', value: 0.4, value2: 0.0 }, + { type: 'd', value: 0.6, value2: 0.2 } + ] + } + ], + + direction: 'horizontal', + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + minField: 'value', + maxField: 'value2', + yField: 'type', + bar: { + maxWidth: 2, + style: { + maxWidth: 2 + } + }, + label: { + style: { + visible: false + } + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + domainLine: { visible: true }, + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + domainLine: { visible: false }, + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Bar Chart', + characterType: 'BarChart', + options: { + title: { + text: 'BarChart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + x: 'Mon', + y: 100, + type: '销售额' + }, + { + x: 'Tues', + y: 66, + type: '销售额' + }, + { + x: 'Wed', + y: 95, + type: '销售额' + }, + { + x: 'Mon', + y: 43, + type: '利润' + }, + { + x: 'Tues', + y: 80, + type: '利润' + }, + { + x: 'Wed', + y: 68, + type: '利润' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: ['x', 'type'], + yField: 'y', + seriesField: 'type', + bar: { + style: { + fill: { + gradient: 'linear', + stops: [ + { + offset: 1 + }, + { + offset: 0, + opacity: 0.6 + } + ] + } + }, + state: { + selected: { + stroke: '#000', + strokeWidth: 1 + } + } + }, + label: { + style: { + visible: false + } + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + color: ['#4CC9E4', '#4954E6'] + } + }, + { + title: 'Line/Area Chart', + characterType: 'AreaChart', + options: { + title: { + text: 'Line/Area Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { x: 1, y: 70, type: 'a' }, + { x: 2, y: 20, type: 'a' }, + { x: 3, y: 30, type: 'a' }, + { x: 4, y: 10, type: 'a' }, + + { x: 1, y: 70, type: 'b' }, + { x: 2, y: 20, type: 'b' }, + { x: 3, y: 30, type: 'b' }, + { x: 4, y: 10, type: 'b' } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: 'x', + yField: 'y', + seriesField: 'type', + point: { + visible: false + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Pie Chart', + characterType: 'PieChart', + options: { + title: { + text: 'Pie Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + value: 348, + name: '中介渠道: 34.8%' + }, + { + value: 152, + name: '会员: 15.2%' + }, + { + value: 500, + name: '散客: 50%' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { valueField: 'value', categoryField: 'name', radius: 1, innerRadius: 0 } + } + ] + } + }, + { + title: 'Scatter Chart', + characterType: 'ScatterChart', + options: { + title: { + text: 'Scatter Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { x: 1, y: 70, type: 'a' }, + { x: 2, y: 20, type: 'a' }, + { x: 3, y: 30, type: 'a' }, + { x: 4, y: 10, type: 'a' }, + + { x: 1, y: 70, type: 'b' }, + { x: 2, y: 20, type: 'b' }, + { x: 3, y: 30, type: 'b' }, + { x: 4, y: 10, type: 'b' } + ] + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: 'x', + yField: 'y', + seriesField: 'type', + point: { + style: { + size: 4 + } + } + } + } + ] + } + }, + { + title: 'Rose Chart', + characterType: 'RoseChart', + options: { + title: { + text: 'Rose Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + value: 348, + name: '中介渠道: 34.8%' + }, + { + value: 152, + name: '会员: 15.2%' + }, + { + value: 500, + name: '散客: 50%' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { valueField: 'value', seriesField: 'name', categoryField: 'name', radius: 1, innerRadius: 0 } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'radius' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'angle' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Radar Chart', + characterType: 'RadarChart', + options: { + title: { + text: 'Radar Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { + theta: 0, + type: 'A', + value: 833 + }, + { + theta: 1, + type: 'A', + value: 898 + }, + { + theta: 2, + type: 'A', + value: 672 + }, + { + theta: 3, + type: 'A', + value: 889 + }, + { + theta: 4, + type: 'A', + value: 889 + }, + { + theta: 5, + type: 'A', + value: 658 + }, + { + theta: 6, + type: 'A', + value: 822 + }, + { + theta: 7, + type: 'A', + value: 825 + }, + { + theta: 0, + type: 'B', + value: 659 + }, + { + theta: 1, + type: 'B', + value: 896 + }, + { + theta: 2, + type: 'B', + value: 822 + }, + { + theta: 3, + type: 'B', + value: 874 + }, + { + theta: 4, + type: 'B', + value: 742 + }, + { + theta: 5, + type: 'B', + value: 878 + }, + { + theta: 6, + type: 'B', + value: 643 + }, + { + theta: 7, + type: 'B', + value: 604 + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + categoryField: 'theta', + valueField: 'value', + seriesField: 'type', + line: { + style: { + strokeWidth: 2 + } + }, + legends: { + visible: false + }, + label: { + visible: false + }, + animationAppear: { + preset: 'clipIn' + }, + point: { + style: { + size: 2, + strokeWidth: 1 + } + }, + startAngle: 90 + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'radius' }, + spec: { + domainLine: { visible: true, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: true } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'angle' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Word Cloud', + characterType: 'WordCloudChart', + options: { + title: { + text: 'Word Cloud', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + challenge_id: 1658490688121879, + challenge_name: '宅家剧场', + sum_count: 128 + }, + { + challenge_id: 1640007327696910, + challenge_name: '我的观影报告', + sum_count: 103 + }, + { + challenge_id: 1557656100811777, + challenge_name: '抖瓜小助手', + sum_count: 76 + }, + { + challenge_id: 1553513807372289, + challenge_name: '搞笑', + sum_count: 70 + }, + { + challenge_id: 1599321527572563, + challenge_name: '我要上热门', + sum_count: 69 + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + valueField: 'sum_count', + seriesField: 'challenge_name', + nameField: 'challenge_name', + wordCloudConfig: { + drawOutOfBound: 'clip' + }, + maskShape: 'circle', + fontSizeRange: [5, 8] + } + } + ] + } + }, + { + title: 'TreeMap Chart', + characterType: 'TreeMapChart', + options: { + title: { + text: 'TreeMap Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + name: 'Second', + children: [ + { + name: 'B2', + value: 98 + }, + { + name: 'B3', + value: 56 + } + ] + }, + { + name: 'First', + children: [ + { + name: 'A2', + value: 60 + }, + { + name: 'A3', + value: 30 + } + ] + }, + { + name: 'Third', + children: [ + { + name: 'C1', + value: 33 + }, + { + name: 'C2', + value: 30 + }, + { + name: 'C3', + value: 40 + } + ] + }, + { + name: 'Fourth', + children: [ + { + name: 'D4', + value: 64 + }, + { + name: 'D5', + value: 60 + } + ] + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + categoryField: 'name', + valueField: 'value', + legends: { visible: false }, + nodePadding: 1, + nonLeaf: { + visible: false + }, + nonLeafLabel: { + visible: false + }, + label: { + visible: false + } + } + } + ] + } + }, + { + title: 'Sunburst Chart', + characterType: 'SunburstChart', + options: { + title: { + text: 'Sunburst Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + name: 'Grandpa', + children: [ + { + name: 'Uncle Leo', + value: 15, + children: [ + { + name: 'Cousin Jack', + value: 2 + }, + { + name: 'Cousin Mary', + value: 5, + children: [ + { + name: 'Jackson', + value: 2 + } + ] + }, + { + name: 'Cousin Ben', + value: 4 + } + ] + }, + { + name: 'Father', + value: 10, + children: [ + { + name: 'Me', + value: 5 + }, + { + name: 'Brother Peter', + value: 1 + } + ] + } + ] + }, + { + name: 'Nancy', + children: [ + { + name: 'Uncle Nike', + children: [ + { + name: 'Cousin Betty', + value: 1 + }, + { + name: 'Cousin Jenny', + value: 2 + } + ] + } + ] + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + offsetX: 0, + offsetY: 0, + categoryField: 'name', + valueField: 'value', + outerRadius: 1, + innerRadius: 0, + label: { + visible: false + } + } + } + ] + } + } + ].map(item => ({ + ...item, + options: { + ...item.options, + panel: { + fill: 'white', + shadowColor: 'rgba(0, 0, 0, 0.05)', + shadowBlur: 10, + shadowOffsetX: 4, + shadowOffsetY: 4 + } + } + })); + + const tempSpec = { + characters: [ + ...chartSpecList.map((item, i) => ({ + type: item.characterType ?? 'CharacterChart', + id: `chart${i}`, + zIndex: 1, + position: { + top: i < 5 ? 50 : 570, + left: 100 + (i % 5) * 170 + 20, + width: 110, + height: 110 + }, + options: { + spec: item.spec, + // data: data1, + // @ts-ignore + attribute: {}, + // @ts-ignore + ...(item.options ?? {}) + } + })) + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + { + id: 'scene1', + actions: [ + ...new Array(10).fill(0).map((_, i) => ({ + characterId: `chart${i}`, + characterActions: [ + { + startTime: i * 300 + 500, + duration: 1000, + action: 'appear', + payload: { + animation: { + duration: 1000, + easing: 'cubicIn', + move: { + from: 'top' + }, + fade: { + opacity: 1 + } + // FIX: not working + // scale: { + // ratio: 1.5 + // } + } + } + } + ] + })), + ...new Array(10).fill(0).map((_, i) => ({ + characterId: `chart${i}`, + characterActions: [ + { + startTime: i * 300 + 500 + 2000, + duration: 1000, + action: 'disappear', + payload: { + animation: { + duration: 1000, + easing: 'cubicOut', + move: { + to: 'right' + }, + fade: { + opacity: 0 + } + // FIX: not working + // scale: { + // ratio: 1.5 + // } + } + } + } + ] + })) + ] + } + ] + } + ] + }; + console.log('debug tempSpec', tempSpec); + const story = new Story(tempSpec as IStorySpec, { dom: id }); + story.play(); + } catch (e) { + console.error(e); + } + }, []); + + return

    ; +}; diff --git a/packages/vstory/demo/src/demos/AreaWithTag.tsx b/packages/vstory/demo/src/demos/AreaWithTag.tsx new file mode 100644 index 0000000..e747eee --- /dev/null +++ b/packages/vstory/demo/src/demos/AreaWithTag.tsx @@ -0,0 +1,160 @@ +import React, { useEffect } from 'react'; +import VChart, { IAreaChartSpec } from '@visactor/vchart'; +import { StoryArea } from '../../../src/dsl/story-chart'; +import { StoryExecutor } from '../../../src/dsl/story-executor'; + +const values = [ + { type: 'Nail polish', country: 'Africa', value: 4229 }, + { type: 'Nail polish', country: 'EU', value: 4376 }, + { type: 'Nail polish', country: 'China', value: 3054 }, + { type: 'Nail polish', country: 'USA', value: 12814 }, + { type: 'Eyebrow pencil', country: 'Africa', value: 3932 }, + { type: 'Eyebrow pencil', country: 'EU', value: 3987 }, + { type: 'Eyebrow pencil', country: 'China', value: 5067 }, + { type: 'Eyebrow pencil', country: 'USA', value: 13012 }, + { type: 'Rouge', country: 'Africa', value: 5221 }, + { type: 'Rouge', country: 'EU', value: 3574 }, + { type: 'Rouge', country: 'China', value: 7004 }, + { type: 'Rouge', country: 'USA', value: 11624 }, + { type: 'Lipstick', country: 'Africa', value: 9256 }, + { type: 'Lipstick', country: 'EU', value: 4376 }, + { type: 'Lipstick', country: 'China', value: 9054 }, + { type: 'Lipstick', country: 'USA', value: 8814 }, + { type: 'Eyeshadows', country: 'Africa', value: 3308 }, + { type: 'Eyeshadows', country: 'EU', value: 4572 }, + { type: 'Eyeshadows', country: 'China', value: 12043 }, + { type: 'Eyeshadows', country: 'USA', value: 12998 }, + { type: 'Eyeliner', country: 'Africa', value: 5432 }, + { type: 'Eyeliner', country: 'EU', value: 3417 }, + { type: 'Eyeliner', country: 'China', value: 15067 }, + { type: 'Eyeliner', country: 'USA', value: 12321 }, + { type: 'Foundation', country: 'Africa', value: 13701 }, + { type: 'Foundation', country: 'EU', value: 5231 }, + { type: 'Foundation', country: 'China', value: 10119 }, + { type: 'Foundation', country: 'USA', value: 10342 }, + { type: 'Lip gloss', country: 'Africa', value: 4008 }, + { type: 'Lip gloss', country: 'EU', value: 4572 }, + { type: 'Lip gloss', country: 'China', value: 12043 }, + { type: 'Lip gloss', country: 'USA', value: 22998 }, + { type: 'Mascara', country: 'Africa', value: 18712 }, + { type: 'Mascara', country: 'EU', value: 6134 }, + { type: 'Mascara', country: 'China', value: 10419 }, + { type: 'Mascara', country: 'USA', value: 11261 } +]; + +export const AreaWithTag = () => { + const id = 'areaWithTag'; + + useEffect(() => { + // 准备一个图表 + const spec: IAreaChartSpec = { + type: 'area', + theme: 'dark', + data: [ + { + id: 'data', + values: [] + } + ], + height: 500, + padding: { left: 50, right: 50 }, + title: { + visible: true, + text: '100% stacked area chart of cosmetic products sales' + }, + percent: true, + xField: 'type', + yField: 'value', + seriesField: 'country', + axes: [ + { + orient: 'left', + visible: false + }, + { + orient: 'bottom', + trimPadding: true + } + ] + }; + + const chartInstance = new VChart(spec, { + dom: id + }); + + chartInstance.renderSync(); + + // 创建叙事 + const area = new StoryArea(); + + const markPoint = area.createMarkPoint( + { + type: 'Nail polish', + value: 0.05 + }, + { + itemContent: { + offsetY: -10, + offsetX: -30, + type: 'text', + autoRotate: false, + text: { + text: '5%', + dx: -10, + style: { + fill: 'black', + fontSize: 14, + fontWeight: 'bold' + }, + labelBackground: { + padding: [5, 10, 5, 10], + style: { + fill: 'rgb(122,209,182)', + cornerRadius: 20 + } + } + } + }, + itemLine: { + endSymbol: { + visible: false + }, + startSymbol: { visible: false }, + line: { + style: { + visible: false + } + } + } + } + ); + + // 数据 + const usaData = values.filter(v => v.country === 'USA'); + const chinaData = values.filter(v => v.country === 'China'); + const EUData = values.filter(v => v.country === 'EU'); + const africaData = values.filter(v => v.country === 'Africa'); + + area.add({ id: 'data', values: usaData }); + area.add({ id: 'data', values: EUData }); + + markPoint.flicker(); + + area.add({ id: 'data', values: chinaData }); + area.add({ id: 'data', values: africaData }); + + // TODO: executor 接口需要调整 + const storyPlayer = new StoryExecutor(area, { + chartInstance, + spec + }); + + storyPlayer.play(); + + return () => { + chartInstance.release(); + }; + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/DisAppear.tsx b/packages/vstory/demo/src/demos/DisAppear.tsx new file mode 100644 index 0000000..eb4250c --- /dev/null +++ b/packages/vstory/demo/src/demos/DisAppear.tsx @@ -0,0 +1,212 @@ +import React, { useEffect } from 'react'; +import { IStorySpec } from '../../../src/story/interface'; +import { Story } from '../../../src/story/story'; +import '../../../src/story/index'; +import Scene3ChartImage1 from '../assets/scene3/chart-1.png'; + +export const DisAppear = () => { + const id = 'DisAppear'; + + useEffect(() => { + try { + const bgCharacters = [ + { + type: 'ImageComponent', + id: 'bg-1', + zIndex: -1, + position: { + top: 0, + left: 0, + width: 960, + height: 600 + }, + options: { + graphic: { + image: Scene3ChartImage1 + } + } + }, + { + type: 'LineComponent', + id: 'bg-2', + zIndex: -1, + position: { + top: 200, + left: 400, + width: 100, + height: 15 + }, + options: { + graphic: { + lineWidth: 15, + points: [ + { x: 0, y: 0 }, + { x: 100, y: 0 } + ] + } + } + }, + { + type: 'LineComponent', + id: 'bg-3', + zIndex: -1, + position: { + top: 400, + left: 600, + width: 100, + height: 15 + }, + options: { + graphic: { + lineWidth: 15, + points: [ + { x: 0, y: 0 }, + { x: 100, y: 0 } + ] + } + } + } + ]; + + // 第一个背景 + const bg1Actions = [ + { + startTime: 100, + action: 'appear', + payload: { + animation: { + duration: 1000, + easing: 'cubicOut', + scale: { + ratio: 0.25 + } + } + } + } + ]; + + // 第二个背景 + const bg2Actions = [ + { + startTime: 100, + action: 'appear', + payload: { + animation: { + duration: 3000, + easing: 'linear', + scale: { + ratio: 1 + }, + move: { + from: 'bottom', + isVariableSpeed: true + } + } + } + }, + { + startTime: 3100, + action: 'disappear', + payload: { + animation: { + duration: 3000, + easing: 'linear', + fade: { + opacity: 0.5 + }, + move: { + to: 'right', + isVariableSpeed: true + }, + scale: { + ratio: 0.5 + } + } + } + } + ]; + + // 第三个背景 + const bg3Actions = [ + { + startTime: 100, + action: 'appear', + payload: { + animation: { + duration: 3000, + easing: 'linear', + scale: { + ratio: 1 + }, + move: { + from: 'bottom', + isVariableSpeed: true + } + } + } + }, + { + startTime: 3100, + action: 'disappear', + payload: { + animation: { + duration: 3000, + easing: 'linear', + fade: { + opacity: 0.5 + }, + move: { + to: 'right', + isVariableSpeed: true + }, + scale: { + ratio: 0.5 + } + } + } + } + ]; + + const tempSpec = { + characters: [ + ...bgCharacters.map(item => { + return { + ...item + }; + }) + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + { + id: 'scene1', + actions: [ + { + characterId: 'bg-1', + characterActions: bg1Actions + }, + { + characterId: 'bg-2', + characterActions: bg2Actions + }, + { + characterId: 'bg-3', + characterActions: bg3Actions + } + ] + } + ] + } + ] + }; + console.log('debug tempSpec', tempSpec); + const story = new Story(tempSpec as IStorySpec, { dom: id }); + story.play(); + } catch (e) { + console.error(e); + } + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/RankingBar.tsx b/packages/vstory/demo/src/demos/RankingBar.tsx new file mode 100644 index 0000000..fb51d6a --- /dev/null +++ b/packages/vstory/demo/src/demos/RankingBar.tsx @@ -0,0 +1,87 @@ +import React, { useEffect } from 'react'; + +import { Bar } from '../../../src/template/charts/simple-chart'; +import { Scene } from '../../../src/scene'; +import { Title, textWriter } from '../../../src/component/title'; + +import { RankingBar as RankingBarChart } from '../../../src/template/ranking-bar/ranking-bar'; +import { yearsData, countryImage } from '../../data/ranking-bar'; + +export const RankingBar = () => { + const domId = 'ranking'; + useEffect(() => { + const allData: any[] = []; + yearsData.forEach(value => { + allData.push(...value); + }); + + const scene = new Scene({ + dom: domId + }); + const rankingBar = new RankingBarChart({ + data: allData, + timeField: 'Year', + xField: 'Value', + yField: 'CountryName', + icon: Array.from(countryImage).reduce((obj: any, [key, value]) => { + obj[key] = value; + return obj; + }, {}), + // iconPosition: 'bar-end', + // duration: 30000, + interval: 400, + // iconShape: 'rect', + // iconPosition: 'axis', + color: { + China: 'red', + USA: 'rgb(0,43,127)', + India: '#FF9933', + Russia: '#D52B1E', + Japan: 'rgb(79,66,95)', + Brazil: ' #009B3A', + Mexico: 'rgb(1,101,69)', + Indonesia: '#CE1126', + Italy: '#009246', + UK: 'rgb(27,63,126)', + Germany: '#000000', + France: '#0055A4', + Pakistan: '#006600', + Nigeria: '#008000' + }, + nameLabel: { + visible: true, + position: 'bar-start', + style: { + // fill: 'white' + } + }, + timeLabel: { + // visible: false + }, + yAxis: { + // domainLine: { + // stroke: 'red', + // lineWidth: 10 + // } + } + }); + (window as any).rankingBar = rankingBar; + + const title = new Title({ + text: 'A Ranking Bar Chart Demo', + x: 0, + y: 0, + textStyle: { + fontSize: 20 + } + }); + + scene.wait(800); + scene.play(textWriter(title, 1000)); + scene.wait(1200); + + scene.add(rankingBar); + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/SimpleBar.tsx b/packages/vstory/demo/src/demos/SimpleBar.tsx new file mode 100644 index 0000000..9c59592 --- /dev/null +++ b/packages/vstory/demo/src/demos/SimpleBar.tsx @@ -0,0 +1,81 @@ +import React, { useEffect } from 'react'; + +import { Bar } from '../../../src/template/charts/simple-chart'; +import { Scene } from '../../../src/scene'; +import { highlight } from '../../../src/animate/highlight'; +import { Title, textWriter } from '../../../src/component/title'; +import { yearsData } from '../../data/ranking-bar'; + +export const SimpleBar = () => { + const domId = 'simpleBar'; + useEffect(() => { + const allData: any[] = []; + yearsData.forEach(value => { + allData.push(...value); + }); + + const scene = new Scene({ + dom: domId + }); + + const bar = new Bar({ + type: 'bar', + width: 400, + height: 300, + data: [ + { + id: 'barData', + values: [ + { month: 'Monday', sales: 22 }, + { month: 'Tuesday', sales: 13 }, + { month: 'Wednesday', sales: 25 }, + { month: 'Thursday', sales: 29 }, + { month: 'Friday', sales: 38 } + ] + } + ], + xField: 'month', + yField: 'sales', + bar: { + id: 'bar', + state: { + highlight: {} + } + } + }); + + const title = new Title({ + text: 'A Bar Chart Demo', + x: 0, + y: 0, + textStyle: { + fontSize: 20 + } + }); + + scene.wait(800); + scene.play(textWriter(title, 1000)); + scene.wait(1200); + + scene.add(bar); + + // scene.wait(1000); + // const ani = highlight(bar, [{ month: 'Friday' }, { month: 'Monday' }], { fill: 'green' }); + // scene.wait(1000); + + // ani && scene.play(ani); + // scene.wait(2000); + + // const ani2 = highlight(bar, [{ month: 'Tuesday' }], { + // fill: 'red', + // shadowColor: 'rgba(0, 0, 0, 0.8)', + // shadowBlur: 10 + // }); + // ani2 && scene.play(ani2); + // scene.wait(1000); + // scene.remove(title); + // scene.remove(bar); + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryBarDemo.tsx b/packages/vstory/demo/src/demos/StoryBarDemo.tsx new file mode 100644 index 0000000..c9603b6 --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryBarDemo.tsx @@ -0,0 +1,358 @@ +import React, { useEffect } from 'react'; +import { IStorySpec } from '../../../src/story/interface'; +import { Story } from '../../../src/story/story'; +import '../../../src/story/index'; +import Scene3ChartImage1 from '../assets/scene3/chart-1.png'; + +export const StoryBarDemo = () => { + const id = 'DisAppear'; + + useEffect(() => { + try { + const values = [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ]; + const tempSpec = { + characters: [ + { + type: 'BarChart', + id: `bar`, + zIndex: 1, + position: { + top: 50, + left: 50, + width: 300, + height: 240 + }, + panel: { + fill: 'white', + shadowColor: 'rgba(0, 0, 0, 0.05)', + shadowBlur: 10, + shadowOffsetX: 4, + shadowOffsetY: 4 + }, + options: { + title: { + text: 'BarChart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: ['x', 'type'], + yField: 'y', + seriesField: 'type', + bar: { + style: { + fill: { + gradient: 'linear', + stops: [ + { + offset: 1 + }, + { + offset: 0, + opacity: 0.6 + } + ] + } + }, + state: { + selected: { + stroke: '#000', + strokeWidth: 1 + } + } + }, + label: { + style: { + visible: false + } + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + color: ['#4CC9E4', '#4954E6'], + attribute: {} + } + } + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + { + id: 'scene1', + actions: [ + { + characterId: 'bar', + characterActions: [ + { + action: 'appear', + startTime: 1000, + payload: { + animation: { + duration: 1000, + easing: 'cubicOut', + effect: 'grow', + fade: { + opacity: 1, + isBaseOpacity: true, + easing: 'linear' + } + } + } + }, + { + action: 'update', + startTime: 2000, + payload: { + id: 'data', + data: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ] + .slice(0, 4) + .map((v, index) => { + return { + sourceValue: v, + targetValue: { + ...v, + y: (index + 1) * 10 + } + }; + }) + } + }, + { + action: 'update', + startTime: 2500, + payload: { + id: 'data', + data: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ].map((v, index) => { + if (index % 2 === 0) { + return { + sourceValue: v, + targetValue: { + ...v, + y: (index + 1) * 10 + } + }; + } + return { + sourceValue: v, + targetValue: v + }; + }) + } + } + ] + } + ] + } + ] + } + ] + }; + console.log('debug tempSpec', tempSpec); + const story = new Story(tempSpec as IStorySpec, { dom: id }); + story.play(); + } catch (e) { + console.error(e); + } + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryBarDemoPlay.tsx b/packages/vstory/demo/src/demos/StoryBarDemoPlay.tsx new file mode 100644 index 0000000..6f736ef --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryBarDemoPlay.tsx @@ -0,0 +1,102 @@ +import React, { useEffect } from 'react'; +import VChart, { IChartSpec } from '@visactor/vchart'; +import { ManualTicker } from '@visactor/vrender-core'; +import { StoryBar } from '../../../src/dsl/story-chart'; +import { StoryExecutor } from '../../../src/dsl/story-executor'; + +// class Player { +// canvas: HTMLCanvasElement; +// dpr: number; +// width: number; +// height: number; +// constructor(canvas: HTMLCanvasElement, width: number, height: number) { +// this.canvas = canvas; +// this.dpr = window.devicePixelRatio; +// this.width = width; +// this.height = height; +// this.canvas.width = width * this.dpr; +// this.canvas.height = height * this.dpr; +// } +// addElements() { + +// } +// tickTo() { + +// } +// play() { + +// } +// } + +export const StoryBarDemo = () => { + const id = 'storyBar'; + + useEffect(() => { + // 准备一个图表 + const spec: IChartSpec = { + type: 'bar', + data: [ + { + id: 'data', + values: [{ value: 80, name: 'A' }] + } + ], + xField: 'name', + yField: 'value', + bar: { + state: { + updateStyle: {} + } + }, + animationUpdate: { + duration: 500 + } + }; + + const chartInstance = new VChart(spec, { + dom: id + }); + + // chartInstance.renderSync(); + + // 创建叙事 + const bar = new StoryBar(); + + // 数据 + const data = [ + { key: 'a', value: 80, name: 'B' }, + { key: 'b', value: 120, name: 'C' }, + { key: 'c', value: 100, name: 'D' }, + { key: 'd', value: 300, name: 'E' } + ]; + + data.forEach(val => { + bar.add(val, { + style: { + fillOpacity: 0.5 + } + }); + }); + + data.reverse().forEach(val => { + bar.updateStyle(val, { + style: { + fill: 'red' + } + }); + }); + + const storyPlayer = new StoryExecutor(bar, { + chartInstance, + spec + }); + + storyPlayer.play(); + + return () => { + chartInstance.release(); + }; + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryEdit.tsx b/packages/vstory/demo/src/demos/StoryEdit.tsx new file mode 100644 index 0000000..3f619e1 --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryEdit.tsx @@ -0,0 +1,183 @@ +import React, { useEffect } from 'react'; +import { IStorySpec } from '../../../src/story/interface'; +import { Story } from '../../../src/story/story'; +import { Edit } from '../../../src/edit/edit'; +import '../../../src/story/index'; +import { cloneDeep } from '@visactor/vutils'; +import { CommonEditComponent } from '../../../src/edit/edit-component/common'; +import { BoxSelection } from '../../../src/edit/edit-component/box-selection'; + +Edit.registerEditComponent('common', CommonEditComponent); +Edit.registerEditComponent('box-selection', BoxSelection); + +export const StoryEdit = () => { + const id = 'storyBar'; + + useEffect(() => { + // 准备一个图表 + const tempSpec: IStorySpec = { + characters: [ + { + type: 'RectComponent', + id: 'test-graphics-0', + zIndex: 0, + position: { + top: 40, + left: 50, + width: 200, + height: 100 + }, + options: { + graphic: { + fill: 'red' + }, + text: { + text: 'haha', + fill: 'black' + }, + angle: 0, + shapePoints: [] + } + }, + { + type: 'RectComponent', + id: 'test-graphics-1', + zIndex: 0, + position: { + top: 40, + left: 250, + width: 200, + height: 100 + }, + options: { + graphic: { + fill: 'red', + visible: false + }, + text: { + text: 'title2', + fill: 'black' + }, + angle: 0, + shapePoints: [] + } + }, + { + type: 'BarChart', + id: 'test-chart-0', + zIndex: 0, + position: { + top: 200, + left: 100, + width: 400, + height: 400 + }, + options: { + title: { + text: 'Timeline Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'id0', + values: [ + { type: 'a', value: 0.36, value2: 0.06 }, + { type: 'b', value: 0.66, value2: 0.26 }, + { type: 'c', value: 0.4, value2: 0.0 }, + { type: 'd', value: 0.6, value2: 0.2 } + ] + } + ], + direction: 'vertical', + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: 'type', + yField: 'value' + } + } + ] + } + } + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + { + id: 'scene0', + actions: [ + { + characterId: 'test-graphics-0', + characterActions: [ + { + startTime: 0, + duration: 0, + action: 'appear', + payload: { + style: {}, + animation: { + duration: 0, + easing: 'linear', + effect: 'fadeIn' + } as any + } + } + ] + }, + { + characterId: 'test-graphics-1', + characterActions: [ + { + startTime: 0, + duration: 0, + action: 'appear', + payload: { + style: {}, + animation: { + duration: 0, + easing: 'linear', + effect: 'fadeIn' + } as any + } + } + ] + }, + { + characterId: 'test-chart-0', + characterActions: [ + { + startTime: 0, + duration: 0, + action: 'appear' + } + ] + } + ] + } + ] + } + ] + }; + const story = new Story(tempSpec, { dom: id }); + story.play(); + const edit = new Edit(story); + edit.emitter.on('startEdit', msg => { + if (msg.type === 'commonEdit' && msg.actionInfo.character) { + console.log(cloneDeep(msg.actionInfo.character.spec)); + msg.updateCharacter({ options: { graphic: { fill: 'green' } } }); + console.log(cloneDeep(msg.actionInfo.character.spec)); + story.play(); + } + }); + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryLineDemo.tsx b/packages/vstory/demo/src/demos/StoryLineDemo.tsx new file mode 100644 index 0000000..d6a242c --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryLineDemo.tsx @@ -0,0 +1,97 @@ +import VChart, { ISpec, IVChart } from '@visactor/vchart'; +import React, { useEffect } from 'react'; +import { StoryExecutor } from '../../../src/dsl/story-executor'; +import { StoryLine } from '../../../src/dsl/story-chart/line'; + +export const StoryLineDemo = () => { + const id = 'line'; + + useEffect(() => { + // 准备一个图表 + const dataId = 'data'; + // 数据 + const values = [ + { + time: '2:00', + value: 8 + }, + { + time: '4:00', + value: 9 + }, + { + time: '6:00', + value: 11 + }, + { + time: '8:00', + value: 14 + }, + { + time: '10:00', + value: 16 + }, + { + time: '12:00', + value: 17 + }, + { + time: '14:00', + value: 17 + }, + { + time: '16:00', + value: 16 + }, + { + time: '18:00', + value: 15 + } + ]; + const data = { + id: dataId, + values: values + }; + const spec = { + type: 'line', + data: data, + xField: 'time', + yField: 'value' + }; + + const chartInstance = new VChart(spec, { + dom: id + }); + + chartInstance.renderSync(); + + // 创建叙事 + const line = new StoryLine(); + line.setInstance(chartInstance as IVChart); + + values.forEach((val, index) => { + line.symbolStyle(val, { + size: 15 + 10 * index, + fill: 'red', + fillOpacity: Math.random() + }); + }); + + line.lineStyle(values[1], { + stroke: 'red' + }); + + const storyPlayer = new StoryExecutor(line, { + chartInstance: line.getInstance(), + spec + }); + + storyPlayer.play(); + + return () => { + chartInstance.release(); + }; + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryPieDemo.tsx b/packages/vstory/demo/src/demos/StoryPieDemo.tsx new file mode 100644 index 0000000..466a459 --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryPieDemo.tsx @@ -0,0 +1,72 @@ +import React, { useEffect } from 'react'; +import VChart, { IPieChartSpec } from '@visactor/vchart'; +import { StoryPie } from '../../../src/dsl/story-chart'; +import { StoryExecutor } from '../../../src/dsl/story-executor'; + +export const StoryPieDemo = () => { + const id = 'storyBar'; + + useEffect(() => { + // 数据 + const values = new Array(10).fill(0).map((d, i) => ({ + type: i + 1, + value: i + 1 + })); + const dataId = 'data'; + const data = { + id: dataId, + values: [] + }; + + // 准备一个图表 + const spec: IPieChartSpec = { + type: 'pie', + data: data, + outerRadius: 0.1, + valueField: 'value', + categoryField: 'type', + animationUpdate: { + duration: 300 + }, + label: { + visible: true + }, + animationAppear: { + duration: 300 + } + }; + + const chartInstance = new VChart(spec, { + dom: id + }); + + chartInstance.renderSync(); + + // 创建叙事 + const pie = new StoryPie(); + pie.setInstance(chartInstance); + + values.forEach((val, index) => { + pie.add({ id: dataId, values: val }, {}); + }); + + values.forEach((val, index) => { + pie.arcStyle(val, { + outerRadius: 100 + index * 10 + }); + }); + + const storyPlayer = new StoryExecutor(pie, { + chartInstance, + spec + }); + + storyPlayer.play(); + + return () => { + chartInstance.release(); + }; + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/StoryScene.tsx b/packages/vstory/demo/src/demos/StoryScene.tsx new file mode 100644 index 0000000..8ef071f --- /dev/null +++ b/packages/vstory/demo/src/demos/StoryScene.tsx @@ -0,0 +1,274 @@ +import React, { useEffect } from 'react'; +import { IStorySpec } from '../../../src/story/interface'; +import { Story } from '../../../src/story/story'; +import '../../../src/story/index'; + +const data0 = { + type: 'standard', + value: + '{"data":[{"State":"WY","Under 5 Years":25635,"5 to 13 Years":1890,"14 to 17 Years":9314},{"State":"DC","Under 5 Years":30352,"5 to 13 Years":20439,"14 to 17 Years":10225},{"State":"VT","Under 5 Years":38253,"5 to 13 Years":42538,"14 to 17 Years":15757},{"State":"ND","Under 5 Years":51896,"5 to 13 Years":67358,"14 to 17 Years":18794},{"State":"AK","Under 5 Years":72083,"5 to 13 Years":85640,"14 to 17 Years":22153}],"columns":["State","Under 5 Years","5 to 13 Years","14 to 17 Years"],"rows":["State","WY","DC","VT","ND","AK"]}' +}; + +const data1 = { + type: 'standard', + value: + '{"data":[{"2017":20,"year":"2017"},{"2017":18,"year":"2018"},{"2017":22,"year":"2019"},{"2017":23,"year":"2020"},{"2017":43,"year":"2021"},{"2017":21,"year":"2022"}],"columns":["year","2017"],"rows":["year","2017","2018","2019","2020","2021","2022"],"originData":[{"2017":"20","year":"2017"},{"2017":"18","year":"2018"},{"2017":"22","year":"2019"},{"2017":"23","year":"2020"},{"2017":"43","year":"2021"},{"2017":"21","year":"2022"}],"invalidCells":[]}' +}; + +export const StorySceneDemo = () => { + const id = 'storyBar'; + + useEffect(() => { + // 准备一个图表 + const tempSpec: IStorySpec = { + roles: [ + { + type: 'RectComponent', + id: 'test-graphics-0', + zIndex: 0, + position: { + top: 40, + left: 50, + width: 200, + height: 100 + }, + options: { + graphic: { + fill: 'red' + }, + text: { + text: 'haha', + fill: 'black' + }, + angle: 0, + shapePoints: [] + } + }, + { + type: 'RectComponent', + id: 'test-graphics-1', + zIndex: 0, + position: { + top: 40, + left: 250, + width: 200, + height: 100 + }, + options: { + graphic: { + fill: 'red', + visible: false + }, + text: { + text: 'title2', + fill: 'black' + }, + angle: 0, + shapePoints: [] + } + }, + { + type: 'BarChart', + id: 'test-chart-0', + zIndex: 0, + position: { + top: 200, + left: 100, + width: 300, + height: 300 + }, + options: { + data: data0, + // @ts-ignore + attribute: {} + } + }, + { + type: 'BarChart', + id: 'test-chart-1', + zIndex: 0, + position: { + top: 350, + left: 100, + width: 300, + height: 300 + }, + options: { + data: data1, + // @ts-ignore + attribute: {} + } + }, + { + type: 'BarChart', + id: 'test-chart-2', + zIndex: 0, + position: { + top: 350, + left: 300, + width: 300, + height: 300 + }, + options: { + data: data1, + // @ts-ignore + attribute: {} + } + }, + { + type: 'QipaoComponent', + id: 'test-graphics-2', + zIndex: 3, + position: { + top: 355, + left: 340, + width: 40, + height: 40 + }, + options: { + graphic: { + fill: 'red', + visible: false + }, + text: { + text: '128min', + fill: 'black', + fontSize: 10 + }, + angle: 0, + shapePoints: [] + } + } + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + [ + { + roleId: 'test-graphics-0', + actions: [ + { + startTime: 1, + duration: 1000, + action: 'appear', + payload: { + style: {}, + animation: { + duration: 1000, + easing: 'linear', + effect: 'fadeIn' + } as any + } + } + ] + }, + { + roleId: 'test-graphics-1', + actions: [ + { + startTime: 2000, + duration: 1000, + action: 'appear', + payload: { + style: {}, + animation: { + duration: 1000, + easing: 'linear', + effect: 'fadeIn' + } as any + } + } + ] + }, + { + roleId: 'test-chart-1', + actions: [ + { + startTime: 4000, + duration: 1000, + action: 'appear' + } + ] + }, + { + roleId: 'test-chart-0', + actions: [ + { + startTime: 4500, + duration: 1000, + action: 'appear' + } + ] + }, + { + roleId: 'test-chart-2', + actions: [ + { + startTime: 5500, + duration: 1000, + action: 'appear' + } + ] + }, + { + roleId: 'test-graphics-2', + actions: [ + { + startTime: 4300, + duration: 1000, + action: 'appear', + payload: { + style: {}, + animation: { + duration: 300, + easing: 'linear', + effect: 'grow' + } as any + } + } + ] + } + ] + ] + } + ] + }; + const story = new Story(tempSpec, { dom: id }); + story.play(); + const btn1 = document.createElement('button'); + btn1.innerText = 'replay'; + btn1.addEventListener('click', () => { + story.play(); + }); + const btn2 = document.createElement('button'); + btn2.innerText = 'export'; + btn2.addEventListener('click', () => { + story + .encodeToVideo(0, 5000, 15) + .then(objUrl => { + const video = document.createElement('video'); + (video as any).muted = 'muted'; + video.controls = true; + video.src = objUrl; + video.play(); + video.style.width = '500px'; + video.style.height = '300px'; + document.body.appendChild(video); + }) + .catch(err => { + console.log(err); + }); + }); + document.body.appendChild(btn1); + document.body.appendChild(btn2); + + // let i = 0; + // story.getPlayer().setCurrentChapter(0); + // setInterval(() => { + // story.getPlayer().tickTo(300 * i++); + // }, 300); + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/VChartSite/VChartSite.tsx b/packages/vstory/demo/src/demos/VChartSite/VChartSite.tsx new file mode 100644 index 0000000..d28a9bd --- /dev/null +++ b/packages/vstory/demo/src/demos/VChartSite/VChartSite.tsx @@ -0,0 +1,72 @@ +import React, { useEffect } from 'react'; +import { IStorySpec } from '../../../../src/story/interface'; +import { Story } from '../../../../src/story/story'; +import { scene1, scene1Characters } from './scene1'; +import { scene2, scene2Characters } from './scene2'; +import { scene3, scene3Characters } from './scene3'; +import { scene4, scene4Characters } from './scene4'; + +export const VChartSiteDemo = () => { + const id = 'storyBar'; + + useEffect(() => { + // 准备一个图表 + const tempSpec: IStorySpec = { + characters: [ + ...scene1Characters, // + ...scene2Characters, + ...scene3Characters, + ...scene4Characters + ], + acts: [ + { + id: 'default-chapter', + scenes: [ + // scene1, // + // scene2, + scene3, + scene4 + ] + } + ] + }; + console.log(111, tempSpec); + const story = new Story(tempSpec, { dom: id }); + window.story = story; + story.play(); + const btn1 = document.createElement('button'); + btn1.innerText = 'replay'; + btn1.addEventListener('click', () => { + story.play(); + }); + const btn2 = document.createElement('button'); + btn2.innerText = 'export'; + btn2.addEventListener('click', () => { + story + .encodeToVideo(0, 5000, 15) + .then(objUrl => { + const video = document.createElement('video'); + (video as any).muted = 'muted'; + video.controls = true; + video.src = objUrl; + video.play(); + video.style.width = '500px'; + video.style.height = '300px'; + document.body.appendChild(video); + }) + .catch(err => { + console.log(err); + }); + }); + document.body.appendChild(btn1); + document.body.appendChild(btn2); + + // let i = 0; + // story.getPlayer().setCurrentChapter(0); + // setInterval(() => { + // story.getPlayer().tickTo(300 * i++); + // }, 300); + }, []); + + return
    ; +}; diff --git a/packages/vstory/demo/src/demos/VChartSite/scene1.tsx b/packages/vstory/demo/src/demos/VChartSite/scene1.tsx new file mode 100644 index 0000000..6d699e8 --- /dev/null +++ b/packages/vstory/demo/src/demos/VChartSite/scene1.tsx @@ -0,0 +1,1043 @@ +// @ts-nocheck +import { ICharacterSpec } from '../../../../src/story/character'; +import { ISceneSpec } from '../../../../src/story/interface'; + +const chartSpecList = [ + { + title: 'Timeline Chart', + characterType: 'RangeColumnChart', + options: { + title: { + text: 'Timeline Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'id0', + values: [ + { type: 'a', value: 0.36, value2: 0.06 }, + { type: 'b', value: 0.66, value2: 0.26 }, + { type: 'c', value: 0.4, value2: 0.0 }, + { type: 'd', value: 0.6, value2: 0.2 } + ] + } + ], + + direction: 'horizontal', + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + minField: 'value', + maxField: 'value2', + yField: 'type', + bar: { + maxWidth: 2, + style: { + maxWidth: 2 + } + }, + label: { + style: { + visible: false + } + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + domainLine: { visible: true }, + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + domainLine: { visible: false }, + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Bar Chart', + characterType: 'BarChart', + options: { + title: { + text: 'BarChart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + x: 'Mon', + y: 100, + type: '销售额' + }, + { + x: 'Tues', + y: 66, + type: '销售额' + }, + { + x: 'Wed', + y: 95, + type: '销售额' + }, + { + x: 'Mon', + y: 43, + type: '利润' + }, + { + x: 'Tues', + y: 80, + type: '利润' + }, + { + x: 'Wed', + y: 68, + type: '利润' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: ['x', 'type'], + yField: 'y', + seriesField: 'type', + bar: { + style: { + fill: { + gradient: 'linear', + stops: [ + { + offset: 1 + }, + { + offset: 0, + opacity: 0.6 + } + ] + } + }, + state: { + selected: { + stroke: '#000', + strokeWidth: 1 + } + } + }, + label: { + style: { + visible: false + } + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + color: ['#4CC9E4', '#4954E6'] + } + }, + { + title: 'Line/Area Chart', + characterType: 'AreaChart', + options: { + title: { + text: 'Line/Area Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { x: 1, y: 70, type: 'a' }, + { x: 2, y: 20, type: 'a' }, + { x: 3, y: 30, type: 'a' }, + { x: 4, y: 10, type: 'a' }, + + { x: 1, y: 70, type: 'b' }, + { x: 2, y: 20, type: 'b' }, + { x: 3, y: 30, type: 'b' }, + { x: 4, y: 10, type: 'b' } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: 'x', + yField: 'y', + seriesField: 'type', + point: { + visible: false + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Pie Chart', + characterType: 'PieChart', + options: { + title: { + text: 'Pie Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + value: 348, + name: '中介渠道: 34.8%' + }, + { + value: 152, + name: '会员: 15.2%' + }, + { + value: 500, + name: '散客: 50%' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { valueField: 'value', categoryField: 'name', radius: 1, innerRadius: 0 } + } + ] + } + }, + { + title: 'Scatter Chart', + characterType: 'ScatterChart', + options: { + title: { + text: 'Scatter Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { x: 1, y: 70, type: 'a' }, + { x: 2, y: 20, type: 'a' }, + { x: 3, y: 30, type: 'a' }, + { x: 4, y: 10, type: 'a' }, + + { x: 1, y: 70, type: 'b' }, + { x: 2, y: 20, type: 'b' }, + { x: 3, y: 30, type: 'b' }, + { x: 4, y: 10, type: 'b' } + ] + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: 'x', + yField: 'y', + seriesField: 'type', + point: { + style: { + size: 4 + } + } + } + } + ] + } + }, + { + title: 'Rose Chart', + characterType: 'RoseChart', + options: { + title: { + text: 'Rose Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + value: 348, + name: '中介渠道: 34.8%' + }, + { + value: 152, + name: '会员: 15.2%' + }, + { + value: 500, + name: '散客: 50%' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { valueField: 'value', seriesField: 'name', categoryField: 'name', radius: 1, innerRadius: 0 } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'radius' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'angle' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Radar Chart', + characterType: 'RadarChart', + options: { + title: { + text: 'Radar Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data2', + values: [ + { + theta: 0, + type: 'A', + value: 833 + }, + { + theta: 1, + type: 'A', + value: 898 + }, + { + theta: 2, + type: 'A', + value: 672 + }, + { + theta: 3, + type: 'A', + value: 889 + }, + { + theta: 4, + type: 'A', + value: 889 + }, + { + theta: 5, + type: 'A', + value: 658 + }, + { + theta: 6, + type: 'A', + value: 822 + }, + { + theta: 7, + type: 'A', + value: 825 + }, + { + theta: 0, + type: 'B', + value: 659 + }, + { + theta: 1, + type: 'B', + value: 896 + }, + { + theta: 2, + type: 'B', + value: 822 + }, + { + theta: 3, + type: 'B', + value: 874 + }, + { + theta: 4, + type: 'B', + value: 742 + }, + { + theta: 5, + type: 'B', + value: 878 + }, + { + theta: 6, + type: 'B', + value: 643 + }, + { + theta: 7, + type: 'B', + value: 604 + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + categoryField: 'theta', + valueField: 'value', + seriesField: 'type', + line: { + style: { + strokeWidth: 2 + } + }, + legends: { + visible: false + }, + label: { + visible: false + }, + animationAppear: { + preset: 'clipIn' + }, + point: { + style: { + size: 2, + strokeWidth: 1 + } + }, + startAngle: 90 + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'radius' }, + spec: { + domainLine: { visible: true, smooth: false }, + label: { + visible: false + }, + tick: { + visible: false + }, + grid: { visible: true } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'angle' }, + spec: { + domainLine: { visible: false, smooth: false }, + label: { + visible: false + }, + grid: { visible: false } + } + } + ] + } + }, + { + title: 'Word Cloud', + characterType: 'WordCloudChart', + options: { + title: { + text: 'Word Cloud', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data1', + values: [ + { + challenge_id: 1658490688121879, + challenge_name: '宅家剧场', + sum_count: 128 + }, + { + challenge_id: 1640007327696910, + challenge_name: '我的观影报告', + sum_count: 103 + }, + { + challenge_id: 1557656100811777, + challenge_name: '抖瓜小助手', + sum_count: 76 + }, + { + challenge_id: 1553513807372289, + challenge_name: '搞笑', + sum_count: 70 + }, + { + challenge_id: 1599321527572563, + challenge_name: '我要上热门', + sum_count: 69 + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + valueField: 'sum_count', + seriesField: 'challenge_name', + nameField: 'challenge_name', + wordCloudConfig: { + drawOutOfBound: 'clip' + }, + maskShape: 'circle', + fontSizeRange: [5, 8] + } + } + ] + } + }, + { + title: 'TreeMap Chart', + characterType: 'TreeMapChart', + options: { + title: { + text: 'TreeMap Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + name: 'Second', + children: [ + { + name: 'B2', + value: 98 + }, + { + name: 'B3', + value: 56 + } + ] + }, + { + name: 'First', + children: [ + { + name: 'A2', + value: 60 + }, + { + name: 'A3', + value: 30 + } + ] + }, + { + name: 'Third', + children: [ + { + name: 'C1', + value: 33 + }, + { + name: 'C2', + value: 30 + }, + { + name: 'C3', + value: 40 + } + ] + }, + { + name: 'Fourth', + children: [ + { + name: 'D4', + value: 64 + }, + { + name: 'D5', + value: 60 + } + ] + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + categoryField: 'name', + valueField: 'value', + legends: { visible: false }, + nodePadding: 1, + nonLeaf: { + visible: false + }, + nonLeafLabel: { + visible: false + }, + label: { + visible: false + } + } + } + ] + } + }, + { + title: 'Sunburst Chart', + characterType: 'SunburstChart', + options: { + title: { + text: 'Sunburst Chart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + padding: 12, + data: [ + { + id: 'data', + values: [ + { + name: 'Grandpa', + children: [ + { + name: 'Uncle Leo', + value: 15, + children: [ + { + name: 'Cousin Jack', + value: 2 + }, + { + name: 'Cousin Mary', + value: 5, + children: [ + { + name: 'Jackson', + value: 2 + } + ] + }, + { + name: 'Cousin Ben', + value: 4 + } + ] + }, + { + name: 'Father', + value: 10, + children: [ + { + name: 'Me', + value: 5 + }, + { + name: 'Brother Peter', + value: 1 + } + ] + } + ] + }, + { + name: 'Nancy', + children: [ + { + name: 'Uncle Nike', + children: [ + { + name: 'Cousin Betty', + value: 1 + }, + { + name: 'Cousin Jenny', + value: 2 + } + ] + } + ] + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + offsetX: 0, + offsetY: 0, + categoryField: 'name', + valueField: 'value', + outerRadius: 1, + innerRadius: 0, + label: { + visible: false + } + } + } + ] + } + } +].map(item => ({ + ...item, + options: { + ...item.options, + panel: { + fill: 'white', + shadowColor: 'rgba(0, 0, 0, 0.05)', + shadowBlur: 10, + shadowOffsetX: 4, + shadowOffsetY: 4 + } + } +})); + +export const scene1Characters: ICharacterSpec[] = chartSpecList.map((item, i) => ({ + type: item.characterType ?? 'CharacterChart', + id: `chart${i}`, + zIndex: 1, + position: { + top: i < 5 ? 50 : 570, + left: 100 + (i % 5) * 170 + 20, + width: 110, + height: 110 + }, + options: { + spec: item.spec, + // data: data1, + // @ts-ignore + attribute: {}, + // @ts-ignore + ...(item.options ?? {}) + } +})); + +export const scene1: ISceneSpec = { + id: 'scene1', + actions: [ + ...new Array(5).fill(0).map( + (_, i) => + ({ + characterId: `chart${i}`, + characterActions: [ + { + startTime: i * 300 + 500, + duration: 1000, + action: 'appear', + payload: { + animation: { + duration: 1000 + } + } + } + ] + } as ICharacterLink) + ), + ...new Array(5).fill(0).map( + (_, i) => + ({ + characterId: `chart${9 - i}`, + characterActions: [ + { + startTime: i * 300 + 500, + duration: 1000, + action: 'appear', + payload: { + animation: { + duration: 1000 + } + } + } + ] + } as ICharacterLink) + ), + { + characterId: `title1`, + characterActions: [ + { + startTime: 1500, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + effect: 'typewriter', + easing: 'quadIn' + } + } + } + ] + }, + { + characterId: `title2`, + characterActions: [ + { + startTime: 2000, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + effect: 'typewriter', + easing: 'quadIn' + } + } + } + ] + }, + ...new Array(5).fill(0).map((_, i) => ({ + characterId: `chart${9 - i}`, + characterActions: [ + { + startTime: i * 100 + 2500, + duration: 2000, + action: 'bounce', + payload: { + animation: { + duration: 2000 + } + } + } + ] + })), + ...new Array(5).fill(0).map((_, i) => ({ + characterId: `chart${i}`, + characterActions: [ + { + startTime: i * 100 + 2500, + duration: 2000, + action: 'bounce', + payload: { + animation: { + duration: 2000 + } + } + } + ] + })), + { + characterId: `titlesubtitle`, + characterActions: [ + { + startTime: 2700, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 200, + easing: 'linear', + effect: 'fade' + } + } + } + ] + }, + ...new Array(10).fill(0).map((_, i) => ({ + characterId: `chart${9 - i}`, + characterActions: [ + { + startTime: 6000, + duration: 1000, + action: 'disappear', + payload: { + animation: { + duration: 1000 + } + } + } + ] + })), + { + characterId: `titlesubtitle`, + characterActions: [ + { + startTime: 6000, + duration: 1000, + action: 'disappear', + payload: { + animation: { + duration: 1000, + easing: 'linear', + effect: 'fade' + } + } + } + ] + } + ] +}; diff --git a/packages/vstory/demo/src/demos/VChartSite/scene2.tsx b/packages/vstory/demo/src/demos/VChartSite/scene2.tsx new file mode 100644 index 0000000..1a3ec4c --- /dev/null +++ b/packages/vstory/demo/src/demos/VChartSite/scene2.tsx @@ -0,0 +1,230 @@ +// @ts-nocheck +import { ICharacterSpec } from '../../../../src/story/character'; +import { ISceneSpec } from '../../../../src/story/interface'; + +export const scene2Characters: ICharacterSpec[] = [ + { + type: 'TextComponent', + id: `title1`, + zIndex: 1, + position: { + top: 300, + left: 500, + width: 500, + height: 200 + }, + options: { + graphic: { text: 'A BRIEF HISTORY', fontSize: 55, fontWeight: 'bold' } + } + }, + { + type: 'TextComponent', + id: `title2`, + zIndex: 1, + position: { + top: 380, + left: 500, + width: 400, + height: 60 + }, + options: { + graphic: { text: 'OF CHARTS', fontSize: 55, fontWeight: 'bold' } + } + }, + { + type: 'RichTextComponent', + id: `titlesubtitle`, + zIndex: 1, + position: { + top: 450, + left: 600, + width: 400, + height: 80 + }, + options: { + graphic: { + width: 400, + fontSize: 22, + fontWeight: 'bold', + textConfig: [ + { + text: 'Powered By ' + }, + { + text: 'VChart', + fill: 'blue' + } + ] + } + } + }, + { + type: 'TextComponent', + id: `scene2-title2`, + zIndex: 1, + position: { + top: 50, + left: 150, + width: 200, + height: 20 + }, + options: { + graphic: { + width: 400, + fontSize: 12, + fill: '#292729', + text: 'DEVELOPMENT ROADMAP' + } + } + } +]; + +export const scene2: ISceneSpec = { + id: 'scene2', + actions: [ + { + characterId: `title1`, + characterActions: [ + { + startTime: 0, + duration: 800, + action: 'moveTo', + destination: { + x: 250, + y: 80 + }, + payload: { + animation: { + duration: 800, + easing: 'quadInOut' + } + } + }, + { + startTime: 0, + duration: 800, + action: 'style', + payload: { + graphic: { + fontSize: 40 + }, + animation: { + duration: 800 + } + } + } + ] + }, + { + characterId: `title2`, + characterActions: [ + { + startTime: 0, + duration: 800, + action: 'moveTo', + destination: { + x: 550, + y: 80 + }, + payload: { + animation: { + duration: 800, + easing: 'quadInOut' + } + } + }, + { + startTime: 0, + duration: 800, + action: 'style', + payload: { + graphic: { + fontSize: 40 + }, + animation: { + duration: 800, + easing: 'quadInOut' + } + } + } + ] + }, + { + characterId: `scene2-title2`, + characterActions: [ + { + startTime: 800, + duration: 800, + action: 'appear', + payload: { + animation: { + duration: 800, + easing: 'linear', + effect: 'fade' + } + } + } + ] + }, + { + characterId: `title1`, + characterActions: [ + { + startTime: 2000, + duration: 800, + action: 'moveTo', + destination: { + x: -650, + y: 80 + }, + payload: { + animation: { + duration: 800, + easing: 'quadInOut' + } + } + } + ] + }, + { + characterId: `title2`, + characterActions: [ + { + startTime: 2000, + duration: 800, + action: 'moveTo', + destination: { + x: -350, + y: 80 + }, + payload: { + animation: { + duration: 800, + easing: 'quadInOut' + } + } + } + ] + }, + { + characterId: `scene2-title2`, + characterActions: [ + { + startTime: 2000, + duration: 800, + action: 'moveTo', + destination: { + x: -750, + y: 80 + }, + payload: { + animation: { + duration: 800, + easing: 'quadInOut' + } + } + } + ] + } + ] +}; diff --git a/packages/vstory/demo/src/demos/VChartSite/scene3.tsx b/packages/vstory/demo/src/demos/VChartSite/scene3.tsx new file mode 100644 index 0000000..731aaf7 --- /dev/null +++ b/packages/vstory/demo/src/demos/VChartSite/scene3.tsx @@ -0,0 +1,1240 @@ +import type { ICharacterSpec } from '../../../../src/story/character'; +import type { ISceneSpec } from '../../../../src/story/interface'; + +import Scene3TitleImage from '../../assets/scene3/title-image.png'; +import Scene3Decoration from '../../assets/scene3/decoration.png'; +import Scene3TextTop from '../../assets/scene3/text-zh.png'; +import Scene3TextBottom from '../../assets/scene3/text-en.png'; +import Scene3ChartImage1 from '../../assets/scene3/chart-1.png'; +import Scene3ChartImage2 from '../../assets/scene3/chart-2.png'; +import Scene3ChartImage3 from '../../assets/scene3/chart-3.png'; +import Scene3ChartImage4 from '../../assets/scene3/chart-4.png'; +import Scene3ChartImage5 from '../../assets/scene3/chart-5.png'; +// @ts-ignore +export const scene3Characters: ICharacterSpec[] = [ + { + type: 'TextComponent', + id: `scene3-title1`, + zIndex: 1, + position: { + top: 100, + left: 200, + width: 500, + height: 200 + }, + options: { + graphic: { text: 'Proto Bar', fontSize: 55, fontWeight: 'bold', textAlign: 'left' } + } + }, + { + type: 'LineComponent', + id: `scene3-line-top`, + zIndex: 1, + position: { + top: 102, + left: 100, + width: 500, + height: 200 + }, + options: { + graphic: { + lineWidth: 1, + points: [ + { x: 100, y: 34 }, + { x: 350, y: 34 } + ] + } + } + }, + { + type: 'LineComponent', + id: `scene3-line-bottom`, + zIndex: 1, + position: { + top: 130, + left: 100, + width: 500, + height: 200 + }, + options: { + graphic: { + lineWidth: 1, + points: [ + { x: 100, y: 34 }, + { x: 350, y: 34 } + ] + } + } + }, + { + type: 'TextComponent', + id: `scene3-title-Nicole`, + zIndex: 1, + position: { + top: 150, + left: 200, + width: 500, + height: 200 + }, + options: { + graphic: { text: 'Nicole Oresme', fontSize: 12, fontWeight: 'bold', textAlign: 'left' } + } + }, + { + type: 'ImageComponent', + id: `scene3-text-image-top`, + zIndex: 1, + position: { + top: 160, + left: 560, + width: 570, + height: 65 + }, + options: { + graphic: { + image: Scene3TextTop + } + } + }, + { + type: 'ImageComponent', + id: `scene3-text-image-top`, + zIndex: 1, + position: { + top: 160, + left: 560, + width: 570, + height: 65 + }, + options: { + graphic: { + image: Scene3TextTop + } + } + }, + { + type: 'ImageComponent', + id: `scene3-chart-image-1`, + zIndex: 1, + position: { + top: 250, + left: 560, + width: 200, + height: 160 + }, + options: { + graphic: { + image: Scene3ChartImage1 + } + } + }, + { + type: 'ImageComponent', + id: `scene3-chart-image-2`, + zIndex: 1, + position: { + top: 250, + left: 780, + width: 200, + height: 160 + }, + options: { + graphic: { + image: Scene3ChartImage2 + } + } + }, + { + type: 'ImageComponent', + id: `scene3-chart-image-3`, + zIndex: 1, + position: { + top: 425, + left: 560, + width: 200, + height: 160 + }, + options: { + graphic: { + image: Scene3ChartImage3 + } + } + }, + { + type: 'ImageComponent', + id: `scene3-chart-image-4`, + zIndex: 1, + position: { + top: 425, + left: 780, + width: 200, + height: 160 + }, + options: { + graphic: { + image: Scene3ChartImage4 + } + } + }, + { + type: 'ImageComponent', + id: `scene3-chart-image-5`, + zIndex: 1, + position: { + top: 250, + left: 1000, + width: 200, + height: 335 + }, + options: { + graphic: { + image: Scene3ChartImage5 + } + } + }, + { + type: 'ImageComponent', + id: `scene3-text-image-bottom`, + zIndex: 1, + position: { + top: 620, + left: 560, + width: 570, + height: 60 + }, + options: { + graphic: { + image: Scene3TextBottom + } + } + }, + { + type: 'TextComponent', + id: `scene3-title-1486`, + zIndex: 1, + position: { + top: 150, + left: 420, + width: 500, + height: 200 + }, + options: { + graphic: { text: '1486', fontSize: 12, fontWeight: 'bold', textAlign: 'left' } + } + }, + { + type: 'ImageComponent', + id: `scene3-title-image`, + zIndex: 1, + position: { + top: 180, + left: 200, + width: 250, + height: 260 + }, + options: { + graphic: { + image: Scene3TitleImage + } + } + }, + { + type: 'RectComponent', + id: `scene3-background`, + zIndex: 0, + position: { + top: 0, + left: 170, + width: 1440, + height: 810 + }, + options: { + graphic: { + stroke: false, + fill: '#D9D4CA' + } + } + }, + { + type: 'ImageComponent', + id: `scene3-background-decoration`, + zIndex: 0, + position: { + top: 120, + left: 270, + width: 1000, + height: 500 + }, + options: { + graphic: { + image: Scene3Decoration + } + } + }, + // Bar Chart + { + type: 'BarChart', + id: `bar`, + zIndex: 1, + position: { + top: 250, + left: 900, + width: 260, + height: 335 + }, + + options: { + panel: { + fill: '#ffffff', + shadowColor: 'rgba(0, 0, 0, 0.05)', + shadowBlur: 10, + shadowOffsetX: 4, + shadowOffsetY: 4 + }, + title: { + text: 'BarChart', + orient: 'bottom', + align: 'center', + textStyle: { + fontSize: 10, + lineHeight: 10 + } + }, + + padding: [120, 60, 75, 60], + data: [ + { + id: 'data', + values: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ] + } + ], + seriesSpec: [ + { + matchInfo: { specIndex: 'all' }, + spec: { + xField: ['x', 'type'], + yField: 'y', + seriesField: 'type', + bar: { + style: { + fill: { + gradient: 'linear', + stops: [ + { + offset: 1 + }, + { + offset: 0, + opacity: 0.6 + } + ] + } + }, + state: { + selected: { + stroke: '#000', + strokeWidth: 1 + } + } + }, + label: { + style: { + visible: false + } + }, + axes: [ + { + orient: 'bottom', + bandPadding: 0 + } + ], + animationUpdate: { + easing: 'cubicInOut', + duration: 1000 + } + } + } + ], + componentSpec: [ + { + specKey: 'axes', + matchInfo: { orient: 'bottom', bandPadding: 0, paddingInner: 0, paddingOuter: 0 }, + spec: { + bandPadding: 0, + paddingInner: 0, + paddingOuter: 0, + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + }, + { + specKey: 'axes', + matchInfo: { orient: 'left' }, + spec: { + tick: { visible: false }, + label: { visible: false }, + grid: { visible: false } + } + } + ], + color: ['#4CC9E4', '#4954E6'], + attribute: {} + } + } +]; + +export const scene3: ISceneSpec = { + id: 'scene3', + actions: [ + // 第二个 scene 的内容,写在这里仅用作测试 + { + characterId: `scene3-background`, + characterActions: [ + { + startTime: 1, + duration: 800, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-background-decoration`, + characterActions: [ + { + startTime: 1, + duration: 800, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-title1`, + characterActions: [ + { + action: 'appear', + startTime: 1, + duration: 700, + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-line-top`, + characterActions: [ + { + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-line-bottom`, + characterActions: [ + { + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-title-Nicole`, + characterActions: [ + { + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-title-1486`, + characterActions: [ + { + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-title-image`, + characterActions: [ + { + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: `scene3-text-image-top`, + characterActions: [ + { + startTime: 300, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-chart-image-1`, + characterActions: [ + { + startTime: 330, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + startTime: 1500, + duration: 1000, + action: 'style', + payload: { + graphic: { + width: 150 + }, + animation: { + duration: 1000, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-2`, + characterActions: [ + { + startTime: 330, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + startTime: 1500, + duration: 1000, + action: 'style', + payload: { + graphic: { + width: 150, + dx: -50 + }, + animation: { + duration: 1000, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-3`, + characterActions: [ + { + startTime: 330, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + startTime: 1500, + duration: 1000, + action: 'style', + payload: { + graphic: { + width: 150 + }, + animation: { + duration: 1000, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-4`, + characterActions: [ + { + startTime: 330, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + startTime: 1500, + duration: 1000, + action: 'style', + payload: { + graphic: { + width: 150, + dx: -50 + }, + animation: { + duration: 1000, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-5`, + characterActions: [ + { + startTime: 330, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + startTime: 1500, + duration: 1000, + action: 'style', + payload: { + graphic: { + width: 260, + dx: -100 + }, + animation: { + duration: 1000, + easing: 'easeInOutQuad' + } + } + }, + { + startTime: 3500, + duration: 500, + action: 'disappear', + payload: { + animation: { + duration: 500, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-text-image-bottom`, + characterActions: [ + { + startTime: 360, + duration: 500, + action: 'appear', + payload: { + animation: { + duration: 500, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + } + ] + }, + + // Bar Chart + { + characterId: 'bar', + characterActions: [ + { + action: 'appear', + startTime: 2500, + duration: 1000, + payload: { + animation: { + duration: 1000, + easing: 'cubicOut', + effect: 'grow', + fade: { + opacity: 1, + isBaseOpacity: true, + easing: 'linear' + } + } + } + }, + { + action: 'update', + startTime: 3500, + duration: 1000, + payload: { + id: 'data', + data: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + } + ].map((v, index) => { + return { + sourceValue: v, + targetValue: { + ...v, + y: (index + 1) * 10 + } + }; + }) + } + }, + { + action: 'update', + startTime: 4500, + duration: 1000, + payload: { + id: 'data', + data: [ + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ] + .slice(0, 4) + .map((v, index) => { + return { + sourceValue: v, + targetValue: { + ...v, + y: (index + 1) * 10 + } + }; + }) + } + }, + { + action: 'update', + startTime: 5500, + duration: 1000, + payload: { + id: 'data', + data: [ + { + x: '1', + y: 100, + type: 'Category1' + }, + { + x: '2', + y: 100, + type: 'Category1' + }, + { + x: '3', + y: 100, + type: 'Category1' + }, + { + x: '4', + y: 100, + type: 'Category1' + }, + { + x: '1', + y: 100, + type: 'Category2' + }, + { + x: '2', + y: 100, + type: 'Category2' + }, + { + x: '3', + y: 100, + type: 'Category2' + }, + { + x: '4', + y: 100, + type: 'Category2' + } + ].map((v, index) => { + return { + sourceValue: { + ...v, + y: ((index % 4) + 1) * 10 + }, + targetValue: { + ...v, + y: 100 + } + }; + }) + } + }, + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + easing: 'cubicInOut', + duration: 1000, + move: { + to: 'right' + }, + fade: { + opacity: 0.1, + isBaseOpacity: true + } + } + } + } + ] + }, + // transition + { + characterId: `scene3-title1`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-line-top`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-line-bottom`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-title-Nicole`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-title-1486`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-title-image`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 1000, + payload: { + animation: { + duration: 1000, + move: { + to: 'bottom' + } + } + } + } + ] + }, + { + characterId: `scene3-text-image-top`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-1`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-2`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-3`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-4`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-chart-image-5`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-text-image-bottom`, + characterActions: [ + { + action: 'disappear', + startTime: 3500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-background-decoration`, + characterActions: [ + { + action: 'disappear', + startTime: 6500, + duration: 700, + payload: { + animation: { + duration: 700, + effect: 'fade' + } + } + } + ] + }, + { + characterId: `scene3-background`, + characterActions: [ + { + action: 'moveTo', + startTime: 6500, + duration: 700, + destination: { + x: 0, + y: 0 + }, + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad' + } + } + } + ] + } + ] +}; diff --git a/packages/vstory/demo/src/demos/VChartSite/scene4.tsx b/packages/vstory/demo/src/demos/VChartSite/scene4.tsx new file mode 100644 index 0000000..1864c68 --- /dev/null +++ b/packages/vstory/demo/src/demos/VChartSite/scene4.tsx @@ -0,0 +1,551 @@ +import type { ICharacterSpec } from '../../../../src/story/character'; +import type { ISceneSpec } from '../../../../src/story/interface'; +import LeftLineDecoration from '../../assets/scene4/blocks.png'; +import TitleDecoration from '../../assets/scene4/title-decoration.png'; +import ChartImage from '../../assets/scene4/chart.png'; +import TextEnImage from '../../assets/scene4/text-en.png'; +import TextZhImage from '../../assets/scene4/text-zh.png'; +import RectTexture from '../../assets/scene4/matrix.png'; +import DecorationImage from '../../assets/scene4/decoration.png'; +import BgDecorationImage from '../../assets/scene4/bg-decoration.png'; + +export const scene4Characters: ICharacterSpec[] = [ + { + type: 'ImageComponent', + id: 'scene4-title-decoration', + zIndex: 1, + position: { + left: 200, + top: 140, + width: 130, + height: 26 + }, + options: { + graphic: { + image: TitleDecoration + } + } + }, + { + type: 'TextComponent', + id: 'scene4-title', + zIndex: 1, + position: { + left: 200, + top: 200, + width: 400, + height: 60 + }, + options: { + graphic: { + text: 'The First Chart', + fontSize: 55, + fontWeight: 'bold', + textAlign: 'left' + } + } + }, + { + type: 'TextComponent', + id: 'scene4-subtitle', + zIndex: 1, + position: { + left: 200, + top: 256, + width: 300, + height: 30 + }, + options: { + graphic: { + text: 'Michael van Langren', + fontSize: 30, + textAlign: 'left', + fontWeight: 'bold' + } + } + }, + { + type: 'LineComponent', + id: 'scene4-line-left', + zIndex: 1, + position: { + left: 165, + top: 0, + width: 10, + height: 450 + }, + options: { + graphic: { + lineWidth: 1, + points: [ + { x: 5, y: 0 }, + { x: 5, y: 450 } + ] + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-line-left-decoration', + zIndex: 1, + position: { + left: 160, + top: 460, + width: 20, + height: 66 + }, + options: { + graphic: { + image: LeftLineDecoration + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-chart-image', + zIndex: 1, + position: { + left: 200, + top: 320, + width: 420, + height: 104 + }, + options: { + graphic: { + image: ChartImage + } + } + }, + { + type: 'LineComponent', + id: 'scene4-text-zh-line', + zIndex: 1, + position: { + left: 324, + top: 470, + width: 10, + height: 64 + }, + options: { + graphic: { + lineWidth: 1, + points: [ + { x: 0, y: 0 }, + { x: 0, y: 64 } + ] + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-text-zh-image', + zIndex: 1, + position: { + left: 340, + top: 470, + width: 280, + height: 64 + }, + options: { + graphic: { + image: TextZhImage + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-text-en-image', + zIndex: 1, + position: { + left: 660, + top: 600, + width: 300, + height: 54 + }, + options: { + graphic: { + image: TextEnImage + } + } + }, + { + type: 'RectComponent', + id: 'scene4-green-rect', + zIndex: 1, + position: { + left: 620, + top: 160, + width: 100, + height: 90 + }, + options: { + graphic: { + fill: `rgba(124, 128,118,0.8)`, + background: RectTexture, + stroke: false + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-decoration', + zIndex: 1, + position: { + left: 740, + top: 340, + width: 80, + height: 120 + }, + options: { + graphic: { + image: DecorationImage + } + } + }, + { + type: 'RectComponent', + id: 'scene4-grey-rect', + zIndex: 1, + position: { + left: 960, + top: 340, + width: 300, + height: 100 + }, + options: { + graphic: { + fill: `rgb(167, 160,153)`, + stroke: false + } + } + }, + { + type: 'ImageComponent', + id: 'scene4-bg-decoration', + zIndex: 1, + position: { + left: 180, + top: 680, + width: 1200, + height: 140 + }, + options: { + graphic: { + image: BgDecorationImage + } + } + } +]; + +export const scene4: ISceneSpec = { + id: 'scene4', + actions: [ + { + characterId: 'scene4-title-decoration', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + easing: 'easeInOutQuad', + + duration: 700, + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-title', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + easing: 'easeInOutQuad', + + duration: 700, + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-subtitle', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-line-left', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-line-left-decoration', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-chart-image', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + effect: 'fade' + } + } + }, + { + // TODO: startOffset + startTime: 1300, + duration: 700, + action: 'style', + payload: { + graphic: { + width: 500, + height: 120 + }, + animation: { + duration: 700, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: 'scene4-text-zh-image', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + // TODO: startOffset + startTime: 1300, + duration: 700, + action: 'style', + payload: { + graphic: { + dx: 50, + dy: 10 + }, + animation: { + duration: 700, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: 'scene4-text-zh-line', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + }, + { + // TODO: startOffset + startTime: 1300, + duration: 700, + action: 'style', + payload: { + graphic: { + dx: 50, + dy: 10 + }, + animation: { + duration: 700, + easing: 'easeInOutQuad' + } + } + } + ] + }, + { + characterId: 'scene4-text-en-image', + characterActions: [ + { + // TODO: startOffset + startTime: 1, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + } + ] + }, + { + characterId: 'scene4-green-rect', + characterActions: [ + { + // TODO: startOffset + startTime: 200, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'top' + } + } + } + } + ] + }, + { + characterId: 'scene4-decoration', + characterActions: [ + { + // TODO: startOffset + startTime: 200, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'bottom' + } + } + } + } + ] + }, + { + characterId: 'scene4-grey-rect', + characterActions: [ + { + // TODO: startOffset + startTime: 200, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + move: { + from: 'right' + } + } + } + } + ] + }, + { + characterId: 'scene4-bg-decoration', + characterActions: [ + { + // TODO: startOffset + startTime: 0, + duration: 700, + action: 'appear', + payload: { + animation: { + duration: 700, + easing: 'easeInOutQuad', + effect: 'fade' + } + } + } + ] + } + ] +}; diff --git a/packages/vstory/demo/src/demos/graphicAction.tsx b/packages/vstory/demo/src/demos/graphicAction.tsx new file mode 100644 index 0000000..2d07501 --- /dev/null +++ b/packages/vstory/demo/src/demos/graphicAction.tsx @@ -0,0 +1,156 @@ +import React, { useEffect, useState } from 'react'; +import { IActionsLink, IAction, IStorySpec } from '../../../src/story/interface'; +import { Story } from '../../../src/story/story'; +import '../../../src/story/index'; +import { ICharacterSpec } from '../../../src/story/character'; +import { StoryGraphicType } from '../../../src/dsl/constant'; + +const duration = 1000; +const width = 200; +const height = 100; + +const createCharacterAndAction = (type: string, effects: string[], row = 0, col = 0, options = {}) => { + const appearEffect = effects[0]; + const id = `${type}-${appearEffect}-${row}`; + const character: ICharacterSpec = { + type, + id, + zIndex: 0, + position: { + top: 40 + row * 100, + left: 50 + col * width, + width, + height + }, + options: { + graphic: { + fill: 'rgb(13,201,209)' + }, + text: { + text: appearEffect + }, + angle: 0, + shapePoints: [], + ...options + } + }; + const characterActions: IAction[] = effects.map((effect, effectIndex) => { + if (effectIndex === 0) { + return { + startTime: 50 + row * duration, + action: 'appear', + duration, + payload: { + style: {}, + animation: { + duration, + easing: 'linear', + effect + } as any + } + }; + } else { + return { + startTime: 50 + row * duration + effectIndex * (duration + 100), + action: effect, + duration, + payload: { + animation: { + duration, + easing: 'linear' + } as any + } + }; + } + }); + + const characterAction: IActionsLink = { + characterId: id, + characterActions + }; + return { characterAction, character }; +}; + +export const GraphicActionDemo = () => { + const id = 'graphicAction'; + const [story, setStory] = useState(); + const [pause, setPause] = useState(false); + useEffect(() => { + // rect + // 数组第一项是 appear 效果,第二项是强调效果 + const characters: IStorySpec['characters'] = []; + const characterActions: IActionsLink[] = []; + let col = 0; + // rect + { + const effects = [ + ['wipe'], + ['fade', 'brighten'], + ['grow'], + ['move'], + ['fade', 'flicker', 'darken'] // + ]; + effects.forEach((effect, index) => { + const { character, characterAction } = createCharacterAndAction(StoryGraphicType.RECT, effect, index); + characters.push(character); + characterActions.push(characterAction); + }); + ++col; + } + + // text + { + const effects = [ + ['fade'], + // ['flicker'], // TODO: 直接 flicker 是有问题的 + ['typewriter', 'flicker'] // + ]; + effects.forEach((effect, index) => { + const { character, characterAction } = createCharacterAndAction(StoryGraphicType.TEXT, effect, index, col, { + graphic: { fontSize: 24, text: effect[0], dx: width / 2, dy: height / 2 }, + text: { visible: false } + }); + characters.push(character); + characterActions.push(characterAction); + }); + ++col; + } + const tempSpec: IStorySpec = { + characters, + acts: [ + { + id: 'default-chapter', + scenes: [ + { + id: '11', + actions: characterActions + } + ] + } + ] + }; + + console.log(tempSpec); + + const story = new Story(tempSpec, { dom: id }); + setStory(story); + story.play(); + }, []); + + useEffect(() => { + document.addEventListener('click', () => { + if (pause) { + story?.getPlayer().play(); + } else { + story?.getPlayer().pause(); + } + setPause(!pause); + }); + }); + + return ( +
    +
    +
    + ); +}; diff --git a/packages/vstory/demo/src/hooks/useLocalStorage.ts b/packages/vstory/demo/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..83613e4 --- /dev/null +++ b/packages/vstory/demo/src/hooks/useLocalStorage.ts @@ -0,0 +1,16 @@ +import { useEffect, useState } from 'react'; + +export const useLocalStorage = (key: string, initialValue: string | number) => { + // 通过传入的key获取localStorage中的值 + const storedValue = localStorage.getItem(key); + + // 使用useState初始化值,如果localStorage中有值则使用,否则使用传入的初始值 + const [value, setValue] = useState(storedValue ? JSON.parse(storedValue) : initialValue); + + // 使用useEffect监听value的变化,并将其存储到localStorage中 + useEffect(() => { + localStorage.setItem(key, JSON.stringify(value)); + }, [key, value]); + + return [value, setValue]; +}; diff --git a/packages/vstory/demo/src/vite-env.d.ts b/packages/vstory/demo/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/vstory/demo/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/vstory/demo/tsconfig.json b/packages/vstory/demo/tsconfig.json new file mode 100644 index 0000000..600676a --- /dev/null +++ b/packages/vstory/demo/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/packages/vstory/demo/tsconfig.node.json b/packages/vstory/demo/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/packages/vstory/demo/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/vstory/demo/vite.config.ts b/packages/vstory/demo/vite.config.ts new file mode 100644 index 0000000..c51adb2 --- /dev/null +++ b/packages/vstory/demo/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import * as path from 'path'; +import react from '@vitejs/plugin-react'; +import localConf from './vite.config.local'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react({ jsxRuntime: 'classic' }), + { + name: 'configure-response-headers', + configureServer: server => { + server.middlewares.use((_req, res, next) => { + res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp'); + res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'); + next(); + }); + } + } + ], + define: { + __VERSION__: JSON.stringify(require('../package.json').version) + }, + resolve: { + alias: { + // '@visactor/vchart': path.resolve(__dirname, '../../vchart/src/index'), + // '@visactor/vutils-extension': path.resolve(__dirname, '../../vutils-extension/src/index.ts'), + // '@visactor/vrender-core': '/Users/bytedance/dev/github/vr/packages/vrender-core/src/index.ts', + // '@visactor/vrender-kits': '/Users/bytedance/dev/github/vr/packages/vrender-kits/src/index.ts', + // '@visactor/vrender-components': '/Users/bytedance/dev/github/vr/packages/vrender-components/src/index.ts', + ...localConf?.resolve?.alias + } + } +}); diff --git a/packages/vstory/jest.config.js b/packages/vstory/jest.config.js new file mode 100644 index 0000000..e8723c5 --- /dev/null +++ b/packages/vstory/jest.config.js @@ -0,0 +1,47 @@ +// const path = require('path'); + +// module.exports = { +// runner: 'jest-electron/runner', +// testEnvironment: 'jest-electron/environment', +// testTimeout: 30000, +// testRegex: '/__tests__/.*test\\.ts?$', +// moduleFileExtensions: ['ts', 'js', 'json'], +// setupFilesAfterEnv: ['jest-extended/all'], +// preset: 'ts-jest', +// silent: true, +// globals: { +// 'ts-jest': { +// resolveJsonModule: true, +// esModuleInterop: true, +// experimentalDecorators: true, +// module: 'ESNext', +// tsconfig: './tsconfig.test.json' +// }, +// __DEV__: true +// }, +// setupFiles: ['./setup-mock.js'], +// verbose: true, +// coverageReporters: ['json-summary', 'lcov', 'text'], +// coveragePathIgnorePatterns: ['node_modules', 'demo', 'interface.ts', '.d.ts', 'typings'], +// testPathIgnorePatterns: ['demo'], +// collectCoverageFrom: [ +// '**/src/**', +// '!**/cjs/**', +// '!**/dist/**', +// '!**/es/**', +// '!**/node_modules/**', +// '!**/demo/**', +// '!**/interface/**', +// '!**/interface.ts', +// '!**/**.d.ts' +// ], +// coverageThreshold: { +// global: { +// branches: 80, +// functions: 80, +// lines: 80, +// statements: 80 +// } +// }, +// moduleNameMapper: {} +// }; diff --git a/packages/vstory/package.json b/packages/vstory/package.json new file mode 100644 index 0000000..40c8768 --- /dev/null +++ b/packages/vstory/package.json @@ -0,0 +1,82 @@ +{ + "name": "@visactor/vstory", + "version": "0.0.1", + "description": "", + "sideEffects": true, + "main": "cjs/index.js", + "module": "es/index.js", + "types": "es/index.d.ts", + "files": [ + "cjs", + "es", + "dist" + ], + "scripts": { + "compile": "tsc --noEmit", + "eslint": "eslint --debug --fix src/", + "build": "bundle --clean", + "build-umd": "bundle --clean -f umd", + "dev": "bundle --clean -f es -w", + "start": "vite ./demo --host --port=6789", + "test": "jest", + "test-cov": "jest -w 16 --coverage", + "test-live": "", + "test-watch": "DEBUG_MODE=1 jest --watch" + }, + "dependencies": { + "@visactor/vchart": "1.11.1", + "@visactor/vrender-core": "0.19.4", + "@visactor/vrender-kits": "0.19.4", + "@visactor/vrender-components": "0.19.4" + }, + "devDependencies": { + "@internal/bundler": "workspace:*", + "@internal/eslint-config": "workspace:*", + "@internal/ts-config": "workspace:*", + "@rushstack/eslint-patch": "~1.1.4", + "@visactor/vutils": "~0.18.4", + "@ffmpeg/core": "^0.11.0", + "@ffmpeg/ffmpeg": "^0.11.6", + "canvas": "2.11.2", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "@vitejs/plugin-react": "3.1.0", + "@types/jest": "^26.0.0", + "jest": "^26.0.0", + "jest-electron": "^0.1.12", + "jest-extended": "^1.2.1", + "ts-jest": "^26.0.0", + "eslint": "~8.18.0", + "vite": "3.2.6", + "typescript": "4.9.5" + }, + "keywords": [ + "VisActor", + "graphics", + "renderer", + "vstory" + ], + "homepage": "", + "bugs": "https://github.com/VisActor/VStory/issues", + "repository": { + "type": "git", + "url": "https://github.com/VisActor/VStory.git", + "directory": "packages/vstory" + }, + "author": { + "name": "VisActor", + "url": "https://VisActor.io/" + }, + "license": "MIT", + "exports": { + ".": { + "import": "./es/index.js", + "require": "./cjs/index.js" + } + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/vstory/setup-mock.js b/packages/vstory/setup-mock.js new file mode 100644 index 0000000..b0df380 --- /dev/null +++ b/packages/vstory/setup-mock.js @@ -0,0 +1,2 @@ +global.__DEV__ = true; +global.__VERSION__ = true; diff --git a/packages/vstory/src/animate/animate.ts b/packages/vstory/src/animate/animate.ts new file mode 100644 index 0000000..4c4fb51 --- /dev/null +++ b/packages/vstory/src/animate/animate.ts @@ -0,0 +1,29 @@ +import type { IAnimate as IVRenderAnimate, IGraphic } from '@visactor/vrender-core'; +import { IContext } from '../interface/type'; +import { AbstractTask, ITask, TaskCb } from '../task'; + +export class GraphicAnimate extends AbstractTask { + protected _animate: IVRenderAnimate; + + prev: ITask; + next: ITask; + + protected _target: IGraphic; + + constructor(target: IGraphic) { + super(); + this._target = target; + if (this._target) { + this._animate = this._target.animate().afterAll(Array.from(this._target.animates.values())); + } + } + + runCb(cb: TaskCb) { + if (this._animate) { + this._animate.runCb(cb); + } + } + + // 覆写这个方法 + run(context: Partial) {} +} diff --git a/packages/vstory/src/animate/bounce.ts b/packages/vstory/src/animate/bounce.ts new file mode 100644 index 0000000..6d68fb5 --- /dev/null +++ b/packages/vstory/src/animate/bounce.ts @@ -0,0 +1,35 @@ +import { ACustomAnimate } from '@visactor/vrender-core'; +import type { EasingType } from '@visactor/vrender-core'; + +export class Bounce extends ACustomAnimate { + declare valid: boolean; + + private dy: number; + private customEase: any; + + constructor(from: any, to: any, duration: number, easing: EasingType, params: { dy: number; customEase?: any }) { + super(from, to, duration, easing, params); + const { dy = 20, customEase } = params || {}; + this.dy = dy; + if (customEase) { + this.customEase = customEase; + } + } + + getEndProps(): Record { + return this.to; + } + + getFromProps(): void | Record { + return this.from; + } + + onBind(): void { + this.target && this.target.setAttributes(this.from); + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + const r = this.customEase ? this.customEase(ratio) : ratio; + out.dy = -this.dy * r; + } +} diff --git a/packages/vstory/src/animate/highlight.ts b/packages/vstory/src/animate/highlight.ts new file mode 100644 index 0000000..fec6f6f --- /dev/null +++ b/packages/vstory/src/animate/highlight.ts @@ -0,0 +1,53 @@ +import { Dict, isArray } from '@visactor/vutils'; +import type { Template } from '../template/base-template'; +import { Data, MaybeArray } from '../type/common'; +import { getAllSeriesMarksWithoutRoot } from '../util/vchart-api'; +import { GraphicAnimate } from './animate'; +import { Action } from '../scene/action'; + +export function highlight(template: Template, data: MaybeArray, style: Dict) { + if (!data || !template) { + return null; + } + const highlight = new HighLight(template, data, style); + return new Action(highlight, highlight => { + highlight.run(); + }); +} + +class HighLight extends GraphicAnimate { + type = 'highlight'; + + protected _duration: number; + protected _dataList: Data[]; + protected _template: Template; + protected _style: any; + + constructor(target: Template, data: MaybeArray, style: any, duration?: number) { + super(null); + this._duration = duration; + this._dataList = isArray(data) ? data : [data]; + this._template = target; + this._style = style; + } + + run() { + if (this._dataList.length) { + const { _dataList, _style } = this; + const vchart = this._template.vchartInstance(); + if (vchart) { + const marks = getAllSeriesMarksWithoutRoot(vchart); + if (marks && marks.length) { + marks.forEach(mark => { + mark.getProduct().encodeState('highlight', _style); + }); + vchart.updateState({ + highlight: { + filter: { datums: _dataList, dataKeys: undefined } + } + }); + } + } + } + } +} diff --git a/packages/vstory/src/animate/typewirter.ts b/packages/vstory/src/animate/typewirter.ts new file mode 100644 index 0000000..8936fea --- /dev/null +++ b/packages/vstory/src/animate/typewirter.ts @@ -0,0 +1,76 @@ +import { ACustomAnimate, createLine, createSymbol, getTextBounds } from '@visactor/vrender-core'; +import type { IGraphic } from '@visactor/vrender-core'; +import { isArray } from '@visactor/vutils'; + +export class TypeWriter extends ACustomAnimate<{ text: string }> { + declare valid: boolean; + declare target: IGraphic; + + private fromText = ''; + private toText = ''; + + getEndProps(): Record { + if (this.valid === false) { + return {}; + } + return { + text: this.to + }; + } + + onBind(): void { + // const symbol = createSymbol({ + // x: this.target.attribute.x, + // y: this.target.attribute.y, + // symbolType: 'circle', + // size: 6, + // fill: 'red' + // }); + // this.target.parent.add(symbol); + // console.log(this.target); + this.fromText = this.from?.text ?? ''; + this.toText = this.to?.text ?? ''; + if (!this.toText || isArray(this.toText)) { + this.valid = false; + } else { + this.toText = this.toText.toString(); + const root = this.target.attachShadow(); + const fontSize = this.target.getComputedAttribute('fontSize'); + const line = createLine({ + x: 0, + y: 0, + dy: -fontSize / 2, + points: [ + { x: 0, y: 0 }, + { x: 0, y: fontSize } + ], + stroke: 'black' + }); + root.add(line); + } + } + + onEnd(): void { + this.target.detachShadow(); + return; + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + if (this.valid === false) { + return; + } + // update text + const fromCount = this.fromText.length; + const toCount = this.toText.length; + const count = Math.ceil(fromCount + (toCount - fromCount) * ratio); + + out.text = this.toText.substr(0, count); + + // update line position + const line = this.target.shadowRoot?.at(0) as IGraphic; + + const endX = getTextBounds({ ...this.target.attribute, ...out }).width() / 2 + 2; + + line.setAttribute('x', endX); + } +} diff --git a/packages/vstory/src/animate/util/paths.ts b/packages/vstory/src/animate/util/paths.ts new file mode 100644 index 0000000..ba385ef --- /dev/null +++ b/packages/vstory/src/animate/util/paths.ts @@ -0,0 +1,1558 @@ +// @ts-nocheck + +/*! + * paths 3.12.5 + * https://gsap.com + * + * Copyright 2008-2024, GreenSock. All rights reserved. + * Subject to the terms at https://gsap.com/standard-license or for + * Club GSAP members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ +/* eslint-disable */ + +let _svgPathExp = /[achlmqstvz]|(-?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi, + _numbersExp = /(?:(-)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi, + _scientific = /[\+\-]?\d*\.?\d+e[\+\-]?\d+/gi, + _selectorExp = /(^[#\.][a-z]|[a-y][a-z])/i, + _DEG2RAD = Math.PI / 180, + _RAD2DEG = 180 / Math.PI, + _sin = Math.sin, + _cos = Math.cos, + _abs = Math.abs, + _sqrt = Math.sqrt, + _atan2 = Math.atan2, + _largeNum = 1e8, + _isString = value => typeof value === 'string', + _isNumber = value => typeof value === 'number', + _isUndefined = value => typeof value === 'undefined', + _temp = {}, + _temp2 = {}, + _roundingNum = 1e5, + _wrapProgress = progress => + Math.round(((progress + _largeNum) % 1) * _roundingNum) / _roundingNum || (progress < 0 ? 0 : 1), //if progress lands on 1, the % will make it 0 which is why we || 1, but not if it's negative because it makes more sense for motion to end at 0 in that case. + _round = value => Math.round(value * _roundingNum) / _roundingNum || 0, + _roundPrecise = value => Math.round(value * 1e10) / 1e10 || 0, + _splitSegment = (rawPath, segIndex, i, t) => { + let segment = rawPath[segIndex], + shift = t === 1 ? 6 : subdivideSegment(segment, i, t); + if ((shift || !t) && shift + i + 2 < segment.length) { + rawPath.splice(segIndex, 0, segment.slice(0, i + shift + 2)); + segment.splice(0, i + shift); + return 1; + } + }, + _getSampleIndex = (samples, length, progress) => { + // slightly slower way than doing this (when there's no lookup): segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0; + let l = samples.length, + i = ~~(progress * l); + if (samples[i] > length) { + while (--i && samples[i] > length) {} + i < 0 && (i = 0); + } else { + while (samples[++i] < length && i < l) {} + } + return i < l ? i : l - 1; + }, + _reverseRawPath = (rawPath, skipOuter) => { + let i = rawPath.length; + skipOuter || rawPath.reverse(); + while (i--) { + rawPath[i].reversed || reverseSegment(rawPath[i]); + } + }, + _copyMetaData = (source, copy) => { + copy.totalLength = source.totalLength; + if (source.samples) { + //segment + copy.samples = source.samples.slice(0); + copy.lookup = source.lookup.slice(0); + copy.minLength = source.minLength; + copy.resolution = source.resolution; + } else if (source.totalPoints) { + //rawPath + copy.totalPoints = source.totalPoints; + } + return copy; + }, + //pushes a new segment into a rawPath, but if its starting values match the ending values of the last segment, it'll merge it into that same segment (to reduce the number of segments) + _appendOrMerge = (rawPath, segment) => { + let index = rawPath.length, + prevSeg = rawPath[index - 1] || [], + l = prevSeg.length; + if (index && segment[0] === prevSeg[l - 2] && segment[1] === prevSeg[l - 1]) { + segment = prevSeg.concat(segment.slice(2)); + index--; + } + rawPath[index] = segment; + }, + _bestDistance; + +/* TERMINOLOGY + - RawPath - an array of arrays, one for each Segment. A single RawPath could have multiple "M" commands, defining Segments (paths aren't always connected). + - Segment - an array containing a sequence of Cubic Bezier coordinates in alternating x, y, x, y format. Starting anchor, then control point 1, control point 2, and ending anchor, then the next control point 1, control point 2, anchor, etc. Uses less memory than an array with a bunch of {x, y} points. + - Bezier - a single cubic Bezier with a starting anchor, two control points, and an ending anchor. + - the variable "t" is typically the position along an individual Bezier path (time) and it's NOT linear, meaning it could accelerate/decelerate based on the control points whereas the "p" or "progress" value is linearly mapped to the whole path, so it shouldn't really accelerate/decelerate based on control points. So a progress of 0.2 would be almost exactly 20% along the path. "t" is ONLY in an individual Bezier piece. + */ + +//accepts basic selector text, a path instance, a RawPath instance, or a Segment and returns a RawPath (makes it easy to homogenize things). If an element or selector text is passed in, it'll also cache the value so that if it's queried again, it'll just take the path data from there instead of parsing it all over again (as long as the path data itself hasn't changed - it'll check). +export function getRawPath(value) { + value = _isString(value) && _selectorExp.test(value) ? document.querySelector(value) || value : value; + let e = value.getAttribute ? value : 0, + rawPath; + if (e && (value = value.getAttribute('d'))) { + //implements caching + if (!e._gsPath) { + e._gsPath = {}; + } + rawPath = e._gsPath[value]; + return rawPath && !rawPath._dirty ? rawPath : (e._gsPath[value] = stringToRawPath(value)); + } + return !value + ? console.warn('Expecting a element or an SVG path data string') + : _isString(value) + ? stringToRawPath(value) + : _isNumber(value[0]) + ? [value] + : value; +} + +//copies a RawPath WITHOUT the length meta data (for speed) +export function copyRawPath(rawPath) { + let a = [], + i = 0; + for (; i < rawPath.length; i++) { + a[i] = _copyMetaData(rawPath[i], rawPath[i].slice(0)); + } + return _copyMetaData(rawPath, a); +} + +export function reverseSegment(segment) { + let i = 0, + y; + segment.reverse(); //this will invert the order y, x, y, x so we must flip it back. + for (; i < segment.length; i += 2) { + y = segment[i]; + segment[i] = segment[i + 1]; + segment[i + 1] = y; + } + segment.reversed = !segment.reversed; +} + +let _createPath = (e, ignore) => { + let path = document.createElementNS('http://www.w3.org/2000/svg', 'path'), + attr = [].slice.call(e.attributes), + i = attr.length, + name; + ignore = ',' + ignore + ','; + while (--i > -1) { + name = attr[i].nodeName.toLowerCase(); //in Microsoft Edge, if you don't set the attribute with a lowercase name, it doesn't render correctly! Super weird. + if (ignore.indexOf(',' + name + ',') < 0) { + path.setAttributeNS(null, name, attr[i].nodeValue); + } + } + return path; + }, + _typeAttrs = { + rect: 'rx,ry,x,y,width,height', + circle: 'r,cx,cy', + ellipse: 'rx,ry,cx,cy', + line: 'x1,x2,y1,y2' + }, + _attrToObj = (e, attrs) => { + let props = attrs ? attrs.split(',') : [], + obj = {}, + i = props.length; + while (--i > -1) { + obj[props[i]] = +e.getAttribute(props[i]) || 0; + } + return obj; + }; + +//converts an SVG shape like , , , , , etc. to a , swapping it in and copying the attributes to match. +export function convertToPath(element, swap) { + let type = element.tagName.toLowerCase(), + circ = 0.552284749831, + data, + x, + y, + r, + ry, + path, + rcirc, + rycirc, + points, + w, + h, + x2, + x3, + x4, + x5, + x6, + y2, + y3, + y4, + y5, + y6, + attr; + if (type === 'path' || !element.getBBox) { + return element; + } + path = _createPath(element, 'x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points'); + attr = _attrToObj(element, _typeAttrs[type]); + if (type === 'rect') { + r = attr.rx; + ry = attr.ry || r; + x = attr.x; + y = attr.y; + w = attr.width - r * 2; + h = attr.height - ry * 2; + if (r || ry) { + //if there are rounded corners, render cubic beziers + x2 = x + r * (1 - circ); + x3 = x + r; + x4 = x3 + w; + x5 = x4 + r * circ; + x6 = x4 + r; + y2 = y + ry * (1 - circ); + y3 = y + ry; + y4 = y3 + h; + y5 = y4 + ry * circ; + y6 = y4 + ry; + data = + 'M' + + x6 + + ',' + + y3 + + ' V' + + y4 + + ' C' + + [ + x6, + y5, + x5, + y6, + x4, + y6, + x4 - (x4 - x3) / 3, + y6, + x3 + (x4 - x3) / 3, + y6, + x3, + y6, + x2, + y6, + x, + y5, + x, + y4, + x, + y4 - (y4 - y3) / 3, + x, + y3 + (y4 - y3) / 3, + x, + y3, + x, + y2, + x2, + y, + x3, + y, + x3 + (x4 - x3) / 3, + y, + x4 - (x4 - x3) / 3, + y, + x4, + y, + x5, + y, + x6, + y2, + x6, + y3 + ].join(',') + + 'z'; + } else { + data = 'M' + (x + w) + ',' + y + ' v' + h + ' h' + -w + ' v' + -h + ' h' + w + 'z'; + } + } else if (type === 'circle' || type === 'ellipse') { + if (type === 'circle') { + r = ry = attr.r; + rycirc = r * circ; + } else { + r = attr.rx; + ry = attr.ry; + rycirc = ry * circ; + } + x = attr.cx; + y = attr.cy; + rcirc = r * circ; + data = + 'M' + + (x + r) + + ',' + + y + + ' C' + + [ + x + r, + y + rycirc, + x + rcirc, + y + ry, + x, + y + ry, + x - rcirc, + y + ry, + x - r, + y + rycirc, + x - r, + y, + x - r, + y - rycirc, + x - rcirc, + y - ry, + x, + y - ry, + x + rcirc, + y - ry, + x + r, + y - rycirc, + x + r, + y + ].join(',') + + 'z'; + } else if (type === 'line') { + data = 'M' + attr.x1 + ',' + attr.y1 + ' L' + attr.x2 + ',' + attr.y2; //previously, we just converted to "Mx,y Lx,y" but Safari has bugs that cause that not to render properly when using a stroke-dasharray that's not fully visible! Using a cubic bezier fixes that issue. + } else if (type === 'polyline' || type === 'polygon') { + points = (element.getAttribute('points') + '').match(_numbersExp) || []; + x = points.shift(); + y = points.shift(); + data = 'M' + x + ',' + y + ' L' + points.join(','); + if (type === 'polygon') { + data += ',' + x + ',' + y + 'z'; + } + } + path.setAttribute('d', rawPathToString((path._gsRawPath = stringToRawPath(data)))); + if (swap && element.parentNode) { + element.parentNode.insertBefore(path, element); + element.parentNode.removeChild(element); + } + return path; +} + +//returns the rotation (in degrees) at a particular progress on a rawPath (the slope of the tangent) +export function getRotationAtProgress(rawPath, progress) { + let d = getProgressData(rawPath, progress >= 1 ? 1 - 1e-9 : progress ? progress : 1e-9); + return getRotationAtBezierT(d.segment, d.i, d.t); +} + +function getRotationAtBezierT(segment, i, t) { + let a = segment[i], + b = segment[i + 2], + c = segment[i + 4], + x; + a += (b - a) * t; + b += (c - b) * t; + a += (b - a) * t; + x = b + (c + (segment[i + 6] - c) * t - b) * t - a; + a = segment[i + 1]; + b = segment[i + 3]; + c = segment[i + 5]; + a += (b - a) * t; + b += (c - b) * t; + a += (b - a) * t; + return _round(_atan2(b + (c + (segment[i + 7] - c) * t - b) * t - a, x) * _RAD2DEG); +} + +export function sliceRawPath(rawPath, start, end) { + end = _isUndefined(end) ? 1 : _roundPrecise(end) || 0; // we must round to avoid issues like 4.15 / 8 = 0.8300000000000001 instead of 0.83 or 2.8 / 5 = 0.5599999999999999 instead of 0.56 and if someone is doing a loop like start: 2.8 / 0.5, end: 2.8 / 0.5 + 1. + start = _roundPrecise(start) || 0; + let loops = Math.max(0, ~~(_abs(end - start) - 1e-8)), + path = copyRawPath(rawPath); + if (start > end) { + start = 1 - start; + end = 1 - end; + _reverseRawPath(path); + path.totalLength = 0; + } + if (start < 0 || end < 0) { + let offset = Math.abs(~~Math.min(start, end)) + 1; + start += offset; + end += offset; + } + path.totalLength || cacheRawPathMeasurements(path); + let wrap = end > 1, + s = getProgressData(path, start, _temp, true), + e = getProgressData(path, end, _temp2), + eSeg = e.segment, + sSeg = s.segment, + eSegIndex = e.segIndex, + sSegIndex = s.segIndex, + ei = e.i, + si = s.i, + sameSegment = sSegIndex === eSegIndex, + sameBezier = ei === si && sameSegment, + wrapsBehind, + sShift, + eShift, + i, + copy, + totalSegments, + l, + j; + if (wrap || loops) { + wrapsBehind = eSegIndex < sSegIndex || (sameSegment && ei < si) || (sameBezier && e.t < s.t); + if (_splitSegment(path, sSegIndex, si, s.t)) { + sSegIndex++; + if (!wrapsBehind) { + eSegIndex++; + if (sameBezier) { + e.t = (e.t - s.t) / (1 - s.t); + ei = 0; + } else if (sameSegment) { + ei -= si; + } + } + } + if (Math.abs(1 - (end - start)) < 1e-5) { + eSegIndex = sSegIndex - 1; + } else if (!e.t && eSegIndex) { + eSegIndex--; + } else if (_splitSegment(path, eSegIndex, ei, e.t) && wrapsBehind) { + sSegIndex++; + } + if (s.t === 1) { + sSegIndex = (sSegIndex + 1) % path.length; + } + copy = []; + totalSegments = path.length; + l = 1 + totalSegments * loops; + j = sSegIndex; + l += (totalSegments - sSegIndex + eSegIndex) % totalSegments; + for (i = 0; i < l; i++) { + _appendOrMerge(copy, path[j++ % totalSegments]); + } + path = copy; + } else { + eShift = e.t === 1 ? 6 : subdivideSegment(eSeg, ei, e.t); + if (start !== end) { + sShift = subdivideSegment(sSeg, si, sameBezier ? s.t / e.t : s.t); + sameSegment && (eShift += sShift); + eSeg.splice(ei + eShift + 2); + (sShift || si) && sSeg.splice(0, si + sShift); + i = path.length; + while (i--) { + //chop off any extra segments + (i < sSegIndex || i > eSegIndex) && path.splice(i, 1); + } + } else { + eSeg.angle = getRotationAtBezierT(eSeg, ei + eShift, 0); //record the value before we chop because it'll be impossible to determine the angle after its length is 0! + ei += eShift; + s = eSeg[ei]; + e = eSeg[ei + 1]; + eSeg.length = eSeg.totalLength = 0; + eSeg.totalPoints = path.totalPoints = 8; + eSeg.push(s, e, s, e, s, e, s, e); + } + } + path.totalLength = 0; + return path; +} + +//measures a Segment according to its resolution (so if segment.resolution is 6, for example, it'll take 6 samples equally across each Bezier) and create/populate a "samples" Array that has the length up to each of those sample points (always increasing from the start) as well as a "lookup" array that's broken up according to the smallest distance between 2 samples. This gives us a very fast way of looking up a progress position rather than looping through all the points/Beziers. You can optionally have it only measure a subset, starting at startIndex and going for a specific number of beziers (remember, there are 3 x/y pairs each, for a total of 6 elements for each Bezier). It will also populate a "totalLength" property, but that's not generally super accurate because by default it'll only take 6 samples per Bezier. But for performance reasons, it's perfectly adequate for measuring progress values along the path. If you need a more accurate totalLength, either increase the resolution or use the more advanced bezierToPoints() method which keeps adding points until they don't deviate by more than a certain precision value. +function measureSegment(segment, startIndex, bezierQty) { + startIndex = startIndex || 0; + if (!segment.samples) { + segment.samples = []; + segment.lookup = []; + } + let resolution = ~~segment.resolution || 12, + inc = 1 / resolution, + endIndex = bezierQty ? startIndex + bezierQty * 6 + 1 : segment.length, + x1 = segment[startIndex], + y1 = segment[startIndex + 1], + samplesIndex = startIndex ? (startIndex / 6) * resolution : 0, + samples = segment.samples, + lookup = segment.lookup, + min = (startIndex ? segment.minLength : _largeNum) || _largeNum, + prevLength = samples[samplesIndex + bezierQty * resolution - 1], + length = startIndex ? samples[samplesIndex - 1] : 0, + i, + j, + x4, + x3, + x2, + xd, + xd1, + y4, + y3, + y2, + yd, + yd1, + inv, + t, + lengthIndex, + l, + segLength; + samples.length = lookup.length = 0; + for (j = startIndex + 2; j < endIndex; j += 6) { + x4 = segment[j + 4] - x1; + x3 = segment[j + 2] - x1; + x2 = segment[j] - x1; + y4 = segment[j + 5] - y1; + y3 = segment[j + 3] - y1; + y2 = segment[j + 1] - y1; + xd = xd1 = yd = yd1 = 0; + if (_abs(x4) < 0.01 && _abs(y4) < 0.01 && _abs(x2) + _abs(y2) < 0.01) { + //dump points that are sufficiently close (basically right on top of each other, making a bezier super tiny or 0 length) + if (segment.length > 8) { + segment.splice(j, 6); + j -= 6; + endIndex -= 6; + } + } else { + for (i = 1; i <= resolution; i++) { + t = inc * i; + inv = 1 - t; + xd = xd1 - (xd1 = (t * t * x4 + 3 * inv * (t * x3 + inv * x2)) * t); + yd = yd1 - (yd1 = (t * t * y4 + 3 * inv * (t * y3 + inv * y2)) * t); + l = _sqrt(yd * yd + xd * xd); + if (l < min) { + min = l; + } + length += l; + samples[samplesIndex++] = length; + } + } + x1 += x4; + y1 += y4; + } + if (prevLength) { + prevLength -= length; + for (; samplesIndex < samples.length; samplesIndex++) { + samples[samplesIndex] += prevLength; + } + } + if (samples.length && min) { + segment.totalLength = segLength = samples[samples.length - 1] || 0; + segment.minLength = min; + if (segLength / min < 9999) { + // if the lookup would require too many values (memory problem), we skip this and instead we use a loop to lookup values directly in the samples Array + l = lengthIndex = 0; + for (i = 0; i < segLength; i += min) { + lookup[l++] = samples[lengthIndex] < i ? ++lengthIndex : lengthIndex; + } + } + } else { + segment.totalLength = samples[0] = 0; + } + return startIndex ? length - samples[startIndex / 2 - 1] : length; +} + +export function cacheRawPathMeasurements(rawPath, resolution) { + let pathLength, points, i; + for (i = pathLength = points = 0; i < rawPath.length; i++) { + rawPath[i].resolution = ~~resolution || 12; //steps per Bezier curve (anchor, 2 control points, to anchor) + points += rawPath[i].length; + pathLength += measureSegment(rawPath[i]); + } + rawPath.totalPoints = points; + rawPath.totalLength = pathLength; + return rawPath; +} + +//divide segment[i] at position t (value between 0 and 1, progress along that particular cubic bezier segment that starts at segment[i]). Returns how many elements were spliced into the segment array (either 0 or 6) +export function subdivideSegment(segment, i, t) { + if (t <= 0 || t >= 1) { + return 0; + } + let ax = segment[i], + ay = segment[i + 1], + cp1x = segment[i + 2], + cp1y = segment[i + 3], + cp2x = segment[i + 4], + cp2y = segment[i + 5], + bx = segment[i + 6], + by = segment[i + 7], + x1a = ax + (cp1x - ax) * t, + x2 = cp1x + (cp2x - cp1x) * t, + y1a = ay + (cp1y - ay) * t, + y2 = cp1y + (cp2y - cp1y) * t, + x1 = x1a + (x2 - x1a) * t, + y1 = y1a + (y2 - y1a) * t, + x2a = cp2x + (bx - cp2x) * t, + y2a = cp2y + (by - cp2y) * t; + x2 += (x2a - x2) * t; + y2 += (y2a - y2) * t; + segment.splice( + i + 2, + 4, + _round(x1a), //first control point + _round(y1a), + _round(x1), //second control point + _round(y1), + _round(x1 + (x2 - x1) * t), //new fabricated anchor on line + _round(y1 + (y2 - y1) * t), + _round(x2), //third control point + _round(y2), + _round(x2a), //fourth control point + _round(y2a) + ); + segment.samples && segment.samples.splice(((i / 6) * segment.resolution) | 0, 0, 0, 0, 0, 0, 0, 0); + return 6; +} + +// returns an object {path, segment, segIndex, i, t} +function getProgressData(rawPath, progress, decoratee, pushToNextIfAtEnd) { + decoratee = decoratee || {}; + rawPath.totalLength || cacheRawPathMeasurements(rawPath); + if (progress < 0 || progress > 1) { + progress = _wrapProgress(progress); + } + let segIndex = 0, + segment = rawPath[0], + samples, + resolution, + length, + min, + max, + i, + t; + if (!progress) { + t = i = segIndex = 0; + segment = rawPath[0]; + } else if (progress === 1) { + t = 1; + segIndex = rawPath.length - 1; + segment = rawPath[segIndex]; + i = segment.length - 8; + } else { + if (rawPath.length > 1) { + //speed optimization: most of the time, there's only one segment so skip the recursion. + length = rawPath.totalLength * progress; + max = i = 0; + while ((max += rawPath[i++].totalLength) < length) { + segIndex = i; + } + segment = rawPath[segIndex]; + min = max - segment.totalLength; + progress = (length - min) / (max - min) || 0; + } + samples = segment.samples; + resolution = segment.resolution; //how many samples per cubic bezier chunk + length = segment.totalLength * progress; + i = segment.lookup.length + ? segment.lookup[~~(length / segment.minLength)] || 0 + : _getSampleIndex(samples, length, progress); + min = i ? samples[i - 1] : 0; + max = samples[i]; + if (max < length) { + min = max; + max = samples[++i]; + } + t = (1 / resolution) * ((length - min) / (max - min) + (i % resolution)); + i = ~~(i / resolution) * 6; + if (pushToNextIfAtEnd && t === 1) { + if (i + 6 < segment.length) { + i += 6; + t = 0; + } else if (segIndex + 1 < rawPath.length) { + i = t = 0; + segment = rawPath[++segIndex]; + } + } + } + decoratee.t = t; + decoratee.i = i; + decoratee.path = rawPath; + decoratee.segment = segment; + decoratee.segIndex = segIndex; + return decoratee; +} + +export function getPositionOnPath(rawPath, progress, includeAngle, point) { + let segment = rawPath[0], + result = point || {}, + samples, + resolution, + length, + min, + max, + i, + t, + a, + inv; + if (progress < 0 || progress > 1) { + progress = _wrapProgress(progress); + } + segment.lookup || cacheRawPathMeasurements(rawPath); + if (rawPath.length > 1) { + //speed optimization: most of the time, there's only one segment so skip the recursion. + length = rawPath.totalLength * progress; + max = i = 0; + while ((max += rawPath[i++].totalLength) < length) { + segment = rawPath[i]; + } + min = max - segment.totalLength; + progress = (length - min) / (max - min) || 0; + } + samples = segment.samples; + resolution = segment.resolution; + length = segment.totalLength * progress; + i = segment.lookup.length + ? segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0 + : _getSampleIndex(samples, length, progress); + min = i ? samples[i - 1] : 0; + max = samples[i]; + if (max < length) { + min = max; + max = samples[++i]; + } + t = (1 / resolution) * ((length - min) / (max - min) + (i % resolution)) || 0; + inv = 1 - t; + i = ~~(i / resolution) * 6; + a = segment[i]; + result.x = _round( + (t * t * (segment[i + 6] - a) + 3 * inv * (t * (segment[i + 4] - a) + inv * (segment[i + 2] - a))) * t + a + ); + result.y = _round( + (t * t * (segment[i + 7] - (a = segment[i + 1])) + + 3 * inv * (t * (segment[i + 5] - a) + inv * (segment[i + 3] - a))) * + t + + a + ); + if (includeAngle) { + result.angle = segment.totalLength + ? getRotationAtBezierT(segment, i, t >= 1 ? 1 - 1e-9 : t ? t : 1e-9) + : segment.angle || 0; + } + return result; +} + +//applies a matrix transform to RawPath (or a segment in a RawPath) and returns whatever was passed in (it transforms the values in the array(s), not a copy). +export function transformRawPath(rawPath, a, b, c, d, tx, ty) { + let j = rawPath.length, + segment, + l, + i, + x, + y; + while (--j > -1) { + segment = rawPath[j]; + l = segment.length; + for (i = 0; i < l; i += 2) { + x = segment[i]; + y = segment[i + 1]; + segment[i] = x * a + y * c + tx; + segment[i + 1] = x * b + y * d + ty; + } + } + rawPath._dirty = 1; + return rawPath; +} + +// translates SVG arc data into a segment (cubic beziers). Angle is in degrees. +function arcToSegment(lastX, lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y) { + if (lastX === x && lastY === y) { + return; + } + rx = _abs(rx); + ry = _abs(ry); + let angleRad = (angle % 360) * _DEG2RAD, + cosAngle = _cos(angleRad), + sinAngle = _sin(angleRad), + PI = Math.PI, + TWOPI = PI * 2, + dx2 = (lastX - x) / 2, + dy2 = (lastY - y) / 2, + x1 = cosAngle * dx2 + sinAngle * dy2, + y1 = -sinAngle * dx2 + cosAngle * dy2, + x1_sq = x1 * x1, + y1_sq = y1 * y1, + radiiCheck = x1_sq / (rx * rx) + y1_sq / (ry * ry); + if (radiiCheck > 1) { + rx = _sqrt(radiiCheck) * rx; + ry = _sqrt(radiiCheck) * ry; + } + let rx_sq = rx * rx, + ry_sq = ry * ry, + sq = (rx_sq * ry_sq - rx_sq * y1_sq - ry_sq * x1_sq) / (rx_sq * y1_sq + ry_sq * x1_sq); + if (sq < 0) { + sq = 0; + } + let coef = (largeArcFlag === sweepFlag ? -1 : 1) * _sqrt(sq), + cx1 = coef * ((rx * y1) / ry), + cy1 = coef * -((ry * x1) / rx), + sx2 = (lastX + x) / 2, + sy2 = (lastY + y) / 2, + cx = sx2 + (cosAngle * cx1 - sinAngle * cy1), + cy = sy2 + (sinAngle * cx1 + cosAngle * cy1), + ux = (x1 - cx1) / rx, + uy = (y1 - cy1) / ry, + vx = (-x1 - cx1) / rx, + vy = (-y1 - cy1) / ry, + temp = ux * ux + uy * uy, + angleStart = (uy < 0 ? -1 : 1) * Math.acos(ux / _sqrt(temp)), + angleExtent = (ux * vy - uy * vx < 0 ? -1 : 1) * Math.acos((ux * vx + uy * vy) / _sqrt(temp * (vx * vx + vy * vy))); + isNaN(angleExtent) && (angleExtent = PI); //rare edge case. Math.cos(-1) is NaN. + if (!sweepFlag && angleExtent > 0) { + angleExtent -= TWOPI; + } else if (sweepFlag && angleExtent < 0) { + angleExtent += TWOPI; + } + angleStart %= TWOPI; + angleExtent %= TWOPI; + let segments = Math.ceil(_abs(angleExtent) / (TWOPI / 4)), + rawPath = [], + angleIncrement = angleExtent / segments, + controlLength = ((4 / 3) * _sin(angleIncrement / 2)) / (1 + _cos(angleIncrement / 2)), + ma = cosAngle * rx, + mb = sinAngle * rx, + mc = sinAngle * -ry, + md = cosAngle * ry, + i; + for (i = 0; i < segments; i++) { + angle = angleStart + i * angleIncrement; + x1 = _cos(angle); + y1 = _sin(angle); + ux = _cos((angle += angleIncrement)); + uy = _sin(angle); + rawPath.push( + x1 - controlLength * y1, + y1 + controlLength * x1, + ux + controlLength * uy, + uy - controlLength * ux, + ux, + uy + ); + } + //now transform according to the actual size of the ellipse/arc (the beziers were noramlized, between 0 and 1 on a circle). + for (i = 0; i < rawPath.length; i += 2) { + x1 = rawPath[i]; + y1 = rawPath[i + 1]; + rawPath[i] = x1 * ma + y1 * mc + cx; + rawPath[i + 1] = x1 * mb + y1 * md + cy; + } + rawPath[i - 2] = x; //always set the end to exactly where it's supposed to be + rawPath[i - 1] = y; + return rawPath; +} + +//Spits back a RawPath with absolute coordinates. Each segment starts with a "moveTo" command (x coordinate, then y) and then 2 control points (x, y, x, y), then anchor. The goal is to minimize memory and maximize speed. +export function stringToRawPath(d) { + let a = + (d + '') + .replace(_scientific, m => { + let n = +m; + return n < 0.0001 && n > -0.0001 ? 0 : n; + }) + .match(_svgPathExp) || [], //some authoring programs spit out very small numbers in scientific notation like "1e-5", so make sure we round that down to 0 first. + path = [], + relativeX = 0, + relativeY = 0, + twoThirds = 2 / 3, + elements = a.length, + points = 0, + errorMessage = 'ERROR: malformed path: ' + d, + i, + j, + x, + y, + command, + isRelative, + segment, + startX, + startY, + difX, + difY, + beziers, + prevCommand, + flag1, + flag2, + line = function (sx, sy, ex, ey) { + difX = (ex - sx) / 3; + difY = (ey - sy) / 3; + segment.push(sx + difX, sy + difY, ex - difX, ey - difY, ex, ey); + }; + if (!d || !isNaN(a[0]) || isNaN(a[1])) { + console.log(errorMessage); + return path; + } + for (i = 0; i < elements; i++) { + prevCommand = command; + if (isNaN(a[i])) { + command = a[i].toUpperCase(); + isRelative = command !== a[i]; //lower case means relative + } else { + //commands like "C" can be strung together without any new command characters between. + i--; + } + x = +a[i + 1]; + y = +a[i + 2]; + if (isRelative) { + x += relativeX; + y += relativeY; + } + if (!i) { + startX = x; + startY = y; + } + + // "M" (move) + if (command === 'M') { + if (segment) { + if (segment.length < 8) { + //if the path data was funky and just had a M with no actual drawing anywhere, skip it. + path.length -= 1; + } else { + points += segment.length; + } + } + relativeX = startX = x; + relativeY = startY = y; + segment = [x, y]; + path.push(segment); + i += 2; + command = 'L'; //an "M" with more than 2 values gets interpreted as "lineTo" commands ("L"). + + // "C" (cubic bezier) + } else if (command === 'C') { + if (!segment) { + segment = [0, 0]; + } + if (!isRelative) { + relativeX = relativeY = 0; + } + //note: "*1" is just a fast/short way to cast the value as a Number. WAAAY faster in Chrome, slightly slower in Firefox. + segment.push( + x, + y, + relativeX + a[i + 3] * 1, + relativeY + a[i + 4] * 1, + (relativeX += a[i + 5] * 1), + (relativeY += a[i + 6] * 1) + ); + i += 6; + + // "S" (continuation of cubic bezier) + } else if (command === 'S') { + difX = relativeX; + difY = relativeY; + if (prevCommand === 'C' || prevCommand === 'S') { + difX += relativeX - segment[segment.length - 4]; + difY += relativeY - segment[segment.length - 3]; + } + if (!isRelative) { + relativeX = relativeY = 0; + } + segment.push(difX, difY, x, y, (relativeX += a[i + 3] * 1), (relativeY += a[i + 4] * 1)); + i += 4; + + // "Q" (quadratic bezier) + } else if (command === 'Q') { + difX = relativeX + (x - relativeX) * twoThirds; + difY = relativeY + (y - relativeY) * twoThirds; + if (!isRelative) { + relativeX = relativeY = 0; + } + relativeX += a[i + 3] * 1; + relativeY += a[i + 4] * 1; + segment.push( + difX, + difY, + relativeX + (x - relativeX) * twoThirds, + relativeY + (y - relativeY) * twoThirds, + relativeX, + relativeY + ); + i += 4; + + // "T" (continuation of quadratic bezier) + } else if (command === 'T') { + difX = relativeX - segment[segment.length - 4]; + difY = relativeY - segment[segment.length - 3]; + segment.push( + relativeX + difX, + relativeY + difY, + x + (relativeX + difX * 1.5 - x) * twoThirds, + y + (relativeY + difY * 1.5 - y) * twoThirds, + (relativeX = x), + (relativeY = y) + ); + i += 2; + + // "H" (horizontal line) + } else if (command === 'H') { + line(relativeX, relativeY, (relativeX = x), relativeY); + i += 1; + + // "V" (vertical line) + } else if (command === 'V') { + //adjust values because the first (and only one) isn't x in this case, it's y. + line(relativeX, relativeY, relativeX, (relativeY = x + (isRelative ? relativeY - relativeX : 0))); + i += 1; + + // "L" (line) or "Z" (close) + } else if (command === 'L' || command === 'Z') { + if (command === 'Z') { + x = startX; + y = startY; + segment.closed = true; + } + if (command === 'L' || _abs(relativeX - x) > 0.5 || _abs(relativeY - y) > 0.5) { + line(relativeX, relativeY, x, y); + if (command === 'L') { + i += 2; + } + } + relativeX = x; + relativeY = y; + + // "A" (arc) + } else if (command === 'A') { + flag1 = a[i + 4]; + flag2 = a[i + 5]; + difX = a[i + 6]; + difY = a[i + 7]; + j = 7; + if (flag1.length > 1) { + // for cases when the flags are merged, like "a8 8 0 018 8" (the 0 and 1 flags are WITH the x value of 8, but it could also be "a8 8 0 01-8 8" so it may include x or not) + if (flag1.length < 3) { + difY = difX; + difX = flag2; + j--; + } else { + difY = flag2; + difX = flag1.substr(2); + j -= 2; + } + flag2 = flag1.charAt(1); + flag1 = flag1.charAt(0); + } + beziers = arcToSegment( + relativeX, + relativeY, + +a[i + 1], + +a[i + 2], + +a[i + 3], + +flag1, + +flag2, + (isRelative ? relativeX : 0) + difX * 1, + (isRelative ? relativeY : 0) + difY * 1 + ); + i += j; + if (beziers) { + for (j = 0; j < beziers.length; j++) { + segment.push(beziers[j]); + } + } + relativeX = segment[segment.length - 2]; + relativeY = segment[segment.length - 1]; + } else { + console.log(errorMessage); + } + } + i = segment.length; + if (i < 6) { + //in case there's odd SVG like a M0,0 command at the very end. + path.pop(); + i = 0; + } else if (segment[0] === segment[i - 2] && segment[1] === segment[i - 1]) { + segment.closed = true; + } + path.totalPoints = points + i; + return path; +} + +//populates the points array in alternating x/y values (like [x, y, x, y...] instead of individual point objects [{x, y}, {x, y}...] to conserve memory and stay in line with how we're handling segment arrays +export function bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) { + let x12 = (x1 + x2) / 2, + y12 = (y1 + y2) / 2, + x23 = (x2 + x3) / 2, + y23 = (y2 + y3) / 2, + x34 = (x3 + x4) / 2, + y34 = (y3 + y4) / 2, + x123 = (x12 + x23) / 2, + y123 = (y12 + y23) / 2, + x234 = (x23 + x34) / 2, + y234 = (y23 + y34) / 2, + x1234 = (x123 + x234) / 2, + y1234 = (y123 + y234) / 2, + dx = x4 - x1, + dy = y4 - y1, + d2 = _abs((x2 - x4) * dy - (y2 - y4) * dx), + d3 = _abs((x3 - x4) * dy - (y3 - y4) * dx), + length; + if (!points) { + points = [x1, y1, x4, y4]; + index = 2; + } + points.splice(index || points.length - 2, 0, x1234, y1234); + if ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) { + length = points.length; + bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index); + bezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 2 + (points.length - length)); + } + return points; +} + +/* +function getAngleBetweenPoints(x0, y0, x1, y1, x2, y2) { //angle between 3 points in radians + var dx1 = x1 - x0, + dy1 = y1 - y0, + dx2 = x2 - x1, + dy2 = y2 - y1, + dx3 = x2 - x0, + dy3 = y2 - y0, + a = dx1 * dx1 + dy1 * dy1, + b = dx2 * dx2 + dy2 * dy2, + c = dx3 * dx3 + dy3 * dy3; + return Math.acos( (a + b - c) / _sqrt(4 * a * b) ); +}, +*/ + +//pointsToSegment() doesn't handle flat coordinates (where y is always 0) the way we need (the resulting control points are always right on top of the anchors), so this function basically makes the control points go directly up and down, varying in length based on the curviness (more curvy, further control points) +export function flatPointsToSegment(points, curviness = 1) { + let x = points[0], + y = 0, + segment = [x, y], + i = 2; + for (; i < points.length; i += 2) { + segment.push(x, y, points[i], (y = ((points[i] - x) * curviness) / 2), (x = points[i]), -y); + } + return segment; +} + +//points is an array of x/y points, like [x, y, x, y, x, y] +export function pointsToSegment(points, curviness) { + //points = simplifyPoints(points, tolerance); + _abs(points[0] - points[2]) < 1e-4 && _abs(points[1] - points[3]) < 1e-4 && (points = points.slice(2)); // if the first two points are super close, dump the first one. + let l = points.length - 2, + x = +points[0], + y = +points[1], + nextX = +points[2], + nextY = +points[3], + segment = [x, y, x, y], + dx2 = nextX - x, + dy2 = nextY - y, + closed = Math.abs(points[l] - x) < 0.001 && Math.abs(points[l + 1] - y) < 0.001, + prevX, + prevY, + i, + dx1, + dy1, + r1, + r2, + r3, + tl, + mx1, + mx2, + mxm, + my1, + my2, + mym; + if (closed) { + // if the start and end points are basically on top of each other, close the segment by adding the 2nd point to the end, and the 2nd-to-last point to the beginning (we'll remove them at the end, but this allows the curvature to look perfect) + points.push(nextX, nextY); + nextX = x; + nextY = y; + x = points[l - 2]; + y = points[l - 1]; + points.unshift(x, y); + l += 4; + } + curviness = curviness || curviness === 0 ? +curviness : 1; + for (i = 2; i < l; i += 2) { + prevX = x; + prevY = y; + x = nextX; + y = nextY; + nextX = +points[i + 2]; + nextY = +points[i + 3]; + if (x === nextX && y === nextY) { + continue; + } + dx1 = dx2; + dy1 = dy2; + dx2 = nextX - x; + dy2 = nextY - y; + r1 = _sqrt(dx1 * dx1 + dy1 * dy1); // r1, r2, and r3 correlate x and y (and z in the future). Basically 2D or 3D hypotenuse + r2 = _sqrt(dx2 * dx2 + dy2 * dy2); + r3 = _sqrt((dx2 / r2 + dx1 / r1) ** 2 + (dy2 / r2 + dy1 / r1) ** 2); + tl = ((r1 + r2) * curviness * 0.25) / r3; + mx1 = x - (x - prevX) * (r1 ? tl / r1 : 0); + mx2 = x + (nextX - x) * (r2 ? tl / r2 : 0); + mxm = x - (mx1 + (((mx2 - mx1) * ((r1 * 3) / (r1 + r2) + 0.5)) / 4 || 0)); + my1 = y - (y - prevY) * (r1 ? tl / r1 : 0); + my2 = y + (nextY - y) * (r2 ? tl / r2 : 0); + mym = y - (my1 + (((my2 - my1) * ((r1 * 3) / (r1 + r2) + 0.5)) / 4 || 0)); + if (x !== prevX || y !== prevY) { + segment.push( + _round(mx1 + mxm), // first control point + _round(my1 + mym), + _round(x), // anchor + _round(y), + _round(mx2 + mxm), // second control point + _round(my2 + mym) + ); + } + } + x !== nextX || y !== nextY || segment.length < 4 + ? segment.push(_round(nextX), _round(nextY), _round(nextX), _round(nextY)) + : (segment.length -= 2); + if (segment.length === 2) { + // only one point! + segment.push(x, y, x, y, x, y); + } else if (closed) { + segment.splice(0, 6); + segment.length = segment.length - 6; + } + return segment; +} + +//returns the squared distance between an x/y coordinate and a segment between x1/y1 and x2/y2 +function pointToSegDist(x, y, x1, y1, x2, y2) { + let dx = x2 - x1, + dy = y2 - y1, + t; + if (dx || dy) { + t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy); + if (t > 1) { + x1 = x2; + y1 = y2; + } else if (t > 0) { + x1 += dx * t; + y1 += dy * t; + } + } + return (x - x1) ** 2 + (y - y1) ** 2; +} + +function simplifyStep(points, first, last, tolerance, simplified) { + let maxSqDist = tolerance, + firstX = points[first], + firstY = points[first + 1], + lastX = points[last], + lastY = points[last + 1], + index, + i, + d; + for (i = first + 2; i < last; i += 2) { + d = pointToSegDist(points[i], points[i + 1], firstX, firstY, lastX, lastY); + if (d > maxSqDist) { + index = i; + maxSqDist = d; + } + } + if (maxSqDist > tolerance) { + index - first > 2 && simplifyStep(points, first, index, tolerance, simplified); + simplified.push(points[index], points[index + 1]); + last - index > 2 && simplifyStep(points, index, last, tolerance, simplified); + } +} + +//points is an array of x/y values like [x, y, x, y, x, y] +export function simplifyPoints(points, tolerance) { + let prevX = parseFloat(points[0]), + prevY = parseFloat(points[1]), + temp = [prevX, prevY], + l = points.length - 2, + i, + x, + y, + dx, + dy, + result, + last; + tolerance = (tolerance || 1) ** 2; + for (i = 2; i < l; i += 2) { + x = parseFloat(points[i]); + y = parseFloat(points[i + 1]); + dx = prevX - x; + dy = prevY - y; + if (dx * dx + dy * dy > tolerance) { + temp.push(x, y); + prevX = x; + prevY = y; + } + } + temp.push(parseFloat(points[l]), parseFloat(points[l + 1])); + last = temp.length - 2; + result = [temp[0], temp[1]]; + simplifyStep(temp, 0, last, tolerance, result); + result.push(temp[last], temp[last + 1]); + return result; +} + +function getClosestProgressOnBezier(iterations, px, py, start, end, slices, x0, y0, x1, y1, x2, y2, x3, y3) { + let inc = (end - start) / slices, + best = 0, + t = start, + x, + y, + d, + dx, + dy, + inv; + _bestDistance = _largeNum; + while (t <= end) { + inv = 1 - t; + x = inv * inv * inv * x0 + 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t * x3; + y = inv * inv * inv * y0 + 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t * y3; + dx = x - px; + dy = y - py; + d = dx * dx + dy * dy; + if (d < _bestDistance) { + _bestDistance = d; + best = t; + } + t += inc; + } + return iterations > 1 + ? getClosestProgressOnBezier( + iterations - 1, + px, + py, + Math.max(best - inc, 0), + Math.min(best + inc, 1), + slices, + x0, + y0, + x1, + y1, + x2, + y2, + x3, + y3 + ) + : best; +} + +export function getClosestData(rawPath, x, y, slices) { + //returns an object with the closest j, i, and t (j is the segment index, i is the index of the point in that segment, and t is the time/progress along that bezier) + let closest = { j: 0, i: 0, t: 0 }, + bestDistance = _largeNum, + i, + j, + t, + segment; + for (j = 0; j < rawPath.length; j++) { + segment = rawPath[j]; + for (i = 0; i < segment.length; i += 6) { + t = getClosestProgressOnBezier( + 1, + x, + y, + 0, + 1, + slices || 20, + segment[i], + segment[i + 1], + segment[i + 2], + segment[i + 3], + segment[i + 4], + segment[i + 5], + segment[i + 6], + segment[i + 7] + ); + if (bestDistance > _bestDistance) { + bestDistance = _bestDistance; + closest.j = j; + closest.i = i; + closest.t = t; + } + } + } + return closest; +} + +//subdivide a Segment closest to a specific x,y coordinate +export function subdivideSegmentNear(x, y, segment, slices, iterations) { + let l = segment.length, + bestDistance = _largeNum, + bestT = 0, + bestSegmentIndex = 0, + t, + i; + slices = slices || 20; + iterations = iterations || 3; + for (i = 0; i < l; i += 6) { + t = getClosestProgressOnBezier( + 1, + x, + y, + 0, + 1, + slices, + segment[i], + segment[i + 1], + segment[i + 2], + segment[i + 3], + segment[i + 4], + segment[i + 5], + segment[i + 6], + segment[i + 7] + ); + if (bestDistance > _bestDistance) { + bestDistance = _bestDistance; + bestT = t; + bestSegmentIndex = i; + } + } + t = getClosestProgressOnBezier( + iterations, + x, + y, + bestT - 0.05, + bestT + 0.05, + slices, + segment[bestSegmentIndex], + segment[bestSegmentIndex + 1], + segment[bestSegmentIndex + 2], + segment[bestSegmentIndex + 3], + segment[bestSegmentIndex + 4], + segment[bestSegmentIndex + 5], + segment[bestSegmentIndex + 6], + segment[bestSegmentIndex + 7] + ); + subdivideSegment(segment, bestSegmentIndex, t); + return bestSegmentIndex + 6; +} + +/* +Takes any of the following and converts it to an all Cubic Bezier SVG data string: +- A data string like "M0,0 L2,4 v20,15 H100" +- A RawPath, like [[x, y, x, y, x, y, x, y][[x, y, x, y, x, y, x, y]] +- A Segment, like [x, y, x, y, x, y, x, y] + +Note: all numbers are rounded down to the closest 0.001 to minimize memory, maximize speed, and avoid odd numbers like 1e-13 +*/ +export function rawPathToString(rawPath) { + if (_isNumber(rawPath[0])) { + //in case a segment is passed in instead + rawPath = [rawPath]; + } + let result = '', + l = rawPath.length, + sl, + s, + i, + segment; + for (s = 0; s < l; s++) { + segment = rawPath[s]; + result += 'M' + _round(segment[0]) + ',' + _round(segment[1]) + ' C'; + sl = segment.length; + for (i = 2; i < sl; i++) { + result += + _round(segment[i++]) + + ',' + + _round(segment[i++]) + + ' ' + + _round(segment[i++]) + + ',' + + _round(segment[i++]) + + ' ' + + _round(segment[i++]) + + ',' + + _round(segment[i]) + + ' '; + } + if (segment.closed) { + result += 'z'; + } + } + return result; +} + +/* +// takes a segment with coordinates [x, y, x, y, ...] and converts the control points into angles and lengths [x, y, angle, length, angle, length, x, y, angle, length, ...] so that it animates more cleanly and avoids odd breaks/kinks. For example, if you animate from 1 o'clock to 6 o'clock, it'd just go directly/linearly rather than around. So the length would be very short in the middle of the tween. +export function cpCoordsToAngles(segment, copy) { + var result = copy ? segment.slice(0) : segment, + x, y, i; + for (i = 0; i < segment.length; i+=6) { + x = segment[i+2] - segment[i]; + y = segment[i+3] - segment[i+1]; + result[i+2] = Math.atan2(y, x); + result[i+3] = Math.sqrt(x * x + y * y); + x = segment[i+6] - segment[i+4]; + y = segment[i+7] - segment[i+5]; + result[i+4] = Math.atan2(y, x); + result[i+5] = Math.sqrt(x * x + y * y); + } + return result; +} + +// takes a segment that was converted with cpCoordsToAngles() to have angles and lengths instead of coordinates for the control points, and converts it BACK into coordinates. +export function cpAnglesToCoords(segment, copy) { + var result = copy ? segment.slice(0) : segment, + length = segment.length, + rnd = 1000, + angle, l, i, j; + for (i = 0; i < length; i+=6) { + angle = segment[i+2]; + l = segment[i+3]; //length + result[i+2] = (((segment[i] + Math.cos(angle) * l) * rnd) | 0) / rnd; + result[i+3] = (((segment[i+1] + Math.sin(angle) * l) * rnd) | 0) / rnd; + angle = segment[i+4]; + l = segment[i+5]; //length + result[i+4] = (((segment[i+6] - Math.cos(angle) * l) * rnd) | 0) / rnd; + result[i+5] = (((segment[i+7] - Math.sin(angle) * l) * rnd) | 0) / rnd; + } + return result; +} + +//adds an "isSmooth" array to each segment and populates it with a boolean value indicating whether or not it's smooth (the control points have basically the same slope). For any smooth control points, it converts the coordinates into angle (x, in radians) and length (y) and puts them into the same index value in a smoothData array. +export function populateSmoothData(rawPath) { + let j = rawPath.length, + smooth, segment, x, y, x2, y2, i, l, a, a2, isSmooth, smoothData; + while (--j > -1) { + segment = rawPath[j]; + isSmooth = segment.isSmooth = segment.isSmooth || [0, 0, 0, 0]; + smoothData = segment.smoothData = segment.smoothData || [0, 0, 0, 0]; + isSmooth.length = 4; + l = segment.length - 2; + for (i = 6; i < l; i += 6) { + x = segment[i] - segment[i - 2]; + y = segment[i + 1] - segment[i - 1]; + x2 = segment[i + 2] - segment[i]; + y2 = segment[i + 3] - segment[i + 1]; + a = _atan2(y, x); + a2 = _atan2(y2, x2); + smooth = (Math.abs(a - a2) < 0.09); + if (smooth) { + smoothData[i - 2] = a; + smoothData[i + 2] = a2; + smoothData[i - 1] = _sqrt(x * x + y * y); + smoothData[i + 3] = _sqrt(x2 * x2 + y2 * y2); + } + isSmooth.push(smooth, smooth, 0, 0, smooth, smooth); + } + //if the first and last points are identical, check to see if there's a smooth transition. We must handle this a bit differently due to their positions in the array. + if (segment[l] === segment[0] && segment[l+1] === segment[1]) { + x = segment[0] - segment[l-2]; + y = segment[1] - segment[l-1]; + x2 = segment[2] - segment[0]; + y2 = segment[3] - segment[1]; + a = _atan2(y, x); + a2 = _atan2(y2, x2); + if (Math.abs(a - a2) < 0.09) { + smoothData[l-2] = a; + smoothData[2] = a2; + smoothData[l-1] = _sqrt(x * x + y * y); + smoothData[3] = _sqrt(x2 * x2 + y2 * y2); + isSmooth[l-2] = isSmooth[l-1] = true; //don't change indexes 2 and 3 because we'll trigger everything from the END, and this will optimize file size a bit. + } + } + } + return rawPath; +} +export function pointToScreen(svgElement, point) { + if (arguments.length < 2) { //by default, take the first set of coordinates in the path as the point + let rawPath = getRawPath(svgElement); + point = svgElement.ownerSVGElement.createSVGPoint(); + point.x = rawPath[0][0]; + point.y = rawPath[0][1]; + } + return point.matrixTransform(svgElement.getScreenCTM()); +} + +*/ diff --git a/packages/vstory/src/animate/util/util.ts b/packages/vstory/src/animate/util/util.ts new file mode 100644 index 0000000..69ea75a --- /dev/null +++ b/packages/vstory/src/animate/util/util.ts @@ -0,0 +1,343 @@ +/*! + * CustomEase 3.12.5 + * https://gsap.com + * + * @license Copyright 2008-2024, GreenSock. All rights reserved. + * Subject to the terms at https://gsap.com/standard-license or for + * Club GSAP members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ +/* eslint-disable */ + +import { stringToRawPath, rawPathToString, transformRawPath } from './paths'; + +let gsap: any, + _coreInitted: any, + _getGSAP = () => + gsap || (typeof window !== 'undefined' && (gsap = (window as any).gsap) && gsap.registerPlugin && gsap), + _initCore = () => { + gsap = _getGSAP(); + if (gsap) { + gsap.registerEase('_CE', CustomEase.create); + _coreInitted = 1; + } else { + console.warn('Please gsap.registerPlugin(CustomEase)'); + } + }, + _bigNum = 1e20, + _round = (value: any) => ~~(value * 1000 + (value < 0 ? -0.5 : 0.5)) / 1000, + _bonusValidated = 1, //CustomEase + _numExp = /[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/gi, //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8. + _needsParsingExp = /[cLlsSaAhHvVtTqQ]/g, + _findMinimum = (values: any) => { + let l = values.length, + min = _bigNum, + i; + for (i = 1; i < l; i += 6) { + +values[i] < min && (min = +values[i]); + } + return min; + }, + //takes all the points and translates/scales them so that the x starts at 0 and ends at 1. + _normalize = (values: any, height: any, originY: any) => { + if (!originY && originY !== 0) { + originY = Math.max(+values[values.length - 1], +values[1]); + } + let tx = +values[0] * -1, + ty = -originY, + l = values.length, + sx = 1 / (+values[l - 2] + tx), + sy = + -height || + (Math.abs(+values[l - 1] - +values[1]) < 0.01 * (+values[l - 2] - +values[0]) + ? _findMinimum(values) + ty + : +values[l - 1] + ty), + i; + if (sy) { + //typically y ends at 1 (so that the end values are reached) + sy = 1 / sy; + } else { + //in case the ease returns to its beginning value, scale everything proportionally + sy = -sx; + } + for (i = 0; i < l; i += 2) { + values[i] = (+values[i] + tx) * sx; + values[i + 1] = (+values[i + 1] + ty) * sy; + } + }, + //note that this function returns point objects like {x, y} rather than working with segments which are arrays with alternating x, y values as in the similar function in paths.js + _bezierToPoints = function ( + x1: any, + y1: any, + x2: any, + y2: any, + x3: any, + y3: any, + x4: any, + y4: any, + threshold: any, + points: any, + index: any + ) { + let x12 = (x1 + x2) / 2, + y12 = (y1 + y2) / 2, + x23 = (x2 + x3) / 2, + y23 = (y2 + y3) / 2, + x34 = (x3 + x4) / 2, + y34 = (y3 + y4) / 2, + x123 = (x12 + x23) / 2, + y123 = (y12 + y23) / 2, + x234 = (x23 + x34) / 2, + y234 = (y23 + y34) / 2, + x1234 = (x123 + x234) / 2, + y1234 = (y123 + y234) / 2, + dx = x4 - x1, + dy = y4 - y1, + d2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx), + d3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx), + length; + if (!points) { + points = [ + { x: x1, y: y1 }, + { x: x4, y: y4 } + ]; + index = 1; + } + points.splice(index || points.length - 1, 0, { x: x1234, y: y1234 }); + if ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) { + length = points.length; + _bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index); + _bezierToPoints( + x1234, + y1234, + x234, + y234, + x34, + y34, + x4, + y4, + threshold, + points, + index + 1 + (points.length - length) + ); + } + return points; + }; + +export class CustomEase { + constructor(id: any, data: any, config: any) { + _coreInitted || _initCore(); + (this as any).id = id; + _bonusValidated && this.setData(data, config); + } + + setData(data: any, config: any) { + config = config || {}; + data = data || '0,0,1,1'; + let values = data.match(_numExp), + closest = 1, + points: any = [], + lookup: any = [], + precision = config.precision || 1, + fast: any = precision <= 1, + l: any, + a1, + a2, + i, + inc, + j, + point, + prevPoint: any, + p; + (this as any).data = data; + if (_needsParsingExp.test(data) || (~data.indexOf('M') && data.indexOf('C') < 0)) { + values = stringToRawPath(data)[0]; + } + l = values.length; + if (l === 4) { + values.unshift(0, 0); + values.push(1, 1); + l = 8; + } else if ((l - 2) % 6) { + throw 'Invalid CustomEase'; + } + if (+values[0] !== 0 || +values[l - 2] !== 1) { + _normalize(values, config.height, config.originY); + } + (this as any).segment = values; + for (i = 2; i < l; i += 6) { + a1 = { x: +values[i - 2], y: +values[i - 1] }; + a2 = { x: +values[i + 4], y: +values[i + 5] }; + points.push(a1, a2); + _bezierToPoints( + a1.x, + a1.y, + +values[i], + +values[i + 1], + +values[i + 2], + +values[i + 3], + a2.x, + a2.y, + 1 / (precision * 200000), + points, + points.length - 1 + ); + } + l = points.length; + for (i = 0; i < l; i++) { + point = points[i]; + prevPoint = points[i - 1] || point; + if ( + (point.x > prevPoint.x || (prevPoint.y !== point.y && prevPoint.x === point.x) || point === prevPoint) && + point.x <= 1 + ) { + //if a point goes BACKWARD in time or is a duplicate, just drop it. Also it shouldn't go past 1 on the x axis, as could happen in a string like "M0,0 C0,0 0.12,0.68 0.18,0.788 0.195,0.845 0.308,1 0.32,1 0.403,1.005 0.398,1 0.5,1 0.602,1 0.816,1.005 0.9,1 0.91,1 0.948,0.69 0.962,0.615 1.003,0.376 1,0 1,0". + prevPoint.cx = point.x - prevPoint.x; //change in x between this point and the next point (performance optimization) + prevPoint.cy = point.y - prevPoint.y; + prevPoint.n = point; + prevPoint.nx = point.x; //next point's x value (performance optimization, making lookups faster in getRatio()). Remember, the lookup will always land on a spot where it's either this point or the very next one (never beyond that) + if (fast && i > 1 && Math.abs(prevPoint.cy / prevPoint.cx - points[i - 2].cy / points[i - 2].cx) > 2) { + //if there's a sudden change in direction, prioritize accuracy over speed. Like a bounce ease - you don't want to risk the sampling chunks landing on each side of the bounce anchor and having it clipped off. + fast = 0; + } + if (prevPoint.cx < closest) { + if (!prevPoint.cx) { + prevPoint.cx = 0.001; //avoids math problems in getRatio() (dividing by zero) + if (i === l - 1) { + //in case the final segment goes vertical RIGHT at the end, make sure we end at the end. + prevPoint.x -= 0.001; + closest = Math.min(closest, 0.001); + fast = 0; + } + } else { + closest = prevPoint.cx; + } + } + } else { + points.splice(i--, 1); + l--; + } + } + l = (1 / closest + 1) | 0; + inc = 1 / l; + j = 0; + point = points[0]; + if (fast) { + for (i = 0; i < l; i++) { + //for fastest lookups, we just sample along the path at equal x (time) distance. Uses more memory and is slightly less accurate for anchors that don't land on the sampling points, but for the vast majority of eases it's excellent (and fast). + p = i * inc; + if (point.nx < p) { + point = points[++j]; + } + a1 = point.y + ((p - point.x) / point.cx) * point.cy; + lookup[i] = { x: p, cx: inc, y: a1, cy: 0, nx: 9 }; + if (i) { + lookup[i - 1].cy = a1 - lookup[i - 1].y; + } + } + lookup[l - 1].cy = points[points.length - 1].y - a1; + } else { + //this option is more accurate, ensuring that EVERY anchor is hit perfectly. Clipping across a bounce, for example, would never happen. + for (i = 0; i < l; i++) { + //build a lookup table based on the smallest distance so that we can instantly find the appropriate point (well, it'll either be that point or the very next one). We'll look up based on the linear progress. So it's it's 0.5 and the lookup table has 100 elements, it'd be like lookup[Math.floor(0.5 * 100)] + if (point.nx < i * inc) { + point = points[++j]; + } + lookup[i] = point; + } + + if (j < points.length - 1) { + lookup[i - 1] = points[points.length - 2]; + } + } + //this._calcEnd = (points[points.length-1].y !== 1 || points[0].y !== 0); //ensures that we don't run into floating point errors. As long as we're starting at 0 and ending at 1, tell GSAP to skip the final calculation and use 0/1 as the factor. + + (this as any).ease = (p: any) => { + let point = lookup[(p * l) | 0] || lookup[l - 1]; + if (point.nx < p) { + point = point.n; + } + return point.y + ((p - point.x) / point.cx) * point.cy; + }; + + (this as any).ease.custom = this; + + (this as any).id && gsap && gsap.registerEase((this as any).id, (this as any).ease); + + return this; + } + + getSVGData(config: any) { + return CustomEase.getSVGData(this, config); + } + + static create(id: any, data: any, config: any) { + return (new CustomEase(id, data, config) as any).ease; + } + + static register(core: any) { + gsap = core; + _initCore(); + } + + static get(id: any) { + return gsap.parseEase(id); + } + + static getSVGData(ease: any, config: any) { + config = config || {}; + let width = config.width || 100, + height = config.height || 100, + x = config.x || 0, + y = (config.y || 0) + height, + e = gsap.utils.toArray(config.path)[0], + a, + slope, + i, + inc, + tx, + ty, + precision, + threshold, + prevX, + prevY; + if (config.invert) { + height = -height; + y = 0; + } + if (typeof ease === 'string') { + ease = gsap.parseEase(ease); + } + if (ease.custom) { + ease = ease.custom; + } + if (ease instanceof CustomEase) { + a = rawPathToString(transformRawPath([(ease as any).segment], width, 0, 0, -height, x, y)); + } else { + a = [x, y]; + precision = Math.max(5, (config.precision || 1) * 200); + inc = 1 / precision; + precision += 2; + threshold = 5 / precision; + prevX = _round(x + inc * width); + prevY = _round(y + ease(inc) * -height); + slope = (prevY - y) / (prevX - x); + for (i = 2; i < precision; i++) { + tx = _round(x + i * inc * width); + ty = _round(y + ease(i * inc) * -height); + if (Math.abs((ty - prevY) / (tx - prevX) - slope) > threshold || i === precision - 1) { + //only add points when the slope changes beyond the threshold + a.push(prevX, prevY); + slope = (ty - prevY) / (tx - prevX); + } + prevX = tx; + prevY = ty; + } + a = 'M' + a.join(','); + } + e && e.setAttribute('d', a); + return a; + } +} + +_getGSAP() && gsap.registerPlugin(CustomEase); diff --git a/packages/vstory/src/animate/wipeIn.ts b/packages/vstory/src/animate/wipeIn.ts new file mode 100644 index 0000000..997cf17 --- /dev/null +++ b/packages/vstory/src/animate/wipeIn.ts @@ -0,0 +1,183 @@ +import { ACustomAnimate } from '@visactor/vrender-core'; +import type { EasingType, ILinearGradient } from '@visactor/vrender-core'; + +export enum Direction { + LEFT_TO_RIGHT = 0, + RIGHT_TO_LEFT = 1, + TOP_TO_BOTTOM = 2, + BOTTOM_TO_TOP = 3, + STROKE = 4 +} + +export class Wipe extends ACustomAnimate { + declare direction: number; + declare toFill: string; + declare toStroke: string; + declare fillGradient: ILinearGradient; + declare strokeGradient: ILinearGradient; + declare fill: boolean; + declare stroke: boolean; + constructor( + from: any, + to: any, + duration: number, + easing: EasingType, + params?: { direction?: number; fill?: boolean; stroke?: boolean } + ) { + super(from, to, duration, easing, params); + const { direction = Direction.LEFT_TO_RIGHT, fill = true, stroke = true } = params || {}; + this.direction = direction; + this.fill = fill; + this.stroke = stroke; + this.fillGradient = { + gradient: 'linear', + stops: [] + }; + this.strokeGradient = { + gradient: 'linear', + stops: [] + }; + } + + getEndProps(): Record { + return { + fill: this.toFill, + stroke: this.toStroke + }; + } + + onBind(): void { + this.toFill = this.target.getComputedAttribute('fill'); + this.toStroke = this.target.getComputedAttribute('stroke'); + } + + onEnd(): void { + return; + } + + onUpdate(end: boolean, ratio: number, out: Record): void { + if (!this.toFill) { + return; + } + if (!this.toStroke) { + return; + } + switch (this.direction) { + case Direction.RIGHT_TO_LEFT: + this.rightToLeft(end, ratio, out); + break; + case Direction.TOP_TO_BOTTOM: + this.topToBottom(end, ratio, out); + break; + case Direction.BOTTOM_TO_TOP: + this.bottomToTop(end, ratio, out); + break; + case Direction.STROKE: + this.strokePath(end, ratio, out); + break; + default: + this.leftToRight(end, ratio, out); + break; + } + + if (end) { + out.fill = this.toFill; + out.stroke = this.toStroke; + } else { + if (this.fill) { + const toFillColor = this.toFill; + this.fillGradient.stops = [ + { offset: 0, color: toFillColor }, + { offset: ratio, color: toFillColor }, + { offset: Math.min(1, ratio * 2), color: 'white' } + ]; + out.fill = this.fillGradient; + } + + if (this.stroke) { + const toStrokeColor = this.toStroke; + this.strokeGradient.stops = [ + { offset: 0, color: toStrokeColor }, + { offset: ratio, color: toStrokeColor }, + { offset: Math.min(1, ratio * 2), color: 'white' } + ]; + out.stroke = this.strokeGradient; + } + } + } + + leftToRight(end: boolean, ratio: number, out: Record) { + if (this.fill) { + this.fillGradient.x0 = 0; + this.fillGradient.y0 = 0; + this.fillGradient.x1 = 1; + this.fillGradient.y1 = 0; + } + if (this.stroke) { + this.strokeGradient.x0 = 0; + this.strokeGradient.y0 = 0; + this.strokeGradient.x1 = 1; + this.strokeGradient.y1 = 0; + } + } + + strokePath(end: boolean, ratio: number, out: Record) { + if (this.fill) { + this.fillGradient.x0 = 0; + this.fillGradient.y0 = 0; + this.fillGradient.x1 = 1; + this.fillGradient.y1 = 0; + } + if (this.stroke) { + const dashLen = 300; + const offset = ratio * dashLen; + out.lineDash = [offset, dashLen - offset]; + } + return; + } + + rightToLeft(end: boolean, ratio: number, out: Record) { + if (this.fill) { + this.fillGradient.x0 = 1; + this.fillGradient.y0 = 0; + this.fillGradient.x1 = 0; + this.fillGradient.y1 = 0; + } + if (this.stroke) { + this.strokeGradient.x0 = 1; + this.strokeGradient.y0 = 0; + this.strokeGradient.x1 = 0; + this.strokeGradient.y1 = 0; + } + } + + topToBottom(end: boolean, ratio: number, out: Record) { + if (this.fill) { + this.fillGradient.x0 = 0; + this.fillGradient.y0 = 0; + this.fillGradient.x1 = 0; + this.fillGradient.y1 = 1; + } + if (this.stroke) { + this.strokeGradient.x0 = 0; + this.strokeGradient.y0 = 0; + this.strokeGradient.x1 = 0; + this.strokeGradient.y1 = 1; + } + } + + bottomToTop(end: boolean, ratio: number, out: Record) { + if (this.fill) { + this.fillGradient.x0 = 0; + this.fillGradient.y0 = 1; + this.fillGradient.x1 = 0; + this.fillGradient.y1 = 0; + } + if (this.stroke) { + this.strokeGradient.x0 = 0; + this.strokeGradient.y0 = 1; + this.strokeGradient.x1 = 0; + this.strokeGradient.y1 = 0; + } + } +} diff --git a/packages/vstory/src/component/title.ts b/packages/vstory/src/component/title.ts new file mode 100644 index 0000000..78aa425 --- /dev/null +++ b/packages/vstory/src/component/title.ts @@ -0,0 +1,76 @@ +import { IAnimate as IVRenderAnimate, InputText } from '@visactor/vrender-core'; +import { GraphicAnimate } from '../animate/animate'; +import { Title } from '@visactor/vrender-components'; +import { IContext } from '../interface/type'; +import { Action } from '../scene/action'; +import { TaskCb } from '../task'; + +export function textWriter(title: Title, duration: number) { + const _textWriter = new TextWriter(title, duration); + return new Action(_textWriter, (_textWriter, context) => { + if (context && context.stage) { + context.stage.defaultLayer.add(_textWriter.getEntity()); + _textWriter.run(); + } + }); +} + +export class TextWriter extends GraphicAnimate { + protected _title: Title; + getEntity() { + return this._title; + } + protected _duration: number; + + protected _mainAnimate: IVRenderAnimate; + protected _subAnimate: IVRenderAnimate; + + constructor(title: Title, duration: number) { + super(null); + this._title = title; + this._duration = duration; + } + + run(context: Partial): void { + if (this._title && this._duration > 0) { + // @ts-ignore + const { _subtitle: subtitle, _mainTitle: mainTitle } = this._title; + if (mainTitle) { + this._mainAnimate = mainTitle.animate().play( + new InputText( + { text: '' }, + { + text: mainTitle.attribute.text[0] + }, + this._duration, + 'linear' + ) + ); + } + if (subtitle) { + this._subAnimate = subtitle.animate().play( + new InputText( + { text: '' }, + { + text: subtitle.attribute.text + }, + this._duration, + 'linear' + ) + ); + } + } + } + + runCb(cb: TaskCb): void { + if (this._mainAnimate) { + this._mainAnimate.runCb(cb); + } + + if (this._subAnimate) { + this._subAnimate.runCb(cb); + } + } +} + +export { Title } from '@visactor/vrender-components'; diff --git a/packages/vstory/src/dsl/constant/index.ts b/packages/vstory/src/dsl/constant/index.ts new file mode 100644 index 0000000..0609aa1 --- /dev/null +++ b/packages/vstory/src/dsl/constant/index.ts @@ -0,0 +1,31 @@ +export const enum StoryChartType { + BAR = 'BarChart', + LINE = 'LineChart', + AREA = 'AreaChart', + HISTOGRAM = 'HistogramChart', + PIE = 'PieChart', + ROSE = 'RoseChart', + RADAR = 'RadarChart', + RANGE_COLUMN = 'RangeColumnChart', + SCATTER = 'ScatterChart', + WORD_CLOUD = 'WordCloudChart', + TREE_MAP = 'TreeMapChart', + SUNBURST = 'SunburstChart' +} +export enum StoryGraphicType { + RECT = 'RectComponent', + // Shape = 'SymbolComponent', + LINE = 'LineComponent', + ARC = 'ArcComponent', + // AREA = 'AreaComponent', + PATH = 'PathComponent', + TEXT = 'TextComponent', + RICH_TEXT = 'RichTextComponent', + QIPAO = 'QipaoComponent', + IMAGE = 'ImageComponent' +} + +export const enum StoryChartComponentType { + MARK_POINT = 'markPoint', + TITLE = 'title' +} diff --git a/packages/vstory/src/dsl/story-chart/area.ts b/packages/vstory/src/dsl/story-chart/area.ts new file mode 100644 index 0000000..5169301 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/area.ts @@ -0,0 +1,6 @@ +import { StoryChartType } from '../constant'; +import { StoryChart } from './chart'; + +export class StoryArea extends StoryChart { + public storyChartType = StoryChartType.AREA; +} diff --git a/packages/vstory/src/dsl/story-chart/bar.ts b/packages/vstory/src/dsl/story-chart/bar.ts new file mode 100644 index 0000000..0172fbb --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/bar.ts @@ -0,0 +1,39 @@ +import { merge } from '@visactor/vutils'; +import { StoryChartType } from '../constant'; +import { StoryChart } from './chart'; +import { Datum } from '../types/Datum'; +import { IChartSpec, IInitOption } from '@visactor/vchart'; +import { IChartStyleAction, IChartStylePayload } from '../types/chart/style'; +import { IChartAppearAction, IChartAppearPayLoad } from '../types/chart/appear'; + +export class StoryBar extends StoryChart { + public storyChartType = StoryChartType.BAR; + + constructor(spec: IChartSpec, option: IInitOption) { + super(spec, option); + } + + barStyle(data: Datum, payload: IChartStylePayload) { + const styleNode: IChartStyleAction = merge( + { action: 'barStyle', elementType: this.storyChartType, elementId: this.uid }, + { payload } + ); + this.snapshot(styleNode); + } + + dance(data: Datum, payload: any) { + const action: IChartStyleAction = merge( + { action: 'dance', elementType: this.storyChartType, elementId: this.uid }, + { payload: { data, ...payload } } + ); + this.snapshot(action); + } + + appear(payload: IChartAppearPayLoad) { + const action: IChartAppearAction = merge( + { action: 'appear', elementType: this.storyChartType, elementId: this.uid }, + { payload } + ); + this.snapshot(action); + } +} diff --git a/packages/vstory/src/dsl/story-chart/chart.ts b/packages/vstory/src/dsl/story-chart/chart.ts new file mode 100644 index 0000000..cd81d66 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/chart.ts @@ -0,0 +1,96 @@ +import type { Datum } from '../types/Datum'; +import type { StoryComponent } from './component/base'; +import { IInitOption, ISpec, IVChart, VChart } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { defaultAdd } from './default/add'; +import { StoryElement } from './element'; +import { MarkPoint } from './component/markPoint'; +import { CreateMarkPointAction } from '../types/chart/createComponent'; +import { ChartAction, ChartActionNode } from '../types'; +import { getComponentById } from '../../util/vchart-api'; +import { StoryChartType } from '../constant'; +import { IChartAddAction, IChartAddPayload } from '../types/chart/add'; + +/** + * 1. 禁用一些图表默认的基础操作。如 tooltip/crosshair + */ +export abstract class StoryChart extends StoryElement { + public declare storyChartType: StoryChartType; + private snapshots: ChartAction[]; + private instance: IVChart; + + private components: Map; + getComponent(id: number) { + return this.components.get(id); + } + + constructor(spec?: ISpec, option?: IInitOption) { + super(); + this.snapshots = []; + this.components = new Map(); + if (spec && option) { + this.instance = new VChart(spec, option); + } + } + + public getInstance() { + return this.instance; + } + + public setInstance(instance: IVChart) { + this.instance = instance; + return this; + } + + public snapshot(node: ChartActionNode) { + this.snapshots.push(node); + } + + public exportSnapshot() { + return this.snapshots; + } + + public add(payload: Partial) { + const editNode: IChartAddAction = merge( + { action: 'add', payload: defaultAdd }, + { payload }, + { elementType: this.storyChartType, elementId: this.uid } + ); + this.snapshot(editNode); + } + + public updateStyle() { + // TODO: + // const editNode: AddAction = merge( + // { + // action: 'updateStyle', + // data + // }, + // defaultUpdateStyle, + // { payload: option, elementType: this.storyChartType, elementId: this.uid } + // ); + // this.snapshot(editNode); + } + + public createMarkPoint(data: Datum, option?: Partial) { + const markPoint = new MarkPoint(this.snapshot.bind(this)); + const componentNode: CreateMarkPointAction = merge( + { action: 'createMarkPoint', data }, + { payload: option, elementId: markPoint.uid, elementType: this.storyChartType } + ); + + componentNode.callback = (chartInstance: VChart) => { + const vchartMarkPoint = getComponentById(chartInstance, markPoint.uid); + if (vchartMarkPoint) { + markPoint.setComponentInstance(vchartMarkPoint as any); + } + }; + this.createComponent(markPoint); + this.snapshot(componentNode as any); + return markPoint; + } + + protected createComponent(component: StoryComponent) { + this.components.set(component.uid, component); + } +} diff --git a/packages/vstory/src/dsl/story-chart/component/base.ts b/packages/vstory/src/dsl/story-chart/component/base.ts new file mode 100644 index 0000000..9571eaf --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/component/base.ts @@ -0,0 +1,25 @@ +import { merge } from '@visactor/vutils'; +import { StoryElement } from '../element'; +import { StoryChartComponentType } from '../../constant'; +import type { Action, IFlickerAction, IFlickerPayload } from '../../types'; + +export abstract class StoryComponent extends StoryElement { + protected snapshot: (node: Action) => void; + + protected declare type: StoryChartComponentType; + + constructor(snapshot: (node: Action) => void) { + super(); + this.snapshot = snapshot; + } + + public flicker(option: IFlickerPayload) { + const actionNode: IFlickerAction = merge(option, { + action: 'flicker', + elementId: this.uid, + elementType: this.type + }); + this.snapshot(actionNode); + return this; + } +} diff --git a/packages/vstory/src/dsl/story-chart/component/markPoint.ts b/packages/vstory/src/dsl/story-chart/component/markPoint.ts new file mode 100644 index 0000000..11bbc09 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/component/markPoint.ts @@ -0,0 +1,19 @@ +import { StoryComponent } from './base'; +import { StoryChartComponentType } from '../../constant'; +import type { IGroup } from '@visactor/vrender-core'; +import type { MarkPoint as VChartMarkPoint } from '@visactor/vchart'; + +export class MarkPoint extends StoryComponent { + protected type = StoryChartComponentType.MARK_POINT; + + private _componentInstance: VChartMarkPoint; + setComponentInstance(_componentInstance: VChartMarkPoint) { + this._componentInstance = _componentInstance; + } + public getGroupGraphic(): IGroup { + // @ts-ignore + return this._componentInstance?._markerComponent?._item; + } + + public coordinate() {} +} diff --git a/packages/vstory/src/dsl/story-chart/component/title.ts b/packages/vstory/src/dsl/story-chart/component/title.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/vstory/src/dsl/story-chart/default/add.ts b/packages/vstory/src/dsl/story-chart/default/add.ts new file mode 100644 index 0000000..168a2c7 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/default/add.ts @@ -0,0 +1,11 @@ +import type { IChartAddPayload } from '../../types/chart/add'; + +export const defaultAdd: { payload: Partial } = { + payload: { + style: {}, + animation: { + duration: 500, + easing: 'linear' + } + } +}; diff --git a/packages/vstory/src/dsl/story-chart/default/updateStyle.ts b/packages/vstory/src/dsl/story-chart/default/updateStyle.ts new file mode 100644 index 0000000..ce9bd07 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/default/updateStyle.ts @@ -0,0 +1,8 @@ +import type { IChartStylePayload } from '../../types/chart/style'; + +export const defaultUpdateStyle: Partial = { + animation: { + duration: 500, + easing: 'linear' + } +}; diff --git a/packages/vstory/src/dsl/story-chart/element.ts b/packages/vstory/src/dsl/story-chart/element.ts new file mode 100644 index 0000000..0c21989 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/element.ts @@ -0,0 +1,5 @@ +import { CreateUID } from '../../util/common'; + +export abstract class StoryElement { + public uid: number = CreateUID(); +} diff --git a/packages/vstory/src/dsl/story-chart/index.ts b/packages/vstory/src/dsl/story-chart/index.ts new file mode 100644 index 0000000..be6a512 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/index.ts @@ -0,0 +1,8 @@ +import { StoryBar } from './bar'; +import { StoryPie } from './pie'; + +import { StoryArea } from './area'; +import { StoryLine } from './line'; + +export { StoryBar, StoryArea, StoryPie, StoryLine }; +export type StoryChart = StoryBar | StoryArea | StoryPie | StoryLine; diff --git a/packages/vstory/src/dsl/story-chart/line.ts b/packages/vstory/src/dsl/story-chart/line.ts new file mode 100644 index 0000000..2baea92 --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/line.ts @@ -0,0 +1,30 @@ +import { merge } from '@visactor/vutils'; +import { StoryChartType } from '../constant'; +import { Datum } from '../types/Datum'; +import { StoryChart } from './chart'; +import { IChartStylePayload } from '../types/chart/style'; +import { ChartActionNode } from '../types'; + +export class StoryLine extends StoryChart { + public storyChartType = StoryChartType.LINE; + + constructor() { + super(); + } + + lineStyle(data: Datum, payload: IChartStylePayload) { + const styleNode: ChartActionNode = merge( + { action: 'lineStyle' }, + { elementType: this.storyChartType, elementId: this.uid, data, payload } + ); + this.snapshot(styleNode); + } + + symbolStyle(data: Datum, payload: IChartStylePayload) { + const styleNode: ChartActionNode = merge( + { action: 'symbolStyle' }, + { elementType: this.storyChartType, elementId: this.uid, data, payload } + ); + this.snapshot(styleNode); + } +} diff --git a/packages/vstory/src/dsl/story-chart/pie.ts b/packages/vstory/src/dsl/story-chart/pie.ts new file mode 100644 index 0000000..478bdcc --- /dev/null +++ b/packages/vstory/src/dsl/story-chart/pie.ts @@ -0,0 +1,18 @@ +import { merge } from '@visactor/vutils'; +import { StoryChartType } from '../constant'; +import { StoryChart } from './chart'; +import { Datum } from '../types/Datum'; +import { IChartStylePayload } from '../types/chart/style'; +import { ChartActionNode } from '../types'; + +export class StoryPie extends StoryChart { + public storyChartType = StoryChartType.PIE; + + arcStyle(data: Datum, payload: IChartStylePayload) { + const styleNode: ChartActionNode = merge( + { action: 'arcStyle' }, + { elementType: this.storyChartType, elementId: this.uid, data, payload } + ); + this.snapshot(styleNode); + } +} diff --git a/packages/vstory/src/dsl/story-executor/index.ts b/packages/vstory/src/dsl/story-executor/index.ts new file mode 100644 index 0000000..3b99505 --- /dev/null +++ b/packages/vstory/src/dsl/story-executor/index.ts @@ -0,0 +1,52 @@ +import { IVChart, IChartSpec } from '@visactor/vchart'; +import { StoryChart } from '../story-chart'; +import { processorMap } from '../story-processor'; +import { ActionNode } from '../types'; + +export interface StoryPlayerOption { + chartInstance: IVChart; + spec: IChartSpec; +} + +export class StoryExecutor { + private storyChart: StoryChart; + protected processor: Record = {}; + + private option: StoryPlayerOption; + private snapshots: ActionNode[] = []; + + constructor(storyChart: StoryChart, option: StoryPlayerOption) { + this.storyChart = storyChart; + this.processor = processorMap[storyChart.storyChartType]; + this.option = option; + this.snapshots = this.storyChart.exportSnapshot(); + } + + play = async () => { + console.log(this.snapshots); + for (let i = 0; i < this.snapshots.length; i++) { + // TODO: 上个动作执行完后, 执行下一个. + // eslint-disable-next-line promise/param-names + await new Promise(res => { + setTimeout(res, 500); + }); + + const snapshot = this.snapshots[i]; + const { action, elementId, elementType, callback } = snapshot; + + let processor; + if (elementId === this.storyChart.uid) { + processor = this.processor[action]; + } else { + processor = processorMap[elementType][action]; + } + + if (processor) { + await processor(this.option.chartInstance, this.option.spec, snapshot); + if (callback) { + callback(this.option.chartInstance, this.option.spec, snapshot as any); + } + } + } + }; +} diff --git a/packages/vstory/src/dsl/story-processor/ README.md b/packages/vstory/src/dsl/story-processor/ README.md new file mode 100644 index 0000000..e44bdda --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/ README.md @@ -0,0 +1,3 @@ +# 处理叙事动作 + +通过图表实例、配置项, 将叙事动作, 转换成底层图表库可以理解的格式, 这个期间可能会生成 Spec, 并调用各种 API. diff --git a/packages/vstory/src/dsl/story-processor/graphic/appear.ts b/packages/vstory/src/dsl/story-processor/graphic/appear.ts new file mode 100644 index 0000000..be3606c --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/appear.ts @@ -0,0 +1,24 @@ +import type { ICharacter } from '../../../story/character'; +import type { IText } from '@visactor/vrender-core'; +import type { IGraphicAppearAction } from '../../types/graphic/appear'; +import { appearEffectMap } from './effect/appear'; +import { getCharacterByEffect } from './util'; + +export const graphicAppearProcessor = async (character: ICharacter, spec = {}, action: IGraphicAppearAction) => { + const { animation } = action.payload ?? {}; + const { effect } = animation ?? {}; + + const effects = effect && appearEffectMap[effect] ? [effect] : Object.keys(appearEffectMap); + + effects.forEach(effect => { + if (animation.effect === effect || animation[effect]) { + // 获取执行方法 + const appearEffect = appearEffectMap[effect]; + // 获取相关图形 + const graphics = getCharacterByEffect(character, effect); + // 执行appearEffect + graphics.forEach(graphic => appearEffect(graphic, animation)); + } + return false; + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/brighten.ts b/packages/vstory/src/dsl/story-processor/graphic/brighten.ts new file mode 100644 index 0000000..ea942ab --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/brighten.ts @@ -0,0 +1,12 @@ +import type { ICharacter } from '../../../story/character'; +import type { IBrightenAction } from '../../types/common/brighten'; +import { brighten } from './effect/Shade'; +import { getCharacterGraphic } from './util'; + +export const brightenProcessor = async (character: ICharacter, spec = {}, brightenAction: IBrightenAction) => { + const { animation } = brightenAction.payload ?? {}; + const graphics = getCharacterGraphic(character); + graphics.forEach(graphic => { + brighten(graphic, animation); + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/darken.ts b/packages/vstory/src/dsl/story-processor/graphic/darken.ts new file mode 100644 index 0000000..b99ec50 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/darken.ts @@ -0,0 +1,12 @@ +import { ICharacter } from '../../../story/character'; +import { IDarkenAction } from '../../types/common/darken'; +import { darken } from './effect/shade'; +import { getCharacterGraphic } from './util'; + +export const darkenProcessor = async (character: ICharacter, spec = {}, darkenAction: IDarkenAction) => { + const { animation } = darkenAction.payload ?? {}; + const graphics = getCharacterGraphic(character); + graphics.forEach(graphic => { + darken(graphic, animation); + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/disappear.ts b/packages/vstory/src/dsl/story-processor/graphic/disappear.ts new file mode 100644 index 0000000..2878050 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/disappear.ts @@ -0,0 +1,26 @@ +import type { ICharacter } from '../../../story/character'; +import type { IGraphicDisappearAction } from '../../types/graphic/disappear'; +import { getCharacterByEffect } from './util'; +import { disappearEffectMap } from './effect/disappear'; + +export const graphicDisappearProcessor = async ( + character: ICharacter, + spec = {}, + IGraphicAppearAction: IGraphicDisappearAction +) => { + const { animation } = IGraphicAppearAction.payload ?? {}; + const { effect } = animation ?? {}; + + const effects = effect && disappearEffectMap[effect] ? [effect] : Object.keys(disappearEffectMap); + + effects.forEach(effect => { + if (animation.effect === effect || animation[effect]) { + // 获取执行方法 + const disappearEffect = disappearEffectMap[effect]; + // 获取相关图形 + const graphics = getCharacterByEffect(character, effect); + // 执行disappearEffect + graphics.forEach(graphic => disappearEffect(graphic, animation)); + } + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/appear.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/appear.ts new file mode 100644 index 0000000..e9190c1 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/appear.ts @@ -0,0 +1,204 @@ +import type { EasingType, IGraphic } from '@visactor/vrender-core'; +import type { IAnimationParams } from '../../../types'; +import { isObject, isString } from '@visactor/vutils'; +import { Wipe } from '../../../../animate/wipeIn'; +import { typewriter } from '../effect/typewriter'; +import { canDoGraphicAnimation } from '../util'; + +export interface IMoveInParams extends IAnimationParams { + from?: 'left' | 'right' | 'top' | 'bottom'; + move?: { + /** + * @default left + */ + from?: 'left' | 'right' | 'top' | 'bottom'; + /** + * @default true + * @description 若为true: 多个图形的move距离不同, duration相同, 使多个图形同时抵达目标位置; 若为false: 多个图形move的距离相同, duration相同, 即可使多个图形达到相同的速度, 以保持图形的相对位置不变. + */ + isVariableSpeed?: boolean; + duration?: number; + easing?: string; + }; +} + +export interface IWipeInParams extends IAnimationParams { + from?: 'left' | 'right' | 'top' | 'bottom' | 'stroke'; + wipe?: { + /** + * @default left + */ + from?: 'left' | 'right' | 'top' | 'bottom' | 'stroke'; + duration?: number; + easing?: string; + }; +} + +export interface IScaleInParams extends IAnimationParams { + ratio?: number; + scale?: { + /** + * @default 1 + */ + ratio?: number; + duration?: number; + easing?: string; + }; +} + +export interface IFadeInParams extends IAnimationParams { + opacity?: number; + fade?: { + /** + * @default 1 + */ + opacity?: number; + duration?: number; + easing?: string; + /** + * 作用于全局的透明度 + * @default false + */ + isBaseOpacity?: string; + }; +} + +export function fadeIn(graphic: IGraphic, params: IFadeInParams): boolean { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + const { fade = {} } = params; + const opacity = fade.opacity ?? params.opacity ?? 1; + const duration = fade.duration ?? params.duration; + const easing = fade.easing ?? params.easing; + const isBaseOpacity = fade.isBaseOpacity ?? false; + const opacityKey = isBaseOpacity ? 'baseOpacity' : 'opacity'; + graphic.setAttributes({ + [opacityKey]: 0 + }); + + graphic.animate().to({ [opacityKey]: opacity }, duration, easing as EasingType); + + return true; +} + +export function scaleIn(graphic: IGraphic, params: IScaleInParams): boolean { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + const { scale = {} } = params; + const ratio = scale.ratio ?? params.ratio ?? 1; + const duration = scale.duration ?? params.duration; + const easing = scale.easing ?? params.easing; + + graphic.setAttributes({ + scaleX: 0, + scaleY: 0 + }); + graphic.animate().to({ scaleX: ratio, scaleY: ratio }, duration, easing as EasingType); + + return true; +} + +export function moveIn(graphic: IGraphic, params: IMoveInParams) { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + + const { move = {} } = params; + const from = move.from ?? params.from ?? 1; + const duration = move.duration ?? params.duration; + const easing = move.easing ?? params.easing; + const isVariableSpeed = move.isVariableSpeed ?? true; + + // 图形宽高 + const width = Math.abs(graphic.AABBBounds.x2 - graphic.AABBBounds.x1); + const height = Math.abs(graphic.AABBBounds.y2 - graphic.AABBBounds.y1); + + let fromX = graphic.attribute.x; + let fromY = graphic.attribute.y; + if (isVariableSpeed) { + // 同时从边缘进入, 速度不同, 同时抵达目标. + switch (from) { + case 'right': + // 图形左边缘为起点 + fromX = graphic.parent.width; + break; + case 'left': + // 图形右边缘为起点 + fromX = -width; + break; + case 'bottom': + // 从下往上进入 + fromY = graphic.parent.height + height; + break; + case 'top': + // 从上往下进入 + fromY = -height; + break; + } + } else { + // 速度相同, 相对位置不变, 但不同时出现. + const distance = Math.max(graphic.parent.width, graphic.parent.height); + switch (from) { + case 'right': + // 从右往左进入 + fromX += distance; + break; + case 'left': + // 从左往右进入 + fromX += -distance; + break; + case 'bottom': + // 从下往上进入 + fromY += distance; + break; + case 'top': + // 从上往下进入 + fromY += -distance; + break; + } + } + + graphic.animate().from({ x: fromX, y: fromY }, duration, easing as EasingType); + return true; +} + +export function wipeIn(graphic: IGraphic, params: IWipeInParams) { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + + const { wipe = {} } = params; + const from = wipe.from ?? params.from ?? 1; + const duration = wipe.duration ?? params.duration; + const easing = wipe.easing ?? params.easing; + + const { fill } = graphic.attribute; + if (isString(fill)) { + graphic.animate().play( + new Wipe({}, {}, duration, easing as EasingType, { + direction: Direction[from] + }) + ); + } else if (isObject(fill)) { + // 渐变色支持 + } + return true; +} + +export const appearEffectMap = { + fade: fadeIn, + scale: scaleIn, + move: moveIn, + wipe: wipeIn, + typewriter +}; + +const Direction = { + left: 0, + right: 1, + top: 2, + bottom: 3, + stroke: 4 +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/bounce.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/bounce.ts new file mode 100644 index 0000000..0208439 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/bounce.ts @@ -0,0 +1,21 @@ +import type { EasingType, IGraphic } from '@visactor/vrender-core'; +import type { IBounceParams } from '../../../types/common/bounce'; +import { CustomEase } from './../../../../animate/util/util'; +import { Bounce } from '../../../../animate/bounce'; + +export function bounce(graphic: IGraphic, params: IBounceParams) { + if (graphic) { + const { dy } = params; + let { customEase } = params; + const { y1, y2 } = graphic.AABBBounds; + const height = Math.abs(y1 - y2); + if (!customEase) { + customEase = CustomEase.create( + 'bounce', + 'M0,0 C0,0 0.058,1 0.2,1 0.346,1 0.41,0 0.53,0 0.559,0 0.681,-0.002 0.702,0.011 0.788,0.065 0.774,0.212 0.853,0.212 0.928,0.212 1,0 1,0 ', + {} + ); + } + graphic.animate().play(new Bounce({}, {}, 3000, 'linear' as EasingType, { dy: dy ?? height * 0.2, customEase })); + } +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/disappear.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/disappear.ts new file mode 100644 index 0000000..fee22b4 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/disappear.ts @@ -0,0 +1,170 @@ +import type { EasingType, IGraphic } from '@visactor/vrender-core'; +import type { IAnimationParams } from '../../../types'; +import type { IGraphicDisappearPayLoad } from '../../../types/graphic/disappear'; +import { isObject, isString } from '@visactor/vutils'; +import { Wipe } from '../../../../animate/wipeIn'; +import { canDoGraphicAnimation } from '../util'; + +export interface IFadeOutParams extends IAnimationParams { + opacity?: 'left' | 'right' | 'top' | 'bottom'; + fade?: { + /** + * @default 0 + */ + opacity?: number; + duration?: number; + easing?: string; + /** + * 作用于全局的透明度 + * @default false + */ + isBaseOpacity?: string; + }; +} + +export interface IScaleOutParams extends IAnimationParams { + ratio?: number; + scale?: { + /** + * @default 0 + */ + ratio?: number; + duration?: number; + easing?: string; + }; +} + +export interface IMoveOutParams extends IAnimationParams { + to?: 'left' | 'right' | 'top' | 'bottom'; + move?: { + /** + * @default left + */ + to?: 'left' | 'right' | 'top' | 'bottom'; + + /** + * @default true + * @description 若为true: 多个图形的move距离不同, duration相同, 即可使的多个图形同时离开画布; 若为false: 多个图形move的距离相同, duration相同, 即可使多个图形达到相同的速度, 以保持图形的相对位置不变. + */ + isVariableSpeed?: boolean; + duration?: number; + easing?: string; + }; +} + +export function fadeOut(graphic: IGraphic, params: IFadeOutParams) { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + + const { fade = {} } = params; + const opacity = fade.opacity ?? params.opacity ?? 0; + const duration = fade.duration ?? params.duration; + const easing = fade.easing ?? params.easing; + const isBaseOpacity = fade.isBaseOpacity ?? false; + const opacityKey = isBaseOpacity ? 'baseOpacity' : 'opacity'; + + graphic.animate().to({ [opacityKey]: opacity }, duration, easing as EasingType); + return true; +} + +export function scaleOut(graphic: IGraphic, params: IScaleOutParams) { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + const { scale = {} } = params; + const ratio = scale.ratio ?? params.ratio ?? 0; + const duration = scale.duration ?? params.duration; + const easing = scale.easing ?? params.easing; + + graphic.animate().to({ scaleX: ratio, scaleY: ratio }, duration, easing as EasingType); + return true; +} + +export function moveOut(graphic: IGraphic, params: IMoveOutParams) { + if (!canDoGraphicAnimation(graphic, params)) { + return false; + } + const { move = {} } = params; + const to = move.to ?? params.to ?? 1; + const duration = move.duration ?? params.duration; + const easing = move.easing ?? params.easing; + const isVariableSpeed = move.isVariableSpeed ?? true; + + // 图形宽高 + const width = Math.abs(graphic.AABBBounds.x2 - graphic.AABBBounds.x1); + const height = Math.abs(graphic.AABBBounds.y2 - graphic.AABBBounds.y1); + + let toX = graphic.attribute.x; + let toY = graphic.attribute.y; + if (isVariableSpeed) { + // 同时抵达边缘, 速度不同. + switch (to) { + case 'right': + // 画布容器宽度 + toX = graphic.parent.width; + break; + case 'left': + // 负的图形宽度 + toX = -width; + break; + case 'bottom': + // 容器高度 + 图形高度 + toY = graphic.parent.height + height; + break; + case 'top': + // 负的图形高度 + toY = -height; + break; + } + } else { + // 速度相同, 相对位置不变. + const distance = Math.max(graphic.parent.width, graphic.parent.height); + switch (to) { + case 'right': + toX += distance; + break; + case 'left': + toX += -distance; + break; + case 'bottom': + toY += distance; + break; + case 'top': + toY += -distance; + break; + } + } + + console.log('debug moveOut', toX, toY); + graphic.animate().to({ x: toX, y: toY }, duration, easing as EasingType); + return true; +} + +export const disappearEffectMap = { + fade: fadeOut, + scale: scaleOut, + move: moveOut +}; + +export function commonDisappearEffect( + graphic: IGraphic, + effect: string, + params: IGraphicDisappearPayLoad['animation'] +) { + let doAnimation = true; + switch (effect) { + case 'shrink': + scaleOut(graphic, params); + break; + case 'fade': + fadeOut(graphic, params); + break; + case 'move': + moveOut(graphic, params as unknown as IMoveOutParams); + break; + default: + doAnimation = false; + } + return doAnimation; +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/flicker.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/flicker.ts new file mode 100644 index 0000000..4ef3d7f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/flicker.ts @@ -0,0 +1,13 @@ +import { EasingType, IGraphic } from '@visactor/vrender-core'; +import { IFlickerParams } from '../../../types'; + +export function flicker(graphic: IGraphic, params: IFlickerParams) { + if (graphic) { + const { duration, easing, frequency = 2 } = params; + const loopDuration = duration / frequency; + graphic + .animate() + .from({ opacity: 0 }, loopDuration, easing as EasingType) + .loop(frequency); + } +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/moveTo.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/moveTo.ts new file mode 100644 index 0000000..866ef7a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/moveTo.ts @@ -0,0 +1,15 @@ +import { EasingType, IGraphic } from '@visactor/vrender-core'; +import { IAnimationParams } from '../../../types'; + +export interface IMoveToParams extends IAnimationParams { + destination: { x: number; y: number }; +} + +export function moveTo(graphic: IGraphic, params: IMoveToParams) { + if (graphic) { + const { duration, easing, destination } = params; + if (destination) { + graphic.animate().to(destination, duration, easing as EasingType); + } + } +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/shade.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/shade.ts new file mode 100644 index 0000000..27e4533 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/shade.ts @@ -0,0 +1,42 @@ +import type { EasingType, IGraphic } from '@visactor/vrender-core'; +import type { IDarkenParams } from '../../../types/common/Darken'; +import type { IBrightenParams } from '../../../types/common/Brighten'; + +import { Color, isString, rgbToHsl } from '@visactor/vutils'; + +function getBrighterColor(color: string, ratio: number) { + if (ratio === 1) { + return color; + } + + const colorInstance = new Color(color); + + const { h, s, l } = rgbToHsl(colorInstance.color.r, colorInstance.color.g, colorInstance.color.b); + const _l = Math.max(0, Math.min(100, l * ratio)); + colorInstance.setHsl(h, s, _l); + return colorInstance.toRGBA(); +} + +export function darken(graphic: IGraphic, params: IDarkenParams) { + if (graphic) { + const { duration, easing, ratio = 0.8 } = params; + const { fill, visible, opacity } = graphic.attribute; + if (isString(fill) && visible !== false && opacity !== 0) { + graphic.animate().to({ fill: getBrighterColor(fill, Math.min(1, ratio)) }, duration, easing as EasingType); + } else { + // 渐变色 + } + } +} + +export function brighten(graphic: IGraphic, params: IBrightenParams) { + if (graphic) { + const { duration, easing, ratio = 1.2 } = params; + const { fill, visible, opacity } = graphic.attribute; + if (isString(fill) && visible !== false && opacity !== 0) { + graphic.animate().to({ fill: getBrighterColor(fill, Math.max(1, ratio)) }, duration, easing as EasingType); + } else { + // 渐变色 + } + } +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/effect/typewriter.ts b/packages/vstory/src/dsl/story-processor/graphic/effect/typewriter.ts new file mode 100644 index 0000000..5bac6c6 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/effect/typewriter.ts @@ -0,0 +1,13 @@ +import { EasingType, IText } from '@visactor/vrender-core'; +import { TypeWriter } from '../../../../animate/typewirter'; +import { isString } from '@visactor/vutils'; + +export function typewriter(graphic: IText, params: any) { + if (graphic && graphic.type === 'text') { + const { duration, easing } = params; + const { text } = graphic.attribute; + if (isString(text)) { + graphic.animate().play(new TypeWriter({ text: '' }, { text }, duration, easing as EasingType)); + } + } +} diff --git a/packages/vstory/src/dsl/story-processor/graphic/flicker.ts b/packages/vstory/src/dsl/story-processor/graphic/flicker.ts new file mode 100644 index 0000000..f2f5c78 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/flicker.ts @@ -0,0 +1,12 @@ +import type { ICharacter } from '../../../story/character'; +import type { IFlickerAction } from '../../types'; +import { flicker } from './effect/flicker'; +import { getCharacterGraphic } from './util'; + +export const flickerProcessor = async (character: ICharacter, spec = {}, appearAction: IFlickerAction) => { + const { animation } = appearAction.payload ?? {}; + const graphics = getCharacterGraphic(character); + graphics.forEach(graphic => { + flicker(graphic, animation); + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/moveTo.ts b/packages/vstory/src/dsl/story-processor/graphic/moveTo.ts new file mode 100644 index 0000000..75de27a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/moveTo.ts @@ -0,0 +1,13 @@ +import { ICharacter } from '../../../story/character'; +import { moveTo } from './effect/moveTo'; +import { getCharacterParentGraphic } from './util'; + +export const moveToProcessor = async (character: ICharacter, spec = {}, moveToAction: any) => { + const { destination } = moveToAction; + const { animation } = moveToAction.payload ?? {}; + const graphic = getCharacterParentGraphic(character); + moveTo(graphic, { ...animation, destination }); + return { + totalTime: animation.duration + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/style.ts b/packages/vstory/src/dsl/story-processor/graphic/style.ts new file mode 100644 index 0000000..bbfb7ca --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/style.ts @@ -0,0 +1,21 @@ +import type { EasingType } from '@visactor/vrender-core'; +import type { IGraphicStyleAction } from '../../types/graphic/style'; +import type { ICharacter } from '../../../story/character'; +import { getCharacterGraphic } from './util'; + +export const styleProcessor = async (character: ICharacter, spec = {}, styleAction: IGraphicStyleAction) => { + const { animation, graphic: graphicStyle, text: textStyle } = styleAction.payload ?? {}; + const { duration, easing } = animation; + const graphic = getCharacterGraphic(character)[0]; + const text = getCharacterGraphic(character)[1]; + + if (graphic && graphicStyle) { + graphic.animate().to(graphicStyle, duration, easing as EasingType); + } + if (text && textStyle) { + graphic.animate().to(textStyle, duration, easing as EasingType); + } + return { + totalTime: duration + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/graphic/util.ts b/packages/vstory/src/dsl/story-processor/graphic/util.ts new file mode 100644 index 0000000..23a94d7 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/graphic/util.ts @@ -0,0 +1,25 @@ +import type { IGraphic } from '@visactor/vrender-core'; +import type { ICharacter } from '../../../story/character'; +import { IAnimationParams } from '../../types'; + +export function getCharacterGraphic(character: ICharacter) { + return character.getGraphicParent().getChildren() as IGraphic[]; +} + +export function getCharacterParentGraphic(character: ICharacter) { + return character.getGraphicParent(); +} + +export function getCharacterByEffect(character: ICharacter, effect: 'move' | string) { + // 图表仅操作父节点. + // @ts-ignore + if (character._graphic.type === 'chart') { + return [getCharacterParentGraphic(character)]; + } + // move效果, 一定是对parent的操作 + return effect === 'move' ? [getCharacterParentGraphic(character)] : getCharacterGraphic(character); +} + +export const canDoGraphicAnimation = (graphic: IGraphic, animationParams: IAnimationParams) => { + return graphic && animationParams.duration && animationParams.duration > 0; +}; diff --git a/packages/vstory/src/dsl/story-processor/index.ts b/packages/vstory/src/dsl/story-processor/index.ts new file mode 100644 index 0000000..19df36a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/index.ts @@ -0,0 +1,3 @@ +export * from './processor'; + +export { processorMap } from './processorMap/processorMap'; diff --git a/packages/vstory/src/dsl/story-processor/processor.ts b/packages/vstory/src/dsl/story-processor/processor.ts new file mode 100644 index 0000000..3884d2b --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processor.ts @@ -0,0 +1,83 @@ +import type { IAction } from '../types'; + +export type IProcessorMap = Record>; + +export interface IProcessorReturnType { + totalTime: number; + revertActionParams?: IAction; +} + +export class ActionProcessor { + protected _processorMap: Map>; + + private static _instance: ActionProcessor = null; + + constructor(processorMap?: IProcessorMap) { + if (!ActionProcessor._instance) { + this.init(processorMap); + ActionProcessor._instance = this; + } + return ActionProcessor._instance; + } + + protected init(processorMap?: IProcessorMap) { + this._processorMap = new Map(); + if (processorMap) { + for (const key in processorMap) { + console.log(`register ${key} processor.`); // TODO: remove log + this.registerProcessor(key, processorMap[key]); + } + } + } + + /** + * + * @param name 操作对象名称 + * @param processors 操作对象支持的 processor + * @returns boolean 注册是否成功 + */ + registerProcessor(name: string, processors: Record) { + if (!this._processorMap) { + return false; + } + // 重复注册,目前直接替代 + this._processorMap.set(name, processors); + return true; + } + + getProcessorList(name: string) { + return this._processorMap && this._processorMap.get(name); + } + + getProcessor(name: string, actionName: string) { + return this._processorMap && this._processorMap.get(name)?.[actionName]; + } + + /** + * Execute action + * @param name + * @param actionName + * @param actionParams + * @returns IProcessorReturnType + */ + async doAction(name: string, actionName: string, actionParams: any[]): Promise { + const processor = this.getProcessor(name, actionName); + if (processor) { + console.log(`Execute action => ${actionName}, character => ${name}`); // TODO: remove log + const actionResult = await processor(...actionParams); + console.log(`Action Executed:`, actionResult); // TODO: remove log + return actionResult; + } + console.error(`Action not found: character => ${name}, action => ${actionName} `); // TODO: remove log + return undefined; + } + + release() { + ActionProcessor._instance = null; + + if (this._processorMap) { + this._processorMap.clear(); + this._processorMap = null; + } + } +} diff --git a/packages/vstory/src/dsl/story-processor/processorMap/index.ts b/packages/vstory/src/dsl/story-processor/processorMap/index.ts new file mode 100644 index 0000000..a336287 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/index.ts @@ -0,0 +1 @@ +export * from './processorMap'; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/processorMap.ts b/packages/vstory/src/dsl/story-processor/processorMap/processorMap.ts new file mode 100644 index 0000000..8fe6589 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/processorMap.ts @@ -0,0 +1,152 @@ +import { StoryChartComponentType, StoryChartType, StoryGraphicType } from '../../constant'; + +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { graphicAppearProcessor } from '../graphic/appear'; +import { + barAppearProcessor, + barDisappearProcessor, + lineAppearProcessor, + areaAppearProcessor, + areaDisappearProcessor, + pieAppearProcessor, + pieDisappearProcessor +} from '../vchart/charts'; +import { createMarkPointProcessor, markPointFlickerProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { lineStyleProcessor } from '../vchart/style/lineStyle'; +import { danceProcessor } from '../vchart/dance'; +import { flickerProcessor } from '../graphic/flicker'; +import { darkenProcessor } from '../graphic/darken'; +import { brightenProcessor } from '../graphic/brighten'; +import { moveToProcessor } from '../graphic/moveTo'; +import { styleProcessor } from '../graphic/style'; +import { graphicDisappearProcessor } from '../graphic/disappear'; +import { bounceProcessor } from '../vchart/bounce'; +import { roseProcessorMap } from './rose'; +import { scatterProcessorMap } from './scatter'; +import { rangeColumnProcessorMap } from './rangeColumn'; +import { radarProcessorMap } from './radar'; +import { wordCloudProcessorMap } from './wordCloud'; +import { sunburstProcessorMap } from './sunburst'; +import { treeMapProcessorMap } from './treeMap'; +/** + * 通用的编辑processor + */ +export const editProcessor = { + add: addProcessor, + addPatch: addProcessor, + update: updateProcessor +}; + +/** + * 通用的查看processor + */ +export const viewProcessor = { + bounce: bounceProcessor +}; + +/** + * 通用的组件行为processor + */ + +export const componentProcessor = { + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor +}; + +// 图表processor +export const processorChartMap = { + [StoryChartType.BAR]: { + // 大多数都是通用的, 可以复用. + ...editProcessor, + ...viewProcessor, + // 通用的, 但实现不同的, 可以直接覆盖 + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + // 不通用的, 可直接覆盖, 重新定义 + barStyle: createMarkStyleProcessorByMarkType('rect'), + appear: barAppearProcessor, + disappear: barDisappearProcessor, + dance: danceProcessor + }, + [StoryChartType.LINE]: { + ...editProcessor, + ...viewProcessor, + ...componentProcessor, + lineStyle: lineStyleProcessor, + appear: lineAppearProcessor, + symbolStyle: createMarkStyleProcessorByMarkType('symbol') + }, + [StoryChartType.PIE]: { + ...editProcessor, + ...viewProcessor, + ...componentProcessor, + arcStyle: createMarkStyleProcessorByMarkType('arc'), + appear: pieAppearProcessor, + disappear: pieDisappearProcessor + }, + [StoryChartType.AREA]: { + ...editProcessor, + ...viewProcessor, + ...componentProcessor, + appear: areaAppearProcessor, + disappear: areaDisappearProcessor, + arcStyle: createMarkStyleProcessorByMarkType('arc') + }, + [StoryChartType.RANGE_COLUMN]: rangeColumnProcessorMap, + [StoryChartType.SCATTER]: scatterProcessorMap, + [StoryChartType.ROSE]: roseProcessorMap, + [StoryChartType.RADAR]: radarProcessorMap, + [StoryChartType.WORD_CLOUD]: wordCloudProcessorMap, + [StoryChartType.TREE_MAP]: treeMapProcessorMap, + [StoryChartType.SUNBURST]: sunburstProcessorMap +}; + +// 组件processor +export const processorComponentMap = { + [StoryChartComponentType.MARK_POINT]: { + flicker: markPointFlickerProcessor + } +}; + +// 图元processor +export const commonMarkProcessor = { + appear: graphicAppearProcessor, + disappear: graphicDisappearProcessor, + flicker: flickerProcessor, + darken: darkenProcessor, + brighten: brightenProcessor, + moveTo: moveToProcessor, + style: styleProcessor, + bounce: bounceProcessor +}; + +export const processorMarkMap = { + [StoryGraphicType.RECT]: { + ...commonMarkProcessor + }, + [StoryGraphicType.QIPAO]: { + ...commonMarkProcessor + }, + [StoryGraphicType.TEXT]: { + ...commonMarkProcessor + }, + [StoryGraphicType.RICH_TEXT]: { + ...commonMarkProcessor + }, + [StoryGraphicType.LINE]: { + ...commonMarkProcessor + }, + [StoryGraphicType.IMAGE]: { + ...commonMarkProcessor + } +}; + +// TODO: 按需引用, 所有processor +export const processorMap = { + ...processorChartMap, + ...processorComponentMap, + ...processorMarkMap +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/radar.ts b/packages/vstory/src/dsl/story-processor/processorMap/radar.ts new file mode 100644 index 0000000..9d71327 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/radar.ts @@ -0,0 +1,43 @@ +import { StoryChartComponentType, StoryChartType, StoryGraphicType } from '../../constant'; + +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { graphicAppearProcessor, textAppearProcessor } from '../graphic/appear'; +import { + barAppearProcessor, + barDisappearProcessor, + lineAppearProcessor, + areaAppearProcessor, + areaDisappearProcessor, + pieAppearProcessor, + pieDisappearProcessor, + radarAppearProcessor, + radarDisappearProcessor +} from '../vchart/charts'; +import { createMarkPointProcessor, markPointFlickerProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { lineStyleProcessor } from '../vchart/style/lineStyle'; +import { danceProcessor } from '../vchart/dance'; +import { flickerProcessor } from '../graphic/flicker'; +import { darkenProcessor } from '../graphic/darken'; +import { brightenProcessor } from '../graphic/brighten'; +import { moveToProcessor } from '../graphic/moveTo'; +import { styleProcessor } from '../graphic/style'; +import { graphicDisappearProcessor, textDisappearProcessor } from '../graphic/disappear'; +import { bounceProcessor } from '../vchart/bounce'; + +export const radarProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: radarAppearProcessor, + disappear: radarDisappearProcessor, + areaStyle: createMarkStyleProcessorByMarkType('area') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/rangeColumn.ts b/packages/vstory/src/dsl/story-processor/processorMap/rangeColumn.ts new file mode 100644 index 0000000..471c176 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/rangeColumn.ts @@ -0,0 +1,22 @@ +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { barAppearProcessor, barDisappearProcessor } from '../vchart/charts'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { bounceProcessor } from '../vchart/bounce'; + +export const rangeColumnProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: barAppearProcessor, + disappear: barDisappearProcessor, + barStyle: createMarkStyleProcessorByMarkType('rect') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/rose.ts b/packages/vstory/src/dsl/story-processor/processorMap/rose.ts new file mode 100644 index 0000000..36ad059 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/rose.ts @@ -0,0 +1,25 @@ +import { StoryChartComponentType, StoryChartType, StoryGraphicType } from '../../constant'; + +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; + +import { bounceProcessor } from '../vchart/bounce'; +import { roseAppearProcessor, roseDisappearProcessor } from '../vchart/charts/rose'; + +export const roseProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: roseAppearProcessor, + disappear: roseDisappearProcessor, + arcStyle: createMarkStyleProcessorByMarkType('arc') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/scatter.ts b/packages/vstory/src/dsl/story-processor/processorMap/scatter.ts new file mode 100644 index 0000000..0c742cf --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/scatter.ts @@ -0,0 +1,22 @@ +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { scatterAppearProcessor, scatterDisappearProcessor } from '../vchart/charts'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { bounceProcessor } from '../vchart/bounce'; + +export const scatterProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: scatterAppearProcessor, + disappear: scatterDisappearProcessor, + symbolStyle: createMarkStyleProcessorByMarkType('symbol') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/sunburst.ts b/packages/vstory/src/dsl/story-processor/processorMap/sunburst.ts new file mode 100644 index 0000000..5670ce9 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/sunburst.ts @@ -0,0 +1,22 @@ +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { sunburstDisappearProcessor, sunburstAppearProcessor } from '../vchart/charts'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { bounceProcessor } from '../vchart/bounce'; + +export const sunburstProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: sunburstAppearProcessor, + disappear: sunburstDisappearProcessor, + symbolStyle: createMarkStyleProcessorByMarkType('symbol') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/treeMap.ts b/packages/vstory/src/dsl/story-processor/processorMap/treeMap.ts new file mode 100644 index 0000000..4e734c1 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/treeMap.ts @@ -0,0 +1,22 @@ +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { treeMapAppearProcessor, treeMapDisappearProcessor } from '../vchart/charts'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { bounceProcessor } from '../vchart/bounce'; + +export const treeMapProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: treeMapAppearProcessor, + disappear: treeMapDisappearProcessor, + rectStyle: createMarkStyleProcessorByMarkType('rect') +}; diff --git a/packages/vstory/src/dsl/story-processor/processorMap/wordCloud.ts b/packages/vstory/src/dsl/story-processor/processorMap/wordCloud.ts new file mode 100644 index 0000000..4a8da11 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/processorMap/wordCloud.ts @@ -0,0 +1,22 @@ +import { addProcessor } from '../vchart/add'; +import { createMarkStyleProcessorByMarkType } from '../vchart/style/style'; +import { updateProcessor } from '../vchart/update'; +import { wordCloudAppearProcessor, wordCloudDisappearProcessor } from '../vchart/charts'; +import { createMarkPointProcessor } from '../vchart/markPoint'; +import { createTitleProcessor } from '../vchart/title'; +import { bounceProcessor } from '../vchart/bounce'; + +export const wordCloudProcessorMap = { + add: addProcessor, + addPatch: addProcessor, + updateProcessor, + + bounce: bounceProcessor, + + createMarkPoint: createMarkPointProcessor, + createTitle: createTitleProcessor, + + appear: wordCloudAppearProcessor, + disappear: wordCloudDisappearProcessor, + symbolStyle: createMarkStyleProcessorByMarkType('symbol') +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/add.ts b/packages/vstory/src/dsl/story-processor/vchart/add.ts new file mode 100644 index 0000000..dbc128d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/add.ts @@ -0,0 +1,23 @@ +import { IChartAddAction } from './../../types/chart/add'; +import VChart, { ISpec, IVChart } from '@visactor/vchart'; +import { cloneDeep, isArray } from '@visactor/vutils'; +import { ICharacterVisactor } from '../../../story/character/visactor/interface'; + +export const addProcessor = async (chartInstance: ICharacterVisactor, spec: ISpec, action: IChartAddAction) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action as IChartAddAction; + const { id: dataId, values } = payload; + const rowData = cloneDeep(vchart._dataSet.getDataView(dataId).rawData); + + const data = isArray(values) ? values : [values]; + rowData.push(...data); + + await instance.updateDataSync(dataId, rowData); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/bounce.ts b/packages/vstory/src/dsl/story-processor/vchart/bounce.ts new file mode 100644 index 0000000..fe5a20d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/bounce.ts @@ -0,0 +1,12 @@ +import type { ISpec } from '@visactor/vchart'; +import type { IBounceAction } from '../../types/common/bounce'; +import type { ICharacterVisactor } from '../../../story/character/visactor/interface'; +import { bounce } from '../graphic/effect/bounce'; + +export const bounceProcessor = async (chartInstance: ICharacterVisactor, spec: ISpec, action: IBounceAction) => { + const chart = chartInstance.getGraphicParent(); + if (chart) { + const { payload } = action ?? {}; + bounce(chart, payload.animation); + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaAppear.ts new file mode 100644 index 0000000..6a8b83b --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaAppear.ts @@ -0,0 +1,16 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { areaAppearProcessor as areaMarkAppearProcessor } from '../../marks'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const areaAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + areaMarkAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaDisappear.ts new file mode 100644 index 0000000..1e80d5a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/area/areaDisappear.ts @@ -0,0 +1,46 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { areaDisappearProcessor as areaMarkDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const areaDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + areaMarkDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/area/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/area/index.ts new file mode 100644 index 0000000..90af126 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/area/index.ts @@ -0,0 +1,2 @@ +export { areaAppearProcessor } from './areaAppear'; +export { areaDisappearProcessor } from './areaDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barAppear.ts new file mode 100644 index 0000000..0554516 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barAppear.ts @@ -0,0 +1,18 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { rectAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const barAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + // 显示: rect + rectAppearProcessor(chartInstance, spec, action); + + // Group Appear + delete action.payload.animation.effect; + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barDisappear.ts new file mode 100644 index 0000000..30aa7cf --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/barDisappear.ts @@ -0,0 +1,48 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; + +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { rectDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const barDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + // 隐藏: rect图元 + rectDisappearProcessor(chartInstance, spec, action); + + // 隐藏: title图元 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + effect: 'fade', + duration: action.payload.animation.duration, + easing: action.payload.animation.easing + } + } + }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏: 坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // 隐藏: 根节点容器 + // chart.setAttributes({ + // visible: false + // }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/bar/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/index.ts new file mode 100644 index 0000000..4576f4d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/bar/index.ts @@ -0,0 +1,2 @@ +export { barAppearProcessor } from './barAppear'; +export { barDisappearProcessor } from './barDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/index.ts new file mode 100644 index 0000000..021146c --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/index.ts @@ -0,0 +1,9 @@ +export * from './bar'; +export * from './line'; +export * from './pie'; +export * from './area'; +export * from './scatter'; +export * from './radar'; +export * from './wordCloud'; +export * from './treeMap'; +export * from './sunburst'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/line/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/line/index.ts new file mode 100644 index 0000000..d4d4515 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/line/index.ts @@ -0,0 +1,2 @@ +export { lineAppearProcessor } from './lineAppear'; +export { lineDisappearProcessor } from './lineDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineAppear.ts new file mode 100644 index 0000000..02db89d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineAppear.ts @@ -0,0 +1,18 @@ +import { ISpec } from '@visactor/vchart'; + +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { lineAppearProcessor as lineMarkAppearProcessor, symbolAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const lineAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + lineMarkAppearProcessor(chartInstance, spec, action); + symbolAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineDisappear.ts new file mode 100644 index 0000000..925b455 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/line/lineDisappear.ts @@ -0,0 +1,47 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; + +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { lineDisappearProcessor as lineMarkDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const lineDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + lineMarkDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/line/transformLineSymbolAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/line/transformLineSymbolAppear.ts new file mode 100644 index 0000000..cb288e9 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/line/transformLineSymbolAppear.ts @@ -0,0 +1,77 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +export const transformLineSymbolAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + switch (animation.effect) { + case 'grow': { + return symbolGrow(instance, animation, option); + } + case 'fade': { + return symbolFade(instance, animation, option); + } + } +}; + +const symbolGrow = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { markIndex, disappear } = option; + + if (oneByOne === true) { + return { + type: disappear ? 'scaleOut' : 'scaleIn', + duration, + loop, + oneByOne: false, + easing, + delay: () => { + return markIndex * Number(duration); + } + }; + } + + return { + type: 'scaleIn', + duration, + loop, + oneByOne, + easing + }; +}; + +const symbolFade = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { markIndex, disappear } = option; + + if (oneByOne === true) { + return { + type: disappear ? 'fadeOut' : 'fadeIn', + duration, + loop, + oneByOne: false, + easing, + delay: () => { + return markIndex * Number(duration); + } + }; + } + + return { + type: 'fadeIn', + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/pie/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/index.ts new file mode 100644 index 0000000..6f83437 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/index.ts @@ -0,0 +1,2 @@ +export { pieAppearProcessor } from './pieAppear'; +export { pieDisappearProcessor } from './pieDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieAppear.ts new file mode 100644 index 0000000..4021fe0 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieAppear.ts @@ -0,0 +1,16 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { arcAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const pieAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + arcAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieDisappear.ts new file mode 100644 index 0000000..0916aab --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/pie/pieDisappear.ts @@ -0,0 +1,47 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; + +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { arcDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const pieDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + arcDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/radar/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/index.ts new file mode 100644 index 0000000..748eb77 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/index.ts @@ -0,0 +1,2 @@ +export { radarAppearProcessor } from './radarAppear'; +export { radarDisappearProcessor } from './radarDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarAppear.ts new file mode 100644 index 0000000..495e6be --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarAppear.ts @@ -0,0 +1,29 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { areaAppearProcessor, lineAppearProcessor, symbolAppearProcessor } from '../../marks'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const radarAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + // 显示: symbol + symbolAppearProcessor(chartInstance, spec, action); + // 显示: area + areaAppearProcessor(chartInstance, spec, action); + // 显示: line + lineAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarDisappear.ts new file mode 100644 index 0000000..278fcd4 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/radar/radarDisappear.ts @@ -0,0 +1,48 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { areaDisappearProcessor, lineDisappearProcessor, symbolDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const radarDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + symbolDisappearProcessor(chartInstance, spec, action); + areaDisappearProcessor(chartInstance, spec, action); + lineDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action?.payload?.animation?.duration, + easing: action?.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/rose/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/index.ts new file mode 100644 index 0000000..3320ef1 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/index.ts @@ -0,0 +1,2 @@ +export { roseAppearProcessor } from './roseAppear'; +export { roseDisappearProcessor } from './roseDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseAppear.ts new file mode 100644 index 0000000..f1968ae --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseAppear.ts @@ -0,0 +1,16 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { arcAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const roseAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + arcAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseDisappear.ts new file mode 100644 index 0000000..eeeedcf --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/rose/roseDisappear.ts @@ -0,0 +1,47 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; + +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { arcDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const roseDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + arcDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/index.ts new file mode 100644 index 0000000..839bda0 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/index.ts @@ -0,0 +1,2 @@ +export { scatterAppearProcessor } from './scatterAppear'; +export { scatterDisappearProcessor } from './scatterDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterAppear.ts new file mode 100644 index 0000000..5689e3f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterAppear.ts @@ -0,0 +1,17 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { symbolAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const scatterAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + // 显示: symbol + symbolAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterDisappear.ts new file mode 100644 index 0000000..aa98fc0 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/scatter/scatterDisappear.ts @@ -0,0 +1,47 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { symbolDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const scatterDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + // 隐藏: symbol + symbolDisappearProcessor(chartInstance, spec, action); + + // 隐藏: 标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload.animation.duration, + easing: action.payload.animation.easing, + effect: 'fade' + } + } + }); + + // 隐藏: 坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏: 根节点容器 + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/index.ts new file mode 100644 index 0000000..0b9653f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/index.ts @@ -0,0 +1,2 @@ +export { sunburstAppearProcessor } from './sunburstAppear'; +export { sunburstDisappearProcessor } from './sunburstDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstAppear.ts new file mode 100644 index 0000000..25ba4bd --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstAppear.ts @@ -0,0 +1,16 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { arcAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const sunburstAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + arcAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstDisappear.ts new file mode 100644 index 0000000..ee4012a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/sunburst/sunburstDisappear.ts @@ -0,0 +1,46 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { arcDisappearProcessor, rectDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const sunburstDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + arcDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/index.ts new file mode 100644 index 0000000..073a87f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/index.ts @@ -0,0 +1,2 @@ +export { treeMapAppearProcessor } from './treeMapAppear'; +export { treeMapDisappearProcessor } from './treeMapDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapAppear.ts new file mode 100644 index 0000000..4503c14 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapAppear.ts @@ -0,0 +1,16 @@ +import { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { rectAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const treeMapAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + rectAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapDisappear.ts new file mode 100644 index 0000000..3030320 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/treeMap/treeMapDisappear.ts @@ -0,0 +1,46 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { rectDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const treeMapDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + rectDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload?.animation?.duration, + easing: action.payload?.animation?.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/index.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/index.ts new file mode 100644 index 0000000..5b3c843 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/index.ts @@ -0,0 +1,2 @@ +export { wordCloudAppearProcessor } from './wordCloudAppear'; +export { wordCloudDisappearProcessor } from './wordCloudDisappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudAppear.ts new file mode 100644 index 0000000..8f1f7ef --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudAppear.ts @@ -0,0 +1,17 @@ +import { ISpec } from '@visactor/vchart'; + +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { textAppearProcessor } from '../../marks'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { graphicAppearProcessor } from '../../../graphic/appear'; + +export const wordCloudAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + textAppearProcessor(chartInstance, spec, action); + + // Group Appear + graphicAppearProcessor(chartInstance, spec, action); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudDisappear.ts b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudDisappear.ts new file mode 100644 index 0000000..d44afa5 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/charts/wordCloud/wordCloudDisappear.ts @@ -0,0 +1,46 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { axesDisappearProcessor, titleDisappearProcessor } from '../../components'; +import { textDisappearProcessor } from '../../marks'; +import { graphicDisappearProcessor } from '../../../graphic/disappear'; + +export const wordCloudDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + textDisappearProcessor(chartInstance, spec, action); + + // 隐藏标题 + titleDisappearProcessor(chartInstance, spec, { + action: 'disappear', + payload: { + animation: { + duration: action.payload.animation.duration, + easing: action.payload.animation.easing, + effect: 'fade' + } + } + }); + + // 隐藏坐标轴 + axesDisappearProcessor(chartInstance, spec, { action: 'disappear', payload: undefined }); + + // Group Disappear + // @ts-ignore + graphicDisappearProcessor(chartInstance, spec, action); + + // 隐藏group + chart.setAttributes({ + visible: false + }); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/components/axes/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/components/axes/disappear.ts new file mode 100644 index 0000000..8f38563 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/components/axes/disappear.ts @@ -0,0 +1,47 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { IGraphicDisappearAction } from '../../../../types/graphic/disappear'; + +// VChart, axes组件 disappear +export const axesDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IGraphicDisappearAction +) => { + const chart = chartInstance.getGraphicParent(); + const instance: VChart = chart?._vchart ? chart?._vchart : chartInstance; + + if (!instance) { + return; + } + + // 获取轴组件 + const axes = instance.getChart().getComponentsByKey('axes'); + if (!axes) { + return; + } + + // 设置轴组件所有内容visible不可见 + axes.forEach(axis => { + const marks = axis.getMarks(); + marks.forEach(mark => { + mark.getProduct().encode({ + // 极坐标系和笛卡尔坐标系, 设置各个图形不可见. + title: { visible: false }, + label: { visible: false }, + tick: { visible: false }, + subTick: { visible: false }, + line: { visible: false }, + // 极坐标系使用grid控制domainLine, 通过设置style和subGrid设置为不可见 + style: { + visible: false + }, + subGrid: { + visible: false + } + }); + }); + }); + + instance.renderSync(); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/components/axes/index.ts b/packages/vstory/src/dsl/story-processor/vchart/components/axes/index.ts new file mode 100644 index 0000000..7a42c1b --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/components/axes/index.ts @@ -0,0 +1 @@ +export { axesDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/components/index.ts b/packages/vstory/src/dsl/story-processor/vchart/components/index.ts new file mode 100644 index 0000000..aa54ba7 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/components/index.ts @@ -0,0 +1,2 @@ +export * from './title'; +export * from './axes'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/components/title/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/components/title/disappear.ts new file mode 100644 index 0000000..bdbdc1f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/components/title/disappear.ts @@ -0,0 +1,50 @@ +import VChart, { ISpec } from '@visactor/vchart'; + +import { IGraphic } from '@visactor/vrender-core'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { IGraphicDisappearAction } from '../../../../types/graphic/disappear'; +import { commonDisappearEffect } from '../../../graphic/effect/disappear'; +import { merge } from '@visactor/vutils'; + +// VChart title组件disappear +export const titleDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IGraphicDisappearAction +) => { + const chart = chartInstance.getGraphicParent(); + const instance: VChart = chart?._vchart ? chart?._vchart : chartInstance; + + if (!instance) { + return; + } + + // @ts-ignore + const titleComponent = instance.getChart().getComponentsByType('title')[0]?._titleComponent; // 从图表获取Title组件 + if (!titleComponent) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IGraphicDisappearAction['payload']; + + const { animation } = mergePayload; + if (animation) { + // 得到所有的text图元, 执行disAppear动画 + titleComponent.getElementsByType('text').forEach((text: IGraphic) => { + commonDisappearEffect(text, animation.effect, animation); + }); + } else { + titleComponent.getElementsByType('text').forEach((text: IGraphic) => { + text.setAttributes({ visible: false }); + }); + } +}; + +const defaultPayload: IGraphicDisappearAction['payload'] = { + animation: { + effect: 'fade', + duration: 300, + easing: 'linear' + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/components/title/index.ts b/packages/vstory/src/dsl/story-processor/vchart/components/title/index.ts new file mode 100644 index 0000000..2779eaa --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/components/title/index.ts @@ -0,0 +1 @@ +export { titleDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/dance.ts b/packages/vstory/src/dsl/story-processor/vchart/dance.ts new file mode 100644 index 0000000..fa209c1 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/dance.ts @@ -0,0 +1,59 @@ +import VChart, { IChartSpec } from '@visactor/vchart'; +import { getAllSeriesMarksWithoutRoot } from '../../../util/vchart-api'; +import { isDatumEqual } from '../../utils/datum'; +import { isNil } from '@visactor/vutils'; + +export const danceProcessor = (chartInstance: VChart, spec: IChartSpec, addAction: any) => { + if (!chartInstance) { + return; + } + + const marks = getAllSeriesMarksWithoutRoot(chartInstance).filter(mark => mark.type === 'rect'); + + if (!marks.length) { + return; + } + + marks.forEach(mark => { + const product = mark.getProduct(); + const { elements } = product; + + const element = elements.find(e => isDatumEqual(e.data, addAction.data)); + if (isNil(element)) { + return; + } + + const duration = 500; + const queue = [ + { dy: -50, scaleY: 0.5, fill: 'red' }, + { dy: 0, scaleY: 0.5, fill: 'red' }, + { dy: -30, scaleY: 0.7, fill: 'red' }, + { dy: 0, scaleY: 0.7, fill: 'red' }, + { dy: -18, scaleY: 0.9, fill: 'red' }, + { dy: 0, scaleY: 1, fill: 'red' } + ]; + + queue.forEach(v => { + element + .getGraphicItem() + .animate() + .to(v, duration / queue.length, 'easeIn'); + }); + }); +}; + +// 改mark的属性的方案有种 +// mark.encode样式; +// Graphic.attrs; +// 限制: 一定不能调用updateSpec; +// 但可以调用updateData; + +// // 做动画 有2种 +// mark.animate.run(); //一组elements +// 限制: 一定不能调用updateSpec; +// 但可以调用updateData; + +// // +// Graphic.animate(); // 单个element +// 限制: 一定不能调用updateSpec; +// 不能调用updateData; diff --git a/packages/vstory/src/dsl/story-processor/vchart/markPoint.ts b/packages/vstory/src/dsl/story-processor/vchart/markPoint.ts new file mode 100644 index 0000000..1cb586d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/markPoint.ts @@ -0,0 +1,37 @@ +import type { VChart, IChartSpec, IMarkPointSpec, MarkPoint } from '@visactor/vchart'; +import type { IActionContext, IFlickerAction } from '../../types'; +import type { CreateMarkPointAction } from '../../types/chart/createComponent'; +import { getComponentById } from '../../../util/vchart-api'; +import { flickerEffect } from '../../utils/flicker'; + +export const createMarkPointProcessor = async ( + chartInstance: VChart, + spec: IChartSpec, + createMarkPointAction: CreateMarkPointAction +) => { + const action = createMarkPointAction; + const markPoint: IMarkPointSpec[] = (spec as any).markPoint ?? []; + markPoint.push({ + id: action.elementId, + coordinate: action.data, + itemContent: action.payload.itemContent, + itemLine: action.payload.itemLine + }); + (spec as any).markPoint = markPoint; + chartInstance.updateSpecSync(spec); +}; + +export const markPointFlickerProcessor = async ( + chartInstance: VChart, + spec: any, + markPointAction: IFlickerAction & IActionContext +) => { + const { elementId } = markPointAction; + const vchartMarkPoint = getComponentById(chartInstance, elementId) as MarkPoint; + if (vchartMarkPoint && vchartMarkPoint._markerComponent) { + const marker = vchartMarkPoint._markerComponent._item; + if (marker) { + flickerEffect(marker); + } + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/arc/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/appear.ts new file mode 100644 index 0000000..a713fed --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/appear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformArcAppear } from './transformArcAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const arcAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const symbolMarks = getSeriesMarksByMarkType(series, 'arc'); + + if (!symbolMarks.length) { + return; + } + + symbolMarks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformArcAppear(instance, mergePayload.animation, { + disappear: false, + index: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/arc/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/disappear.ts new file mode 100644 index 0000000..a7454df --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/disappear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformArcAppear } from './transformArcAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const arcDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const symbolMarks = getSeriesMarksByMarkType(series, 'arc'); + + if (!symbolMarks.length) { + return; + } + + symbolMarks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformArcAppear(instance, mergePayload.animation, { + disappear: true, + index: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/arc/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/index.ts new file mode 100644 index 0000000..395bbb0 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/index.ts @@ -0,0 +1,2 @@ +export { arcAppearProcessor } from './appear'; +export { arcDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/arc/transformArcAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/transformArcAppear.ts new file mode 100644 index 0000000..5361329 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/arc/transformArcAppear.ts @@ -0,0 +1,82 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +interface ArcAppearOption { + disappear: boolean; + index: number; +} + +// 将payload转换为chart内置的动画type +export const transformArcAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: ArcAppearOption +) => { + switch (animation.effect) { + case 'grow': { + return arcGrowRadius(instance, animation, option); + } + case 'growRadius': { + return arcGrowRadius(instance, animation, option); + } + case 'growAngle': { + return arcGrowAngle(instance, animation, option); + } + case 'fade': { + return arcFade(instance, animation, option); + } + default: { + return arcFade(instance, animation, option); + } + } +}; + +const arcGrowRadius = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: ArcAppearOption +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'growRadiusOut' : 'growRadiusIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const arcGrowAngle = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: ArcAppearOption +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'growAngleOut' : 'growAngleIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const arcFade = (instance: VChart, animation: IChartAppearAction['payload']['animation'], option: ArcAppearOption) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/area/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/area/appear.ts new file mode 100644 index 0000000..62ef69d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/area/appear.ts @@ -0,0 +1,52 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { getAllSeriesMarksByMarkType } from '../../utils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformAreaAppear } from './transformAreaAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const areaAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'area'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformAreaAppear(instance, mergePayload.animation, { + disappear: false, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'fade', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/area/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/area/disappear.ts new file mode 100644 index 0000000..f05c412 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/area/disappear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformAreaAppear } from './transformAreaAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const areaDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'area'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformAreaAppear(instance, mergePayload.animation, { + disappear: true, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'fade', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/area/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/area/index.ts new file mode 100644 index 0000000..2af38f9 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/area/index.ts @@ -0,0 +1,2 @@ +export { areaAppearProcessor } from './appear'; +export { areaDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/area/transformAreaAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/area/transformAreaAppear.ts new file mode 100644 index 0000000..f1cb226 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/area/transformAreaAppear.ts @@ -0,0 +1,63 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +interface AreaAppearOption { + markIndex: number; + disappear: boolean; +} + +export const transformAreaAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: AreaAppearOption +) => { + switch (animation.effect) { + case 'grow': { + return areaGrow(instance, animation, option); + } + case 'fade': { + return areaFade(instance, animation, option); + } + default: { + return areaFade(instance, animation, option); + } + } +}; + +const areaGrow = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: AreaAppearOption +) => { + const { duration, loop, oneByOne, easing } = animation; + const { markIndex, disappear } = option; + + const type = disappear ? 'clipOut' : 'clipIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const areaFade = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: AreaAppearOption +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type: type, + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/index.ts new file mode 100644 index 0000000..b45d05d --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/index.ts @@ -0,0 +1,6 @@ +export * from './rect'; +export * from './symbol'; +export * from './area'; +export * from './line'; +export * from './arc'; +export * from './text'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/line/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/line/appear.ts new file mode 100644 index 0000000..a343f81 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/line/appear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformLineAppear } from './transformLineAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const lineAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const symbolMarks = getSeriesMarksByMarkType(series, 'line'); + + if (!symbolMarks.length) { + return; + } + + symbolMarks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformLineAppear(instance, mergePayload.animation, { + disappear: false, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/line/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/line/disappear.ts new file mode 100644 index 0000000..e4d0087 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/line/disappear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformLineAppear } from './transformLineAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const lineDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const symbolMarks = getSeriesMarksByMarkType(series, 'line'); + + if (!symbolMarks.length) { + return; + } + + symbolMarks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformLineAppear(instance, mergePayload.animation, { + disappear: true, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/line/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/line/index.ts new file mode 100644 index 0000000..3ac8d49 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/line/index.ts @@ -0,0 +1,2 @@ +export { lineAppearProcessor } from './appear'; +export { lineDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/line/transformLineAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/line/transformLineAppear.ts new file mode 100644 index 0000000..c35e3ec --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/line/transformLineAppear.ts @@ -0,0 +1,57 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +export const transformLineAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + switch (animation.effect) { + case 'grow': { + return lineGrow(instance, animation, option); + } + case 'fade': { + return lineFade(instance, animation, option); + } + default: { + return lineFade(instance, animation, option); + } + } +}; + +const lineGrow = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + + const type = disappear ? 'clipOut' : 'clipIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const lineFade = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/rect/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/appear.ts new file mode 100644 index 0000000..6d69876 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/appear.ts @@ -0,0 +1,52 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { getAllSeriesMarksByMarkType } from '../../utils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformRectAppear } from './transformRectAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const rectAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'rect'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformRectAppear(instance, mergePayload.animation, { + index: seriesIndex + markIndex, + disappear: false + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/rect/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/disappear.ts new file mode 100644 index 0000000..637148e --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/disappear.ts @@ -0,0 +1,52 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { getAllSeriesMarksByMarkType } from '../../utils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformRectAppear } from './transformRectAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const rectDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'rect'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformRectAppear(instance, mergePayload.animation, { + index: seriesIndex + markIndex, + disappear: true + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/rect/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/index.ts new file mode 100644 index 0000000..03e3ae5 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/index.ts @@ -0,0 +1,2 @@ +export { rectAppearProcessor } from './appear'; +export { rectDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/rect/transformRectAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/transformRectAppear.ts new file mode 100644 index 0000000..a6edb45 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/rect/transformRectAppear.ts @@ -0,0 +1,115 @@ +import VChart from '@visactor/vchart'; +import { IOrientType } from '@visactor/vchart/src/typings'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +// 将payload转换为chart内置的动画type +export const transformRectAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { index: number; disappear: boolean } +) => { + switch (animation.effect) { + case 'grow': { + return rectGrow(instance, animation, { + ...option, + center: false + }); + } + case 'centerGrow': { + return rectGrow(instance, animation, { + ...option, + center: true + }); + } + case 'fade': { + return rectFade(instance, animation, { + ...option, + center: false + }); + } + } +}; + +const rectGrow = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option = { center: false, disappear: false } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { center, disappear } = option; + const direction = instance.getChart().getSpec().direction ?? 'vertical'; + const xField = instance.getChart().getSpec().xField; + const yField = instance.getChart().getSpec().yField; + const [xAxis, yAxis] = getXYAxis(instance); + + const type = disappear ? (center ? 'growCenterOut' : 'growHeightOut') : center ? 'growCenterIn' : 'growHeightIn'; + + return { + type: type, + duration, + loop, + oneByOne, + easing, + options: (datum: any, element: any, params: any) => { + const field = direction === 'vertical' ? yField : xField; + const data = datum?.[field]; + + if (direction === 'vertical') { + return { + overall: yAxis?.getScale(0).scale(0), + orient: data > 0 ? 'negative' : 'positive' + }; + } else { + return { + overall: xAxis?.getScale(0).scale(0), + orient: data > 0 ? 'negative' : 'positive' + }; + } + } + }; +}; + +const rectFade = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option = { center: false, disappear: false } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type: type, + duration, + loop, + oneByOne, + easing + }; +}; + +function isXAxis(orient: IOrientType) { + return orient === 'bottom' || orient === 'top'; +} + +function isYAxis(orient: IOrientType) { + return orient === 'left' || orient === 'right'; +} + +const getXYAxis = (instance: VChart) => { + const axes = instance.getChart().getComponentsByKey('axes'); + const xAxis = axes.find(axis => { + const orient = axis.getOrient(); + if (isXAxis(orient)) { + return true; + } + }); + const yAxis = axes.find(axis => { + const orient = axis.getOrient(); + if (isYAxis(orient)) { + return true; + } + }); + + return [xAxis, yAxis]; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/appear.ts new file mode 100644 index 0000000..147fa47 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/appear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformSymbolAppear } from './transformSymbolAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const symbolAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'symbol'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformSymbolAppear(instance, mergePayload.animation, { + disappear: false, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/disappear.ts new file mode 100644 index 0000000..5176c33 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/disappear.ts @@ -0,0 +1,51 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformSymbolAppear } from './transformSymbolAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const symbolDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'symbol'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformSymbolAppear(instance, mergePayload.animation, { + disappear: true, + markIndex: seriesIndex + markIndex + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/index.ts new file mode 100644 index 0000000..eb1347c --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/index.ts @@ -0,0 +1,2 @@ +export { symbolAppearProcessor } from './appear'; +export { symbolDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/transformSymbolAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/transformSymbolAppear.ts new file mode 100644 index 0000000..5db5043 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/symbol/transformSymbolAppear.ts @@ -0,0 +1,57 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +export const transformSymbolAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + switch (animation.effect) { + case 'grow': { + return symbolGrow(instance, animation, option); + } + case 'fade': { + return symbolFade(instance, animation, option); + } + default: { + return symbolFade(instance, animation, option); + } + } +}; + +const symbolGrow = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + + const type = disappear ? 'scaleOut' : 'scaleIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const symbolFade = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: { markIndex: number; disappear: boolean } +) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/text/appear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/text/appear.ts new file mode 100644 index 0000000..52f280b --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/text/appear.ts @@ -0,0 +1,52 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { getAllSeriesMarksByMarkType } from '../../utils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformTextAppear } from './transformTextAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const textAppearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'text'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformTextAppear(instance, mergePayload.animation, { + index: seriesIndex + markIndex, + disappear: false + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/text/disappear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/text/disappear.ts new file mode 100644 index 0000000..9557a79 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/text/disappear.ts @@ -0,0 +1,52 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { merge } from '@visactor/vutils'; +import { getAllSeriesMarksByMarkType } from '../../utils'; +import { IChartAppearAction } from '../../../../types/chart/appear'; +import { transformTextAppear } from './transformTextAppear'; +import { ICharacterVisactor } from '../../../../../story/character/visactor/interface'; +import { getAllSeries, getSeriesMarksByMarkType } from '../../utils/series'; + +export const textDisappearProcessor = async ( + chartInstance: ICharacterVisactor, + spec: ISpec, + action: IChartAppearAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action; + const mergePayload = merge({}, defaultPayload, payload) as IChartAppearAction['payload']; + + getAllSeries(instance).forEach((series, seriesIndex) => { + const marks = getSeriesMarksByMarkType(series, 'text'); + + if (!marks.length) { + return; + } + + marks.forEach((mark, markIndex) => { + const product = mark.getProduct(); + const config = transformTextAppear(instance, mergePayload.animation, { + index: seriesIndex + markIndex, + disappear: true + }); + // @ts-ignore + product && product.animate.run(config); + }); + }); +}; + +const defaultPayload: IChartAppearAction['payload'] = { + animation: { + effect: 'grow', + duration: 2000, + easing: 'cubicOut', + oneByOne: false, + loop: false + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/text/index.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/text/index.ts new file mode 100644 index 0000000..39d3a78 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/text/index.ts @@ -0,0 +1,2 @@ +export { textAppearProcessor } from './appear'; +export { textDisappearProcessor } from './disappear'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/marks/text/transformTextAppear.ts b/packages/vstory/src/dsl/story-processor/vchart/marks/text/transformTextAppear.ts new file mode 100644 index 0000000..7455f8b --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/marks/text/transformTextAppear.ts @@ -0,0 +1,54 @@ +import VChart from '@visactor/vchart'; +import { IChartAppearAction } from '../../../../types/chart/appear'; + +interface ArcAppearOption { + disappear: boolean; + index: number; +} + +// 将payload转换为chart内置的动画type +export const transformTextAppear = ( + instance: VChart, + animation: IChartAppearAction['payload']['animation'], + option: ArcAppearOption +) => { + switch (animation.effect) { + case 'grow': { + return textGrow(instance, animation, option); + } + case 'fade': { + return textFade(instance, animation, option); + } + default: { + return textFade(instance, animation, option); + } + } +}; + +const textGrow = (instance: VChart, animation: IChartAppearAction['payload']['animation'], option: ArcAppearOption) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'scaleOut' : 'scaleIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; + +const textFade = (instance: VChart, animation: IChartAppearAction['payload']['animation'], option: ArcAppearOption) => { + const { duration, loop, oneByOne, easing } = animation; + const { disappear } = option; + const type = disappear ? 'fadeOut' : 'fadeIn'; + + return { + type, + duration, + loop, + oneByOne, + easing + }; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/style/lineStyle.ts b/packages/vstory/src/dsl/story-processor/vchart/style/lineStyle.ts new file mode 100644 index 0000000..a8c49c3 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/style/lineStyle.ts @@ -0,0 +1,40 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { getAllSeriesMarksWithoutRoot } from '../../../../util/vchart-api'; +import { isDatumEqual } from '../../../utils/datum'; +import { isValid } from '@visactor/vutils'; +import { IChartStyleAction } from '../../../types/chart/style'; + +export const lineStyleProcessor = async (chartInstance: VChart, spec: ISpec, updateStyleAction: IChartStyleAction) => { + const action = updateStyleAction as IChartStyleAction; + const { payload } = action; + + const encodeHelper = (attribute: string) => { + return (_, element) => { + if (element.data.some(d => isDatumEqual(d, action.payload.data)) && isValid(payload?.[attribute])) { + return payload[attribute]; + } + + return element.graphicItem.attribute?.[attribute]; + }; + }; + + if (chartInstance) { + const marks = getAllSeriesMarksWithoutRoot(chartInstance).filter(mark => mark.type === 'line'); + if (!marks.length) { + return; + } + + const attrs = Object.keys(action.payload); + marks.forEach(mark => { + mark.getProduct().encode( + attrs.reduce((res, attr: string) => { + res[attr] = encodeHelper(attr); + return res; + }, {}) + ); + mark.getProduct(); + }); + + chartInstance.renderSync(); + } +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/style/style.ts b/packages/vstory/src/dsl/story-processor/vchart/style/style.ts new file mode 100644 index 0000000..ad7b189 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/style/style.ts @@ -0,0 +1,41 @@ +import VChart, { ISpec } from '@visactor/vchart'; +import { getAllSeriesMarksWithoutRoot } from '../../../../util/vchart-api'; +import { isDatumEqual } from '../../../utils/datum'; +import { isValid } from '@visactor/vutils'; +import { IChartStyleAction } from '../../../types/chart/style'; + +export const createMarkStyleProcessorByMarkType = + (markType: string) => async (chartInstance: VChart, spec: ISpec, updateStyleAction: IChartStyleAction) => { + const action = updateStyleAction; + const { payload } = action; + + if (chartInstance) { + const marks = getAllSeriesMarksWithoutRoot(chartInstance)?.filter(mark => mark.type === markType); + if (!marks || !marks.length) { + return; + } + + const attrs = Object.keys(action.payload); + + const encodeHelper = (attribute: string) => { + return (datum, element) => { + if (isDatumEqual(datum, action.payload.data) && isValid(payload?.[attribute])) { + return payload[attribute]; + } + + return element.graphicItem?.attribute?.[attribute]; + }; + }; + + marks.forEach(mark => { + mark.getProduct().encode( + attrs.reduce((res, attr: string) => { + res[attr] = encodeHelper(attr); + return res; + }, {}) + ); + }); + + chartInstance.renderSync(); + } + }; diff --git a/packages/vstory/src/dsl/story-processor/vchart/title.ts b/packages/vstory/src/dsl/story-processor/vchart/title.ts new file mode 100644 index 0000000..fe1edd8 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/title.ts @@ -0,0 +1,18 @@ +import type { VChart, IChartSpec, ITitleSpec } from '@visactor/vchart'; +import { CreateTitleAction } from '../../types/CreateComponent'; + +export const createTitleProcessor = async ( + chartInstance: VChart, + spec: IChartSpec, + createTitleAction: CreateTitleAction +) => { + const { elementId, payload, data } = createTitleAction; + const title: ITitleSpec[] = (spec as any).title; + title.push({ + id: elementId, + text: data, + ...payload + }); + (spec as any).title = title; + chartInstance.updateSpecSync(spec); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/update.ts b/packages/vstory/src/dsl/story-processor/vchart/update.ts new file mode 100644 index 0000000..38a866a --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/update.ts @@ -0,0 +1,36 @@ +import VChart, { IChartSpec } from '@visactor/vchart'; +import { cloneDeep, isArray, isEqual } from '@visactor/vutils'; +import { IChartUpdateAction } from '../../types/chart/update'; +import { ICharacterVisactor } from '../../../story/character/visactor/interface'; +import { isMatch } from './utils'; + +export const updateProcessor = async ( + chartInstance: ICharacterVisactor, + spec: IChartSpec, + action: IChartUpdateAction +) => { + const chart = chartInstance.getGraphicParent(); + const vchart = chart?._vchart; + const instance: VChart = vchart ? vchart : chartInstance; + + if (!instance) { + return; + } + + const { payload } = action as IChartUpdateAction; + const { id: dataId, data } = payload; + + const rowData = cloneDeep(vchart._dataSet.getDataView(dataId).rawData); + + const items = isArray(data) ? data : [data]; + + items.forEach(item => { + const { sourceValue, targetValue } = item; + const dataIndex = rowData.findIndex(v => isMatch(v, sourceValue)); + if (dataIndex !== -1) { + rowData.splice(dataIndex, 1, targetValue); + } + }); + + await instance.updateDataSync(dataId, rowData); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/utils/index.ts b/packages/vstory/src/dsl/story-processor/vchart/utils/index.ts new file mode 100644 index 0000000..a9acab8 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/utils/index.ts @@ -0,0 +1,2 @@ +export * from './mark'; +export * from './isMatch'; diff --git a/packages/vstory/src/dsl/story-processor/vchart/utils/isMatch.ts b/packages/vstory/src/dsl/story-processor/vchart/utils/isMatch.ts new file mode 100644 index 0000000..74b003f --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/utils/isMatch.ts @@ -0,0 +1,10 @@ +export const isMatch = (obj: object, source: object) => { + for (const key in source) { + if (source.hasOwnProperty(key)) { + if (!obj.hasOwnProperty(key) || obj[key] !== source[key]) { + return false; + } + } + } + return true; +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/utils/mark.ts b/packages/vstory/src/dsl/story-processor/vchart/utils/mark.ts new file mode 100644 index 0000000..45841e1 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/utils/mark.ts @@ -0,0 +1,22 @@ +import VChart, { ISeries } from '@visactor/vchart'; + +// 获取所有系列的Marks +export const getAllSeriesMarksWithoutRoot = (instance: VChart) => { + if (!instance) { + return null; + } + const chart = instance.getChart(); + if (!chart) { + return null; + } + return chart + .getAllSeries() + .map(s => s.getMarksWithoutRoot()) + .flat(); +}; + +// 根据图元类型获取Marks +export const getAllSeriesMarksByMarkType = (instance: VChart, markType: 'rect' | 'line' | 'symbol' | 'area') => { + const marks = getAllSeriesMarksWithoutRoot(instance); + return marks.filter(m => m.type === markType); +}; diff --git a/packages/vstory/src/dsl/story-processor/vchart/utils/series.ts b/packages/vstory/src/dsl/story-processor/vchart/utils/series.ts new file mode 100644 index 0000000..2d3f4e3 --- /dev/null +++ b/packages/vstory/src/dsl/story-processor/vchart/utils/series.ts @@ -0,0 +1,16 @@ +import VChart, { ISeries } from '@visactor/vchart'; + +// 获取所有系列 +export const getAllSeries = (instance: VChart) => { + return instance.getChart().getAllSeries(); +}; + +// 获取一个系列的所有marks +export const getSeriesMarks = (series: ISeries) => { + return series.getMarksWithoutRoot(); +}; + +// 获取一个系列的所有marks +export const getSeriesMarksByMarkType = (series: ISeries, markType: string) => { + return series.getMarksWithoutRoot().filter(m => m.type === markType); +}; diff --git a/packages/vstory/src/dsl/types/Datum.ts b/packages/vstory/src/dsl/types/Datum.ts new file mode 100644 index 0000000..f9f34d7 --- /dev/null +++ b/packages/vstory/src/dsl/types/Datum.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Datum = any; diff --git a/packages/vstory/src/dsl/types/chart/add.ts b/packages/vstory/src/dsl/types/chart/add.ts new file mode 100644 index 0000000..74d9a11 --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/add.ts @@ -0,0 +1,15 @@ +import { IAction, IActionPayload } from '../index'; +import { Datum } from '../Datum'; + +export interface IChartAddPayload extends IActionPayload { + id: string | number; + values: Datum | Datum[]; + style?: { + [key: string]: number | string; + }; +} + +export interface IChartAddAction extends IAction { + action: 'add'; + payload: IChartAddPayload; +} diff --git a/packages/vstory/src/dsl/types/chart/appear.ts b/packages/vstory/src/dsl/types/chart/appear.ts new file mode 100644 index 0000000..33ea46e --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/appear.ts @@ -0,0 +1,20 @@ +import type { IAction, IAnimationParams, IActionPayload } from '../index'; + +export interface IChartAppearPayLoad extends IActionPayload { + animation: IAnimationParams & { + oneByOne: boolean; + /** + * 柱状图支持: 'grow' | 'fade' | 'bounce' + * 折线图支持: 'grow' | 'fade' + * 饼图支持: 'grow' | 'fade' | 'growAngle' | 'growRadius' + */ + effect: string; + }; +} + +export interface IChartAppearAction extends IAction { + action: 'appear'; + payload: IChartAppearPayLoad; +} + +export type AppearOption = Omit; diff --git a/packages/vstory/src/dsl/types/chart/createComponent.ts b/packages/vstory/src/dsl/types/chart/createComponent.ts new file mode 100644 index 0000000..aed2bbb --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/createComponent.ts @@ -0,0 +1,37 @@ +import type { IChartSpec, IMarkPointSpec, VChart } from '@visactor/vchart'; +import { Datum } from '../Datum'; + +export interface CreateComponentAction { + action: Action; + elementId: number; + payload?: PayLoad; + callback?: (chartInstance: VChart, spec: IChartSpec, snapshot: CreateComponentAction) => void; +} + +export interface CreateMarkPointAction + extends CreateComponentAction< + 'createMarkPoint', + { + itemContent?: IMarkPointSpec['itemContent']; + itemLine?: IMarkPointSpec['itemLine']; + animation?: { + duration: number; + easing: string; + }; + } + > { + data: Datum; +} + +export interface CreateTitleAction + extends CreateComponentAction< + 'createTitle', + { + animation?: { + duration: number; + easing: string; + }; + } + > { + data: Datum; +} diff --git a/packages/vstory/src/dsl/types/chart/index.ts b/packages/vstory/src/dsl/types/chart/index.ts new file mode 100644 index 0000000..5e33d6f --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/index.ts @@ -0,0 +1,14 @@ +import type { IChartSpec, IVChart } from '@visactor/vchart'; +import type { IActionContext } from '..'; +import type { IChartAddAction } from './add'; +import type { IChartAppearAction } from './appear'; +import type { IChartStyleAction } from './style'; +import type { IBounceAction } from '../common/bounce'; + +export type ChartAction = IChartAddAction | IChartStyleAction | IChartAppearAction | IBounceAction; + +export interface IChartActionContext extends IActionContext { + callback?: (chartInstance: IVChart, spec: IChartSpec, action: ChartAction) => void; +} + +export type ChartActionNode = ChartAction & IChartActionContext; diff --git a/packages/vstory/src/dsl/types/chart/style.ts b/packages/vstory/src/dsl/types/chart/style.ts new file mode 100644 index 0000000..edf0a07 --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/style.ts @@ -0,0 +1,12 @@ +import { Datum } from '../Datum'; +import { IAction, IActionPayload } from '../index'; + +export interface IChartStylePayload extends IActionPayload { + data: Datum; + [key: string]: any; +} + +export interface IChartStyleAction extends IAction { + action: 'style'; + payload: IChartStylePayload; +} diff --git a/packages/vstory/src/dsl/types/chart/update.ts b/packages/vstory/src/dsl/types/chart/update.ts new file mode 100644 index 0000000..c3754db --- /dev/null +++ b/packages/vstory/src/dsl/types/chart/update.ts @@ -0,0 +1,15 @@ +import type { IAction, IActionPayload } from '../index'; +import type { Datum } from '../Datum'; + +export interface IChartUpdatePayload extends IActionPayload { + data: Array<{ + sourceValue: Datum; + targetValue: Datum; + }>; + id: string | number; +} + +export interface IChartUpdateAction extends IAction { + action: 'update'; + payload: IChartUpdatePayload; +} diff --git a/packages/vstory/src/dsl/types/common/bounce.ts b/packages/vstory/src/dsl/types/common/bounce.ts new file mode 100644 index 0000000..ff451e0 --- /dev/null +++ b/packages/vstory/src/dsl/types/common/bounce.ts @@ -0,0 +1,22 @@ +import type { IAction, IActionPayload } from '../index'; +import type { IAnimationParams } from './index'; + +export interface IBounceParams extends IAnimationParams { + /** + * 自定义弹跳 easing + */ + customEase?: (ratio: number) => number; + /** + * 跳跃高度 + */ + dy?: number; +} + +export interface IBouncePayload extends IActionPayload { + animation: IBounceParams; +} + +export interface IBounceAction extends IAction { + action: 'bounce'; + payload: IBouncePayload; +} diff --git a/packages/vstory/src/dsl/types/common/brighten.ts b/packages/vstory/src/dsl/types/common/brighten.ts new file mode 100644 index 0000000..8e33f7d --- /dev/null +++ b/packages/vstory/src/dsl/types/common/brighten.ts @@ -0,0 +1,18 @@ +import type { IAction, IActionPayload } from '../index'; +import type { IAnimationParams } from './index'; + +export interface IBrightenParams extends IAnimationParams { + /** + * @default 1.2 + */ + ratio?: number; +} + +export interface IBrightenPayload extends IActionPayload { + animation: IBrightenParams; +} + +export interface IBrightenAction extends IAction { + action: 'brighten'; + payload: IBrightenPayload; +} diff --git a/packages/vstory/src/dsl/types/common/darken.ts b/packages/vstory/src/dsl/types/common/darken.ts new file mode 100644 index 0000000..11f91b4 --- /dev/null +++ b/packages/vstory/src/dsl/types/common/darken.ts @@ -0,0 +1,18 @@ +import type { IAction, IActionPayload } from '../index'; +import type { IAnimationParams } from './index'; + +export interface IDarkenParams extends IAnimationParams { + /** + * @default 0.8 + */ + ratio?: number; +} + +export interface IDarkenPayload extends IActionPayload { + animation: IDarkenParams; +} + +export interface IDarkenAction extends IAction { + action: 'darken'; + payload: IDarkenPayload; +} diff --git a/packages/vstory/src/dsl/types/common/flicker.ts b/packages/vstory/src/dsl/types/common/flicker.ts new file mode 100644 index 0000000..52e4c4f --- /dev/null +++ b/packages/vstory/src/dsl/types/common/flicker.ts @@ -0,0 +1,15 @@ +import type { IAction, IActionPayload } from '../index'; +import type { IAnimationParams } from './index'; + +export interface IFlickerParams extends IAnimationParams { + frequency?: number; +} + +export interface IFlickerPayload extends IActionPayload { + animation: IFlickerParams; +} + +export interface IFlickerAction extends IAction { + action: 'flicker'; + payload: IFlickerPayload; +} diff --git a/packages/vstory/src/dsl/types/common/index.ts b/packages/vstory/src/dsl/types/common/index.ts new file mode 100644 index 0000000..6652568 --- /dev/null +++ b/packages/vstory/src/dsl/types/common/index.ts @@ -0,0 +1,7 @@ +export interface IAnimationParams { + duration: number; + easing?: string; + loop?: number | boolean; +} + +export * from './Flicker'; diff --git a/packages/vstory/src/dsl/types/common/moveTo.ts b/packages/vstory/src/dsl/types/common/moveTo.ts new file mode 100644 index 0000000..f3f9ae1 --- /dev/null +++ b/packages/vstory/src/dsl/types/common/moveTo.ts @@ -0,0 +1,8 @@ +import type { IAction, IActionPayload } from '../index'; + +// TODO: 后续可以增加参数 path: 指定移动的方式或路径类型,例如直线移动、曲线移动等。 +export interface IMoveToAction extends IAction { + action: 'moveTo'; + destination: { x: number; y: number }; + payload: IActionPayload; +} diff --git a/packages/vstory/src/dsl/types/graphic/appear.ts b/packages/vstory/src/dsl/types/graphic/appear.ts new file mode 100644 index 0000000..eb536ea --- /dev/null +++ b/packages/vstory/src/dsl/types/graphic/appear.ts @@ -0,0 +1,40 @@ +import type { IAction, IAnimationParams, IActionPayload } from '../index'; + +export interface IGraphicAppearPayLoad extends IActionPayload { + animation: Omit & { + effect?: string; // TODO: 枚举类型 + + /** + * 渐变行为 + */ + fade?: { + opacity?: number; + }; + + /** + * 缩放行为 + */ + scale?: { + ratio?: number; + }; + + /** + * 旋转行为 + */ + rotate?: { + angle?: number; + }; + + /** + * 移动行为 + */ + move?: { + from?: 'top' | 'right' | 'bottom' | 'left'; + }; + }; +} + +export interface IGraphicAppearAction extends IAction { + action: 'appear'; + payload: IGraphicAppearPayLoad; +} diff --git a/packages/vstory/src/dsl/types/graphic/disappear.ts b/packages/vstory/src/dsl/types/graphic/disappear.ts new file mode 100644 index 0000000..5e56351 --- /dev/null +++ b/packages/vstory/src/dsl/types/graphic/disappear.ts @@ -0,0 +1,40 @@ +import type { IAction, IAnimationParams, IActionPayload } from '../index'; + +export interface IGraphicDisappearPayLoad extends IActionPayload { + animation: Omit & { + effect: string; // TODO: 枚举类型 + + /** + * 渐变行为 + */ + fade?: { + opacity?: number; + }; + + /** + * 缩放行为 + */ + scale?: { + ratio?: number; + }; + + /** + * 旋转行为 + */ + rotate?: { + angle?: number; + }; + + /** + * 移动行为 + */ + move?: { + to?: 'top' | 'right' | 'bottom' | 'left'; + }; + }; +} + +export interface IGraphicDisappearAction extends IAction { + action: 'disappear'; + payload: IGraphicDisappearPayLoad; +} diff --git a/packages/vstory/src/dsl/types/graphic/index.ts b/packages/vstory/src/dsl/types/graphic/index.ts new file mode 100644 index 0000000..31d064f --- /dev/null +++ b/packages/vstory/src/dsl/types/graphic/index.ts @@ -0,0 +1,20 @@ +import type { IActionContext } from '..'; +import type { IFlickerAction } from '../common'; +import type { IBrightenAction } from '../common/brighten'; +import type { IDarkenAction } from '../common/darken'; +import type { IMoveToAction } from '../common/moveTo'; +import type { IGraphicAppearAction } from './appear'; +import type { IGraphicDisappearAction } from './disappear'; + +import type { IGraphicStyleAction } from './style'; + +export type GraphicAction = + | IFlickerAction + | IBrightenAction + | IDarkenAction + | IMoveToAction + | IGraphicAppearAction + | IGraphicDisappearAction + | IGraphicStyleAction; + +export type GraphicActonNode = GraphicAction & IActionContext; diff --git a/packages/vstory/src/dsl/types/graphic/style.ts b/packages/vstory/src/dsl/types/graphic/style.ts new file mode 100644 index 0000000..53f805e --- /dev/null +++ b/packages/vstory/src/dsl/types/graphic/style.ts @@ -0,0 +1,11 @@ +import { IAction, IActionPayload } from '../index'; + +export interface IGraphicStylePayload extends IActionPayload { + graphic?: Record; + text?: Record; +} + +export interface IGraphicStyleAction extends IAction { + action: 'style'; + payload: IGraphicStylePayload; +} diff --git a/packages/vstory/src/dsl/types/index.ts b/packages/vstory/src/dsl/types/index.ts new file mode 100644 index 0000000..8798971 --- /dev/null +++ b/packages/vstory/src/dsl/types/index.ts @@ -0,0 +1,26 @@ +import type { ChartAction, ChartActionNode } from './chart/index'; +import type { IAnimationParams } from './common'; +import type { GraphicAction, GraphicActonNode } from './graphic'; + +export interface IActionContext { + elementType?: string; + elementId?: number; + callback?: (...args: any[]) => void; +} + +export interface IActionPayload { + animation?: IAnimationParams; +} + +export interface IAction { + action: string; + payload: Record; +} + +export type Action = ChartAction | GraphicAction; + +export type ActionNode = ChartActionNode | GraphicActonNode; + +export * from './common'; +export * from './chart'; +export * from './graphic'; diff --git a/packages/vstory/src/dsl/utils/datum.ts b/packages/vstory/src/dsl/utils/datum.ts new file mode 100644 index 0000000..4a54ae1 --- /dev/null +++ b/packages/vstory/src/dsl/utils/datum.ts @@ -0,0 +1,18 @@ +import { isArray } from '@visactor/vutils'; + +export const isDatumEqual = (source, target) => { + const sourceData = isArray(source) ? source : [source]; + const targetData = target; + + const compareOne = (s, t) => { + const sKeys = Object.keys(s); + const tKeys = Object.keys(t); + + // 找到source中所有在t中存在的key + const keys = sKeys.filter(k => tKeys.includes(k)); + + return keys.every(key => s[key] === t[key]); + }; + + return sourceData.some(s => compareOne(s, targetData)); +}; diff --git a/packages/vstory/src/dsl/utils/flicker.ts b/packages/vstory/src/dsl/utils/flicker.ts new file mode 100644 index 0000000..6058330 --- /dev/null +++ b/packages/vstory/src/dsl/utils/flicker.ts @@ -0,0 +1,14 @@ +import type { IGroup, IGraphic } from '@visactor/vrender-core'; + +export const flickerEffect = (group: IGroup) => { + if (!group || group.childrenCount === 0) { + return; + } + // TODO: + // 1. 支持闪烁快慢,即 duration + // 2. 支持闪烁次数 + group.forEachChildren(child => { + // FIXME: loop 次数不正确 + (child as IGraphic).animate().to({ opacity: 0 }, 120, 'linear').to({ opacity: 1 }, 120, 'linear').loop(1); + }); +}; diff --git a/packages/vstory/src/edit/const.ts b/packages/vstory/src/edit/const.ts new file mode 100644 index 0000000..b4caaca --- /dev/null +++ b/packages/vstory/src/edit/const.ts @@ -0,0 +1,5 @@ +export const PickEventType = { + pointerup: true, + click: true, + dblclick: true +}; diff --git a/packages/vstory/src/edit/edit-action.ts b/packages/vstory/src/edit/edit-action.ts new file mode 100644 index 0000000..4b92bdc --- /dev/null +++ b/packages/vstory/src/edit/edit-action.ts @@ -0,0 +1,49 @@ +import { BoxSelection } from './edit-component/box-selection'; +import { EventEmitter } from '@visactor/vutils'; +import { PickEventType } from './const'; +import { Story } from '../story/story'; +import { ContinuousActionType, EditActionEnum, IEditActionInfo } from './interface'; +import { StoryEvent } from '../story/interface/runtime-interface'; + +export class EditAction { + readonly emitter: EventEmitter = new EventEmitter(); + + protected _actionInProgress: ContinuousActionType = null; + get actionInProgress() { + return this._actionInProgress; + } + + protected _boxSelection: BoxSelection; + + constructor(public readonly story: Story) {} + + onStoryEvent(event: StoryEvent, type: string) { + // TODO: hack detailPath会被正常删除后,删除这个hack代码 + if (event.detailPath) { + if (event.path[event.path.length - 1] !== event.detailPath[event.path.length - 1]) { + delete event.detailPath; + } + } + // 非选中逻辑 + if (!PickEventType[type]) { + return this.dispatchAction({ + type: type, + event + }); + } + + // 选中逻辑才添加交互元素信息。得到交互元素 + const { characterInfo, character } = this.story.canvas.getEventDetail(event); + return this.dispatchAction({ + type: type === 'click' && character ? EditActionEnum.singleSelection : type, + characterId: character?.id, + character: character, + event, + detail: characterInfo + }); + } + + dispatchAction(action: IEditActionInfo) { + this.emitter.emit('dispatchAction', action); + } +} diff --git a/packages/vstory/src/edit/edit-component/box-selection.ts b/packages/vstory/src/edit/edit-component/box-selection.ts new file mode 100644 index 0000000..b5459a9 --- /dev/null +++ b/packages/vstory/src/edit/edit-component/box-selection.ts @@ -0,0 +1,44 @@ +import { IEditActionInfo, IEditComponent } from './../interface'; +import { StoryEvent } from '../../story/interface/runtime-interface'; +import { Edit } from '../edit'; + +export class BoxSelection implements IEditComponent { + readonly level = 1; + + protected _actionInfo: IEditActionInfo; + protected _isSelection = false; + + constructor(public readonly edit: Edit) {} + editEnd(): void {} + checkAction(actionInfo: IEditActionInfo): boolean { + if (this._isSelection) { + if (actionInfo.type === 'pointerup') { + // 这一次框选逻辑已经结束了。它只产生框选结果 + this.edit.stopEdit(); + // 需要触发新一次的选中 action ,可以对框选结果进行操作 + this.edit.editAction.dispatchAction({ + type: 'multiSelection', + characterId: [], // TODO:框选逻辑等待补充 + event: actionInfo.event + }); + } else { + // 其他情况下认为继续框选 + return true; + } + return true; + } + if (actionInfo.type === 'pointerdown') return true; + return false; + } + + startEdit(actionInfo: IEditActionInfo) { + this._actionInfo = actionInfo; + this.edit.startEdit({ + type: 'boxSelection', + actionInfo: this._actionInfo, + updateCharacter: (params: {}) => { + // nothing 不支持任何修改 + } + }); + } +} diff --git a/packages/vstory/src/edit/edit-component/common.ts b/packages/vstory/src/edit/edit-component/common.ts new file mode 100644 index 0000000..b05f614 --- /dev/null +++ b/packages/vstory/src/edit/edit-component/common.ts @@ -0,0 +1,31 @@ +import { EditActionEnum, IEditComponent, IEditSelectionInfo } from './../interface'; +import { Edit } from '../edit'; + +export class CommonEditComponent implements IEditComponent { + readonly level = 2; + protected _actionInfo: IEditSelectionInfo; + + constructor(public readonly edit: Edit) {} + editEnd(): void {} + checkAction(actionInfo: IEditSelectionInfo): boolean { + if (actionInfo.type !== EditActionEnum.singleSelection) { + return false; + } + if (!actionInfo.detail) { + return false; + } + this.startEdit(actionInfo); + return true; + } + + startEdit(actionInfo: IEditSelectionInfo) { + this._actionInfo = actionInfo; + this.edit.startEdit({ + type: 'commonEdit', + actionInfo: this._actionInfo, + updateCharacter: (params: {}) => { + this._actionInfo.character.updateSpec(params); + } + }); + } +} diff --git a/packages/vstory/src/edit/edit-component/layer-edit.ts b/packages/vstory/src/edit/edit-component/layer-edit.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/vstory/src/edit/edit.ts b/packages/vstory/src/edit/edit.ts new file mode 100644 index 0000000..5b58e92 --- /dev/null +++ b/packages/vstory/src/edit/edit.ts @@ -0,0 +1,77 @@ +import { StoryEvent } from '../story/interface/runtime-interface'; +import { Story } from './../story/story'; +import { EditAction } from './edit-action'; +import { EventEmitter } from '@visactor/vutils'; +import { IEditActionInfo, IEditComponent, IEditComponentConstructor, IEditMessage } from './interface'; + +export class Edit { + readonly editAction: EditAction; + readonly emitter: EventEmitter; + + protected static componentConstructorMap: { [key: string]: IEditComponentConstructor } = {}; + + static registerEditComponent(key: string, cpt: IEditComponentConstructor) { + Edit.componentConstructorMap[key] = cpt; + } + + protected _componentMap: { [key: string]: IEditComponent } = {}; + protected _componentList: IEditComponent[]; + + protected _currentComponent: IEditComponent; + + constructor(public readonly story: Story) { + this.emitter = new EventEmitter(); + this.editAction = new EditAction(story); + this.editAction.emitter.on('dispatchAction', this.onAction.bind(this)); + this.story.canvas.getStage().addEventListener('*', this.onStoryEvent.bind(this) as any); + this._initComponent(); + } + + protected _initComponent() { + this._componentMap = {}; + Object.keys(Edit.componentConstructorMap).forEach(key => { + this._componentMap[key] = new Edit.componentConstructorMap[key](this); + }); + this._componentList = Object.values(this._componentMap) + .sort((a, b) => a.level - b.level) + .reverse(); + } + + onStoryEvent(event: StoryEvent, type: string) { + this.editAction.onStoryEvent(event, type); + } + + onAction(actionInfo: IEditActionInfo) { + if (this._currentComponent) { + // 优先上一次的编辑组件 + if (this._currentComponent.checkAction(actionInfo)) { + return; + } + } + for (let i = 0; i < this._componentList.length; i++) { + const cpt = this._componentList[i]; + if (cpt.checkAction(actionInfo)) { + this.stopEdit(); + this._currentComponent = cpt; + return; + } + } + } + + startEdit(msg: IEditMessage) { + this.emitter.emit('startEdit', msg); + } + + triggerEditWithEvent(event: StoryEvent) {} + + triggerEditWithComponent(type: string, actionInfo: IEditActionInfo) {} + + stopEdit() { + this._currentComponent?.editEnd(); + this._currentComponent = null; + } + + release() { + this.story.canvas?.getStage?.().removeEventListener('*', this.onStoryEvent as any); + } +} diff --git a/packages/vstory/src/edit/interface.ts b/packages/vstory/src/edit/interface.ts new file mode 100644 index 0000000..fbf9c8a --- /dev/null +++ b/packages/vstory/src/edit/interface.ts @@ -0,0 +1,49 @@ +import { Edit } from './edit'; +import { ICharacter, ICharacterPickInfo } from './../story/character/runtime-interface'; +export enum EditActionEnum { + singleSelection = 'singleSelect', // 单选 + multipleSelection = 'multipleSelect' // 多选 +} + +export interface IEditSelectionDetailChart extends ICharacterPickInfo { + model: string; + mark: any; + datum: any; +} + +export type IEditSelectionDetailComponent = ICharacterPickInfo; + +export interface IEditSelectionInfo extends IEditActionInfoBase { + characterId?: string | string[]; + character?: ICharacter; + detail: IEditSelectionDetailChart | IEditSelectionDetailComponent; +} + +export interface IEditActionInfoBase { + type: keyof typeof EditActionEnum | string; + event: Event; +} + +export type IEditActionInfo = IEditActionInfoBase | IEditSelectionInfo; + +export type ContinuousActionType = 'boxSelection' | 'layerZoom' | 'layerMove'; + +export interface IEditComponent { + readonly level: number; + + // 是否 开始/继续 编辑 返回false的话,会导致当前编辑结束 + checkAction(actionInfo: IEditActionInfo): boolean; + + // 编辑结束 + editEnd(): void; +} + +export interface IEditComponentConstructor { + new (edit: Edit): IEditComponent; +} + +export interface IEditMessage { + type: string; // 编辑组件类型, + actionInfo: IEditActionInfo; + updateCharacter: (updateParams: any) => void; +} diff --git a/packages/vstory/src/index.ts b/packages/vstory/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/vstory/src/interface/type.ts b/packages/vstory/src/interface/type.ts new file mode 100644 index 0000000..61278f4 --- /dev/null +++ b/packages/vstory/src/interface/type.ts @@ -0,0 +1,9 @@ +import type { IStage } from '@visactor/vrender-core'; + +export type IContext = { + dom: string | HTMLElement; + width: number; + height: number; + stage: IStage; + canvas: HTMLCanvasElement; +}; diff --git a/packages/vstory/src/scene/action.ts b/packages/vstory/src/scene/action.ts new file mode 100644 index 0000000..5bf0c6d --- /dev/null +++ b/packages/vstory/src/scene/action.ts @@ -0,0 +1,67 @@ +import { IContext } from '../interface/type'; +import { AbstractTask, TaskCb } from '../task'; + +export class Action extends AbstractTask { + type = 'action'; + + protected _entity: any; + protected _action: (entity: any, context?: Partial) => void; + + protected _isResolved = false; + + constructor(entity: any, add: (entity: any, context?: Partial) => void) { + super(); + this._entity = entity; + this._action = add; + } + + run(context?: Partial) { + if (this._entity && this._action) { + this._action(this._entity, context); + this._isResolved = true; + } + } + + runCb(cb: TaskCb): void { + const intervalId = setInterval(() => { + if (this._isResolved) { + clearInterval(intervalId); + cb(); + } + }); + } +} + +export class Wait extends AbstractTask { + type = 'wait'; + + protected _duration: number; + + protected _waiting = true; + protected _playing = false; + + constructor(duration: number) { + super(); + this._duration = duration; + } + + run() { + if (this._duration > 0 && !this._playing) { + new Promise(resolve => { + setTimeout(() => { + this._waiting = false; + }, this._duration); + }); + this._playing = true; + } + } + + runCb(cb: TaskCb): void { + const intervalId = setInterval(() => { + if (!this._waiting) { + clearInterval(intervalId); + cb(); + } + }); + } +} diff --git a/packages/vstory/src/scene/index.ts b/packages/vstory/src/scene/index.ts new file mode 100644 index 0000000..15df9a6 --- /dev/null +++ b/packages/vstory/src/scene/index.ts @@ -0,0 +1 @@ +export * from './scene'; diff --git a/packages/vstory/src/scene/scene.ts b/packages/vstory/src/scene/scene.ts new file mode 100644 index 0000000..cb0069d --- /dev/null +++ b/packages/vstory/src/scene/scene.ts @@ -0,0 +1,129 @@ +import type { IContext } from 'src/interface/type'; +import { Template } from '../template/base-template'; +import { INode, IStage, container, createStage, preLoadAllModule } from '@visactor/vrender-core'; +import { calculateSize } from '../util/size'; +import { CreateUID } from '../util/common'; +import { loadBrowserEnv } from '@visactor/vrender-kits'; +import { AbstractComponent } from '@visactor/vrender-components'; +import { ITask, TaskManager } from '../task'; +import { Action, Wait } from './action'; + +export class Scene { + readonly id = CreateUID(); + + protected template: Template; + + protected _stage: IStage; + + protected _container: HTMLElement; + + protected _canvas: HTMLCanvasElement; + + protected _context: IContext; + + private _taskManager = new TaskManager(); + + constructor(options: any = {}) { + const { dom, width, height } = options; + if (document) { + this._container = document.getElementById(dom) as HTMLCanvasElement; + } + if (!this._container) { + throw Error('Container Not Found'); + } + + const { width: _width, height: _height } = calculateSize(this._container, { width, height }); + + const canvas = document.createElement('canvas'); + canvas.width = _width * window.devicePixelRatio; + canvas.height = _height * window.devicePixelRatio; + canvas.style.width = _width + 'px'; + canvas.style.height = _height + 'px'; + + canvas.id = `_story_chart_${this.id}_canvas`; + this._canvas = canvas; + this._container.append(canvas); + + const stage = this._initStage(_width, _height); + this._stage = stage; + + this._context = { + dom: this._container, + canvas: this._canvas, + width: _width, + height: _height, + stage + }; + this._taskManager.setContext(this._context); + } + + protected _initStage(width: number, height: number) { + preLoadAllModule(); + loadBrowserEnv(container); + const params = { + width: width, + height: height, + disableDirtyBounds: true, + autoRender: true, + canvas: this._canvas, + canvasControled: true, + dpr: window.devicePixelRatio + }; + return createStage(params) as unknown as IStage; + } + + add(entity: Template | AbstractComponent) { + let task: ITask; + if (entity instanceof Template) { + this.template = entity; + task = new Action(entity, (entity: any) => { + entity.render(this._context); + }); + } else if (entity instanceof AbstractComponent && this._stage) { + task = new Action(entity, (entity: any) => { + this._stage.defaultLayer.add(entity as unknown as INode); + }); + } + + if (task) { + this._taskManager.next(task); + } + + return this; + } + + remove(entity: Template | AbstractComponent) { + let task: ITask; + if (entity instanceof Template) { + this.template = entity; + task = new Action(entity, (entity: any) => { + entity.release(); + }); + } else if (entity instanceof AbstractComponent && this._stage) { + task = new Action(entity, (entity: any) => { + this._stage.defaultLayer.removeChild(entity as unknown as INode); + }); + } + + if (task) { + this._taskManager.next(task); + } + + return this; + } + + wait(duration: number) { + if (duration > 0) { + const wait = new Wait(duration); + this._taskManager.next(wait); + } + } + + play(animate: ITask) { + if (animate) { + this._taskManager.next(animate); + } + } + + release() {} +} diff --git a/packages/vstory/src/story/act/act.ts b/packages/vstory/src/story/act/act.ts new file mode 100644 index 0000000..de3b214 --- /dev/null +++ b/packages/vstory/src/story/act/act.ts @@ -0,0 +1,3 @@ +export class Chapter { + // 也许并不需要 +} diff --git a/packages/vstory/src/story/canvas/canvas.ts b/packages/vstory/src/story/canvas/canvas.ts new file mode 100644 index 0000000..61af06a --- /dev/null +++ b/packages/vstory/src/story/canvas/canvas.ts @@ -0,0 +1,86 @@ +import { Story } from '../story'; +import { IStage, createStage, vglobal, container, preLoadAllModule, ManualTicker } from '@visactor/vrender-core'; +import { loadBrowserEnv } from '@visactor/vrender-kits'; +import { manualTicker } from '../player/ticker'; +import { StoryEvent } from '../interface/runtime-interface'; +import { ICharacter } from '../character/runtime-interface'; + +preLoadAllModule(); +loadBrowserEnv(container); +vglobal.setEnv('browser'); + +export class StoryCanvas { + protected _story: Story; + protected _canvas: HTMLCanvasElement; + protected _stage: IStage; + getStage() { + return this._stage; + } + + getCanvas() { + return this._canvas; + } + + protected _container: HTMLDivElement; + get container() { + return this._container; + } + + constructor(story: Story, container: HTMLDivElement) { + this._story = story; + this._container = container; + this._initCanvas(); + } + + protected _initCanvas() { + const canvas = document.createElement('canvas'); + canvas.width = this._container.clientWidth * window.devicePixelRatio; + canvas.height = this._container.clientHeight * window.devicePixelRatio; + canvas.style.width = this._container.clientWidth + 'px'; + canvas.style.height = this._container.clientHeight + 'px'; + canvas.style.position = 'absolute'; + canvas.id = `_visactor_story_canvas_${this._story.id}`; + this._container.appendChild(canvas); + this._canvas = canvas; + const stage = createStage({ + canvas: this._canvas, + width: this._canvas.clientWidth, + height: this._canvas.clientHeight, + canvasControled: true, + autoRender: false, + disableDirtyBounds: true, + ticker: manualTicker, + dpr: window.devicePixelRatio, + event: { + clickInterval: 300 + } + }); + // @ts-ignore + this._stage = stage; + stage.on('*', (e, type) => { + type === 'click' && console.log('canvas', e); + }); + } + + public getEventDetail(event: StoryEvent) { + // 得到交互元素的详细信息 + const characterMap = this._story.getCharacters(); + let characterInfo; + let character: ICharacter; + Object.keys(this._story.getCharacters()).find(id => { + const characterTemp = characterMap[id]; + const info = characterTemp.checkEvent(event); + if (info) { + characterInfo = info; + character = characterTemp; + return true; + } + return false; + }); + + return { + character, + characterInfo + }; + } +} diff --git a/packages/vstory/src/story/character/base/base.ts b/packages/vstory/src/story/character/base/base.ts new file mode 100644 index 0000000..0f5e516 --- /dev/null +++ b/packages/vstory/src/story/character/base/base.ts @@ -0,0 +1,65 @@ +import { isValid, merge } from '@visactor/vutils'; +import { ICharacterInitOption, ICharacterPickInfo } from '../runtime-interface'; +import { ICharacter, ICharacterSpec } from '..'; +import { IGroup } from '@visactor/vrender-core'; +import { StoryEvent } from '../../interface'; + +export abstract class CharacterBase implements ICharacter { + readonly id: string; + protected _spec: ICharacterSpec; + get spec() { + return this._spec; + } + + protected _option: ICharacterInitOption; + get option() { + return this._option; + } + + constructor(spec: ICharacterSpec, option: ICharacterInitOption) { + this.id = spec.id; + this._spec = spec; + this._option = option; + } + updateSpec(spec: Omit, 'id' | 'type'>): void { + if (spec.position) { + this._spec.position = spec.position; + } + if (isValid(spec.zIndex)) { + this._spec.zIndex = spec.zIndex; + } + if (spec.options) { + this._spec.options = merge(this._spec.options ?? {}, spec.options); + } + } + + tickTo(t: number): void { + throw new Error('Method not implemented.'); + } + + public init() { + this._initRuntime(); + this._parserSpec(); + this._initGraphics(); + } + + public reset() { + this.clearCharacter(); + this.init(); + } + + protected abstract _initRuntime(): void; + protected abstract _parserSpec(): void; + protected abstract _initGraphics(): void; + + abstract show(): void; + abstract hide(): void; + + public getPositionData() {} + + public abstract getGraphicParent(): IGroup; + + public abstract clearCharacter(): void; + + public abstract checkEvent(event: StoryEvent): false | ICharacterPickInfo; +} diff --git a/packages/vstory/src/story/character/chart/character.ts b/packages/vstory/src/story/character/chart/character.ts new file mode 100644 index 0000000..f0ef4ef --- /dev/null +++ b/packages/vstory/src/story/character/chart/character.ts @@ -0,0 +1,131 @@ +import { CommonSpecRuntime } from './runtime/common-spec'; +import { ComponentSpecRuntime } from './runtime/component-spec'; +import { IChartCharacterRuntimeConstructor } from './runtime/interface'; +import { cloneDeep } from '@visactor/vutils'; +import { VChart } from '@visactor/vchart'; +import { IChartCharacterSpec } from '../dsl-interface'; +import { Chart } from './graphic/vchart-graphic'; +import { getLayoutFromWidget } from '../../utils/layout'; +import { CharacterVisactor } from '../visactor/character'; +import { SpecProcess } from './spec-process/spec-process'; +import { ChartDataTempTransform } from './spec-process/data-temp-transform'; +import { ITicker } from '@visactor/vrender-core'; +import { manualTicker } from '../../player/ticker'; +import { IChartTemp } from './temp/interface'; +import { SeriesSpecRuntime } from './runtime/series-spec'; +import { StoryEvent } from '../../interface/runtime-interface'; +import { ICharacterPickInfo } from '../runtime-interface'; + +const tempSpec = { + type: 'bar', + data: [ + { + id: 'barData', + values: [ + { month: 'Monday', sales: 22 }, + { month: 'Tuesday', sales: 13 }, + { month: 'Wednesday', sales: 25 }, + { month: 'Thursday', sales: 29 }, + { month: 'Friday', sales: 38 } + ] + } + ], + xField: 'month', + yField: 'sales', + axes: [{ orient: 'bottom', label: { visible: false } }] +}; + +export class CharacterChart extends CharacterVisactor { + static type = 'CharacterChart'; + static RunTime: IChartCharacterRuntimeConstructor[] = [ + ComponentSpecRuntime as unknown as IChartCharacterRuntimeConstructor, + CommonSpecRuntime as unknown as IChartCharacterRuntimeConstructor, + SeriesSpecRuntime as unknown as IChartCharacterRuntimeConstructor + ]; + + protected declare _specProcess: SpecProcess; + protected _ticker: ITicker; + + protected declare _spec: IChartCharacterSpec; + get spec() { + return this._spec; + } + + protected _initSpecProcess(): void { + this._specProcess = new SpecProcess(this as any, ChartDataTempTransform, this.onSpecReady); + } + + protected _initRuntime(): void { + CharacterChart.RunTime.forEach(R => { + this._runtime.push(new R(this)); + }); + } + + protected _parserSpec(): void { + this._specProcess.updateConfig(this._spec); + } + protected _initGraphics(): void { + // this._ticker = new ManualTicker([]); + const layout = getLayoutFromWidget(this._spec.position); + const viewBox = { + x1: layout.x, + x2: layout.x + layout.width, + y1: layout.y, + y2: layout.y + layout.height + }; + const spec = cloneDeep(this._specProcess.getVisSpec() ?? this._spec.options.spec); + spec.width = layout.width; + spec.height = layout.height; + // @ts-ignore + this._graphic = new Chart({ + renderCanvas: this._option.canvas.getCanvas(), + spec: spec, + ClassType: VChart, + vchart: null, + mode: 'desktop-browser', + dpr: window.devicePixelRatio, + interactive: false, + autoRender: false, + disableDirtyBounds: true, + viewBox, + ticker: manualTicker, + visibleAll: false, + ...(this._spec.options.panel ?? {}), + chartInitOptions: { + animation: true, + disableTriggerEvent: true, + performanceHook: { + afterInitializeChart: () => { + (this.specProcess.dataTempTransform?.specTemp)?.afterInitializeChart({ character: this }); + this._runtime.forEach(r => r.afterInitializeChart?.()); + }, + afterVRenderDraw: () => { + this._runtime.forEach(r => r.afterVRenderDraw?.()); + } + } + } + }); + this.option.graphicParent.add(this._graphic as any); + } + + protected _afterRender(): void { + console.log('afterRender'); + } + protected _updateVisactorSpec(): void { + console.log('_updateVisactorSpec', this._specProcess.getVisSpec()); + this._graphic?.updateSpec(this._specProcess.getVisSpec()); + } + + public clearCharacter(): void { + this._graphic.vProduct.release(); + this._graphic.parent.removeChild(this._graphic); + } + + tickTo(t: number): void { + this._ticker.tickAt(t); + } + + public checkEvent(event: StoryEvent): false | ICharacterPickInfo { + return false; + } +} diff --git a/packages/vstory/src/story/character/chart/characters/area.ts b/packages/vstory/src/story/character/chart/characters/area.ts new file mode 100644 index 0000000..a1c2d44 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/area.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { AreaTemp } from '../temp/templates/area'; + +StoryFactory.registerChartTemp(AreaTemp.type, AreaTemp); + +export class AreaChartCharacter extends CharacterChart { + static type = 'AreaChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/bar.ts b/packages/vstory/src/story/character/chart/characters/bar.ts new file mode 100644 index 0000000..124b9ab --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/bar.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { BarTemp } from '../temp/templates/bar'; + +StoryFactory.registerChartTemp(BarTemp.type, BarTemp); + +export class BarChartCharacter extends CharacterChart { + static type = 'BarChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/line.ts b/packages/vstory/src/story/character/chart/characters/line.ts new file mode 100644 index 0000000..809357f --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/line.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { LineTemp } from '../temp/templates/line'; + +StoryFactory.registerChartTemp(LineTemp.type, LineTemp); + +export class LineChartCharacter extends CharacterChart { + static type = 'LineChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/pie.ts b/packages/vstory/src/story/character/chart/characters/pie.ts new file mode 100644 index 0000000..6ce0d72 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/pie.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { PieTemp } from '../temp/templates/pie'; + +StoryFactory.registerChartTemp(PieTemp.type, PieTemp); + +export class PieChartCharacter extends CharacterChart { + static type = 'PieChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/radar.ts b/packages/vstory/src/story/character/chart/characters/radar.ts new file mode 100644 index 0000000..0c970b9 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/radar.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { RadarTemp } from '../temp/templates/radar'; + +StoryFactory.registerChartTemp(RadarTemp.type, RadarTemp); + +export class RadarChartCharacter extends CharacterChart { + static type = 'RadarChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/rangeColumn.ts b/packages/vstory/src/story/character/chart/characters/rangeColumn.ts new file mode 100644 index 0000000..977bb17 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/rangeColumn.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { RangeColumnTemp } from '../temp/templates/rangeColumn'; + +StoryFactory.registerChartTemp(RangeColumnTemp.type, RangeColumnTemp); + +export class RangeColumnChartCharacter extends CharacterChart { + static type = 'RangeColumnChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/rose.ts b/packages/vstory/src/story/character/chart/characters/rose.ts new file mode 100644 index 0000000..de0009c --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/rose.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { RoseTemp } from '../temp/templates/rose'; + +StoryFactory.registerChartTemp(RoseTemp.type, RoseTemp); + +export class RoseChartCharacter extends CharacterChart { + static type = 'RoseChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/scatter.ts b/packages/vstory/src/story/character/chart/characters/scatter.ts new file mode 100644 index 0000000..4e4104a --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/scatter.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { ScatterTemp } from '../temp/templates/scatter'; + +StoryFactory.registerChartTemp(ScatterTemp.type, ScatterTemp); + +export class ScatterChartCharacter extends CharacterChart { + static type = 'ScatterChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/sunburst.ts b/packages/vstory/src/story/character/chart/characters/sunburst.ts new file mode 100644 index 0000000..56b2e04 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/sunburst.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { SunburstTemp } from '../temp/templates/sunburst'; + +StoryFactory.registerChartTemp(SunburstTemp.type, SunburstTemp); + +export class SunburstChartCharacter extends CharacterChart { + static type = 'SunburstChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/treemap.ts b/packages/vstory/src/story/character/chart/characters/treemap.ts new file mode 100644 index 0000000..fedd08e --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/treemap.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { TreeMapTemp } from '../temp/templates/treemap'; + +StoryFactory.registerChartTemp(TreeMapTemp.type, TreeMapTemp); + +export class TreeMapChartCharacter extends CharacterChart { + static type = 'TreeMapChart'; +} diff --git a/packages/vstory/src/story/character/chart/characters/wordcloud.ts b/packages/vstory/src/story/character/chart/characters/wordcloud.ts new file mode 100644 index 0000000..d4a4513 --- /dev/null +++ b/packages/vstory/src/story/character/chart/characters/wordcloud.ts @@ -0,0 +1,9 @@ +import { StoryFactory } from '../../../factory/factory'; +import { CharacterChart } from '../character'; +import { WordCloudTemp } from '../temp/templates/wordcloud'; + +StoryFactory.registerChartTemp(WordCloudTemp.type, WordCloudTemp); + +export class WordCloudCharacter extends CharacterChart { + static type = 'WordCloudChart'; +} diff --git a/packages/vstory/src/story/character/chart/const.ts b/packages/vstory/src/story/character/chart/const.ts new file mode 100644 index 0000000..fb77d95 --- /dev/null +++ b/packages/vstory/src/story/character/chart/const.ts @@ -0,0 +1,12 @@ +// chart data parser default field +export const ChartDimensionField = `_editor_dimension_field`; +export const ChartValueField = `_editor_value_field`; +export const ChartTypeField = `_editor_type_field`; +export const DataPercentageField = `_editor_percentage_field`; + +export enum Direction { + vertical = 'vertical', + horizontal = 'horizontal' +} + +export type DirectionType = keyof typeof Direction; diff --git a/packages/vstory/src/story/character/chart/data/interface.ts b/packages/vstory/src/story/character/chart/data/interface.ts new file mode 100644 index 0000000..8a73724 --- /dev/null +++ b/packages/vstory/src/story/character/chart/data/interface.ts @@ -0,0 +1,66 @@ +import type { ICommonInitOption } from '../../../core/interface'; +import type { DataSet } from '@visactor/vdataset'; +import { type EventEmitter } from '@visactor/vutils'; + +export type IDataType = any; + +export interface IDataValue { + id: string; + sourceKey: string; + values: IDataType[]; +} + +export type StandardData = IDataValue | IDataValue[]; + +export type IParserValue = any; + +export type DataUpdateCall = (data: StandardData) => void; +export type DataErrorCall = (msg: { type: string; info: string }, opt?: any) => void; + +export type DataInfo = { + [key: string]: { + type: 'ordinal' | 'linear'; + }; +}; + +export type DataSave = { + type: string; + value: any; +}; + +// export interface IData { +// changeDataSource: (type: string, value: IParserValue) => void; +// getData: () => StandardData; +// addDataUpdateListener: (call: DataUpdateCall) => void; +// getDataInfo: () => DataInfo; +// getSpecOption: () => any; +// getSave: () => DataSave; +// clear: () => void; +// } + +export interface IDataParser { + type: string; + getData: () => StandardData; + getDataValue: () => IParserValue; + getDataInfo?: () => DataInfo; + getSpecOption?: () => any; + getSave: () => DataSave; + updateValue: (value: IParserValue) => void; + setDataUpdateHandler: (call: DataUpdateCall) => void; + setDataErrorHandler: (call: DataErrorCall) => void; + clear: () => void; +} + +export interface IDataParserConstructor { + type: string; + new ( + dataSet: DataSet, + value: any, + option: { + updateCall: DataUpdateCall; + errorCall: DataErrorCall; + currentData?: IDataParser; + emitter: EventEmitter; + } & ICommonInitOption + ): IDataParser; +} diff --git a/packages/vstory/src/story/character/chart/data/parser/standard.ts b/packages/vstory/src/story/character/chart/data/parser/standard.ts new file mode 100644 index 0000000..6ca8563 --- /dev/null +++ b/packages/vstory/src/story/character/chart/data/parser/standard.ts @@ -0,0 +1,103 @@ +import { isString } from '@visactor/vutils'; +import type { DataErrorCall, DataUpdateCall, IDataParser, IDataType, IDataValue } from '../interface'; +import { ChartDimensionField, ChartTypeField, ChartValueField } from '../../const'; + +export type IStandardValue = { + columns: string[]; + data: IDataType[]; + rows: string[]; +}; + +export class StandardParser implements IDataParser { + static readonly type = 'standard'; + readonly type: string = StandardParser.type; + protected _data: IDataValue[] = null; + protected _dataValue: IStandardValue = null; + protected _onDataUpdateCall: DataUpdateCall = null; + protected _onDataErrorCall: DataErrorCall = null; + constructor( + type: any, + { + updateCall, + errorCall + }: { + updateCall: DataUpdateCall; + errorCall: DataErrorCall; + } + ) { + this.setDataUpdateHandler(updateCall); + this.setDataErrorHandler(errorCall); + this._data = []; + } + + getData() { + return this._data; + } + + getDataValue() { + return this._dataValue; + } + + getDataInfo() { + return { + [ChartDimensionField]: { + domain: this._dataValue.rows + }, + [ChartTypeField]: { + domain: this._dataValue.columns.slice(1, this._dataValue.columns.length) + } + } as any; + } + + getSave() { + return { + type: 'standard', + value: JSON.stringify(this._dataValue) + }; + } + + // 正常多系列处理方法 + private _updateValue(value: IStandardValue) { + if (value.columns.length < 1) { + return; + } + this._data = []; + const xField = value.columns[0]; + for (let i = 1; i < value.columns.length; i++) { + const column = value.columns[i]; + const values = value.data.map(v => { + return { + [ChartDimensionField]: v[xField], + [ChartValueField]: v[column], + [ChartTypeField]: column + }; + }); + this._data.push({ + id: `${i - 1}`, + sourceKey: column, + values + }); + } + this._dataValue = value; + this._onDataUpdateCall?.(this._data); + } + + updateValue(value: IStandardValue) { + if (isString(value)) { + value = JSON.parse(value); + } + return this._updateValue(value); + } + + setDataUpdateHandler(call: DataUpdateCall) { + this._onDataUpdateCall = call; + } + setDataErrorHandler(call: DataErrorCall) { + this._onDataErrorCall = call; + } + + clear() { + this._data = null; + this._onDataUpdateCall = null; + } +} diff --git a/packages/vstory/src/story/character/chart/graphic/vchart-graphic-picker.ts b/packages/vstory/src/story/character/chart/graphic/vchart-graphic-picker.ts new file mode 100644 index 0000000..03904f8 --- /dev/null +++ b/packages/vstory/src/story/character/chart/graphic/vchart-graphic-picker.ts @@ -0,0 +1,45 @@ +import type { IPoint } from '@visactor/vutils'; +import { + inject, + injectable, + getTheme, + CircleRender, + getScaledStroke, + CIRCLE_NUMBER_TYPE +} from '@visactor/vrender-core'; +import type { + IGraphicAttribute, + ICircle, + IContext2d, + IMarkAttribute, + IThemeAttribute, + IGraphicPicker, + IGraphicRender, + IPickParams +} from '@visactor/vrender-core'; +import { CHART_NUMBER_TYPE, Chart } from './vchart-graphic'; + +@injectable() +export class VChartPicker implements IGraphicPicker { + type = 'chart'; + numberType: number = CHART_NUMBER_TYPE; + + constructor() {} + + contains(chart: any, point: any, params?: IPickParams): boolean | any { + const vChart = (chart as Chart).vchart; + const chartStage = vChart.getStage(); + // @ts-ignore + chartStage._editor_needRender = true; + const matrix = chart.globalTransMatrix.clone(); + const stageMatrix = chart.stage.window.getViewBoxTransform(); + matrix.multiply(stageMatrix.a, stageMatrix.b, stageMatrix.c, stageMatrix.d, stageMatrix.e, stageMatrix.f); + chartStage.window.setViewBoxTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f); + chartStage.dirtyBounds?.clear(); + const nextP = { x: 0, y: 0 }; + matrix.transformPoint(point, nextP); + const graphic = chartStage.pick(nextP.x, nextP.y); + + return graphic; + } +} diff --git a/packages/vstory/src/story/character/chart/graphic/vchart-graphic-render.ts b/packages/vstory/src/story/character/chart/graphic/vchart-graphic-render.ts new file mode 100644 index 0000000..99a61ba --- /dev/null +++ b/packages/vstory/src/story/character/chart/graphic/vchart-graphic-render.ts @@ -0,0 +1,68 @@ +import type { + IContext2d, + IDrawContext, + IGraphicAttribute, + IGraphicRender, + IGraphicRenderDrawParams, + IMarkAttribute, + IRenderService, + IThemeAttribute, + IGraphic +} from '@visactor/vrender-core'; +import { injectable, DefaultCanvasRectRender } from '@visactor/vrender-core'; +import type { Chart } from './vchart-graphic'; +import { CHART_NUMBER_TYPE } from './vchart-graphic'; + +export const ChartRender = Symbol.for('ChartRender'); +export const ChartRenderContribution = Symbol.for('ChartRenderContribution'); + +@injectable() +export class VChartRender extends DefaultCanvasRectRender implements IGraphicRender { + type: 'chart'; + numberType: number = CHART_NUMBER_TYPE; + + drawShape( + chart: any, + context: IContext2d, + x: number, + y: number, + drawContext: IDrawContext, + params?: IGraphicRenderDrawParams, + fillCb?: ( + ctx: IContext2d, + markAttribute: Partial, + themeAttribute: IThemeAttribute + ) => boolean, + strokeCb?: ( + ctx: IContext2d, + markAttribute: Partial, + themeAttribute: IThemeAttribute + ) => boolean + ) { + const { baseOpacity = 1 } = chart.attribute; + context.baseGlobalAlpha *= baseOpacity; + super.drawShape(chart, context, x, y, drawContext, params, fillCb, strokeCb); + context.baseGlobalAlpha /= baseOpacity; + const vChart = (chart as Chart).vchart; + const chartStage = vChart.getStage(); + const chartCtx = chartStage.window.getContext(); + chartCtx.baseGlobalAlpha *= baseOpacity; + // @ts-ignore + chartStage._editor_needRender = true; + const matrix = chart.globalTransMatrix.clone(); + const stageMatrix = chart.stage.window.getViewBoxTransform(); + matrix.multiply(stageMatrix.a, stageMatrix.b, stageMatrix.c, stageMatrix.d, stageMatrix.e, stageMatrix.f); + chartStage.window.setViewBoxTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f); + chartStage.dirtyBounds?.clear(); + chartStage.render(); + chartCtx.baseGlobalAlpha /= baseOpacity; + // const ctx = chartStage.window.getContext(); + // ctx.fillStyle = 'green'; + // ctx.fillRect(0, 0, 100, 100); + } + + draw(chart: any, renderService: IRenderService, drawContext: IDrawContext, params?: IGraphicRenderDrawParams) { + // const chartAttribute = getTheme(chart, params?.theme).circle; + this._draw(chart, {} as any, false, drawContext, params); + } +} diff --git a/packages/vstory/src/story/character/chart/graphic/vchart-graphic.ts b/packages/vstory/src/story/character/chart/graphic/vchart-graphic.ts new file mode 100644 index 0000000..a6d5dc6 --- /dev/null +++ b/packages/vstory/src/story/character/chart/graphic/vchart-graphic.ts @@ -0,0 +1,124 @@ +import { IVisactorGraphic } from '../../visactor/interface'; +import type { IBoundsLike } from '@visactor/vutils'; +import type { ISpec, IVChart } from '@visactor/vchart'; +import type { GraphicType, IGroupGraphicAttribute, ITicker } from '@visactor/vrender-core'; +import { genNumberType, Group } from '@visactor/vrender-core'; + +export interface IChartGraphicAttribute extends IGroupGraphicAttribute { + renderCanvas: HTMLCanvasElement; + spec: any; + ClassType: any; + vchart: IVChart; + mode: string; + modeParams?: any; + dpr: number; + interactive: boolean; + animation: boolean; + disableTriggerEvent: boolean; + disableDirtyBounds: boolean; + viewBox: IBoundsLike; + ticker?: ITicker; + autoRender?: boolean; + chartInitOptions?: any; +} + +export const CHART_NUMBER_TYPE = genNumberType(); + +// @ts-ignore +export class Chart extends Group implements IVisactorGraphic { + type: GraphicType = 'chart' as any; + declare attribute: IChartGraphicAttribute; + protected _vchart: IVChart; + get vchart() { + return this._vchart; + } + get vProduct() { + return this._vchart; + } + + drawTag = false; + + constructor(params: IChartGraphicAttribute) { + super(params); + this.numberType = CHART_NUMBER_TYPE; + + // 创建chart + if (!params.vchart) { + params.vchart = this._vchart = new params.ClassType(params.spec, { + renderCanvas: params.renderCanvas, + mode: params.mode, + modeParams: params.modeParams, + canvasControled: false, + // viewBox: params.vi + dpr: params.dpr, + interactive: params.interactive, + animation: params.animation, + autoFit: false, + disableTriggerEvent: params.disableTriggerEvent, + disableDirtyBounds: params.disableDirtyBounds, + ticker: params.ticker, + beforeRender: () => { + if (!this.stage) { + return; + } + const chartStage = this._vchart.getStage(); + if (!(chartStage as any)._editor_needRender) { + chartStage.pauseRender(); + this.stage.dirtyBounds?.union(this.globalAABBBounds); + this.stage.renderNextFrame(); + } + }, + afterRender: () => { + if (!this._vchart) { + return; + } + if (!this.stage) { + return; + } + // @ts-ignore + this._vchart.getStage()._editor_needRender = false; + this._vchart.getStage().stage.resumeRender(); + }, + ...(params.chartInitOptions ?? {}) + }); + } else { + this._vchart = params.vchart; + } + this._vchart.renderSync(); + // 背景设置为false后,不会擦除画布内容,可以实现元素正常堆叠绘制 + const stage = this._vchart.getStage(); + if (stage) { + stage.background = false as any; + // 关闭交互 + stage.pauseTriggerEvent(); + } + if (params.viewBox) { + this.updateViewBox(params.viewBox); + } + } + + updateSpec(spec: ISpec, forceMerge = false, morphConfig = false) { + this._vchart.updateSpecSync(spec, forceMerge, morphConfig as any); + } + + updateViewBox(viewBox: IBoundsLike) { + this._updateViewBox(viewBox); + } + + private _updateViewBox(_viewBox: IBoundsLike) { + const viewBox = { ..._viewBox }; + this.setAttributes({ + x: viewBox.x1, + y: viewBox.y1, + width: viewBox.x2 - viewBox.x1, + height: viewBox.y2 - viewBox.y1 + }); + // + viewBox.x2 -= viewBox.x1; + viewBox.y2 -= viewBox.y1; + viewBox.x1 = 0; + viewBox.y1 = 0; + this._vchart.resize(viewBox.x2 - viewBox.x1, viewBox.y2 - viewBox.y1); + this._vchart.updateViewBox(viewBox); + } +} diff --git a/packages/vstory/src/story/character/chart/parser.ts b/packages/vstory/src/story/character/chart/parser.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/vstory/src/story/character/chart/runtime/common-spec.ts b/packages/vstory/src/story/character/chart/runtime/common-spec.ts new file mode 100644 index 0000000..3889fc6 --- /dev/null +++ b/packages/vstory/src/story/character/chart/runtime/common-spec.ts @@ -0,0 +1,27 @@ +import { merge } from '@visactor/vutils'; +import { CharacterChart } from '../character'; +import { IChartCharacterRuntime } from './interface'; + +export class CommonSpecRuntime implements IChartCharacterRuntime { + type = 'CommonSpec'; + + protected declare _character: CharacterChart; + + constructor(character: CharacterChart) { + this._character = character; + } + + onSpecReady() { + const rawSpec = this._character.specProcess.getVisSpec(); + const options = this._character.specProcess.getCharacterSpec().options; + if (!options) { + return; + } + merge(rawSpec, { color: options.color, theme: options.theme, padding: options.padding, title: options.title }); + } + + afterInitializeChart() { + // + } + afterVRenderDraw() {} +} diff --git a/packages/vstory/src/story/character/chart/runtime/component-spec.ts b/packages/vstory/src/story/character/chart/runtime/component-spec.ts new file mode 100644 index 0000000..e9517cd --- /dev/null +++ b/packages/vstory/src/story/character/chart/runtime/component-spec.ts @@ -0,0 +1,54 @@ +import { merge, isValid } from '@visactor/vutils'; +import { IComponentSpec } from '../../dsl-interface'; +import { CharacterChart } from '../character'; +import { IChartCharacterRuntime } from './interface'; +import { ChartSpecMatch } from './utils'; + +export class ComponentSpecRuntime implements IChartCharacterRuntime { + type = 'ComponentSpec'; + + protected declare _character: CharacterChart; + + constructor(character: CharacterChart) { + this._character = character; + } + + onSpecReady() { + const rawSpec = this._character.specProcess.getVisSpec(); + const options = this._character.specProcess.getCharacterSpec().options; + if (!options) { + return; + } + const componentSpec = options.componentSpec; + componentSpec?.forEach(cSpec => { + if (cSpec.specKey === 'axes') { + this._mergeAxesSpec(rawSpec, cSpec); + } + }); + } + + protected _mergeAxesSpec(rawSpec: any, componentSpec: IComponentSpec) { + if (!rawSpec.axes) { + rawSpec.axes = [{ ...componentSpec }]; + return; + } else { + const s = rawSpec.axes.find((a: any, index: number) => { + if (ChartSpecMatch(a, index, componentSpec.matchInfo)) { + return true; + } else { + return a.orient === componentSpec.matchInfo.orient; + } + }); + if (s) { + merge(s, componentSpec.spec); + } else { + rawSpec.axes.push(componentSpec.spec); + } + } + } + + afterInitializeChart() { + // + } + afterVRenderDraw() {} +} diff --git a/packages/vstory/src/story/character/chart/runtime/interface.ts b/packages/vstory/src/story/character/chart/runtime/interface.ts new file mode 100644 index 0000000..4f76aee --- /dev/null +++ b/packages/vstory/src/story/character/chart/runtime/interface.ts @@ -0,0 +1,16 @@ +import { ICharacterVisactor } from '../../visactor/interface'; +export interface IChartCharacterRuntime { + readonly type: string; + // spec 准备完成 + onSpecReady?: () => void; + + // 图表初始化完成 + afterInitializeChart?: () => void; + + // 图表绘制完成 + afterVRenderDraw?: () => void; +} + +export interface IChartCharacterRuntimeConstructor { + new (character: ICharacterVisactor): IChartCharacterRuntime; +} diff --git a/packages/vstory/src/story/character/chart/runtime/series-spec.ts b/packages/vstory/src/story/character/chart/runtime/series-spec.ts new file mode 100644 index 0000000..068bf5d --- /dev/null +++ b/packages/vstory/src/story/character/chart/runtime/series-spec.ts @@ -0,0 +1,47 @@ +import { merge } from '@visactor/vutils'; +import { CharacterChart } from '../character'; +import { IChartCharacterRuntime } from './interface'; +import { ChartSpecMatch } from './utils'; + +export class SeriesSpecRuntime implements IChartCharacterRuntime { + type = 'SeriesSpec'; + + protected declare _character: CharacterChart; + + constructor(character: CharacterChart) { + this._character = character; + } + + onSpecReady() { + const rawSpec = this._character.specProcess.getVisSpec(); + const options = this._character.specProcess.getCharacterSpec().options; + if (!options) { + return; + } + // 如果原始spec没有series,并且seriesSpec只有一项 + if (!rawSpec.series && options.seriesSpec?.length === 1) { + merge(rawSpec, options.seriesSpec[0].spec); + return; + } + options.seriesSpec.forEach(seriesSpec => { + if (!rawSpec.series) { + rawSpec.series = [{ ...seriesSpec.spec }]; + return; + } else { + const s = rawSpec.series.find((a: any, index: number) => { + return ChartSpecMatch(a, index, seriesSpec.matchInfo); + }); + if (s) { + merge(s, seriesSpec.spec); + } else { + rawSpec.series.push({ ...seriesSpec.spec }); + } + } + }); + } + + afterInitializeChart() { + // + } + afterVRenderDraw() {} +} diff --git a/packages/vstory/src/story/character/chart/runtime/utils.ts b/packages/vstory/src/story/character/chart/runtime/utils.ts new file mode 100644 index 0000000..c64c1c9 --- /dev/null +++ b/packages/vstory/src/story/character/chart/runtime/utils.ts @@ -0,0 +1,14 @@ +import { isValid } from '@visactor/vutils'; +import { IComponentMatch } from '../../dsl-interface'; +export function ChartSpecMatch(rawSpec: any, index: number, matchInfo: IComponentMatch) { + if (!matchInfo) { + return false; + } + if (isValid(matchInfo.usrId)) { + return rawSpec.id === matchInfo.usrId; + } else if (isValid(matchInfo.specIndex)) { + return matchInfo.specIndex === 'all' || index === matchInfo.specIndex; + } + + return false; +} diff --git a/packages/vstory/src/story/character/chart/spec-process/data-temp-transform.ts b/packages/vstory/src/story/character/chart/spec-process/data-temp-transform.ts new file mode 100644 index 0000000..3134e24 --- /dev/null +++ b/packages/vstory/src/story/character/chart/spec-process/data-temp-transform.ts @@ -0,0 +1,15 @@ +import type { IChartDataTempTransform } from './interface'; +import { DataTempTransformBase } from '../../visactor/data-temp-transform-base'; +import { IChartTemp } from '../temp/interface'; + +export class ChartDataTempTransform extends DataTempTransformBase implements IChartDataTempTransform { + protected declare _specTemp: IChartTemp; + get specTemp() { + return this._specTemp; + } + + protected declare _nextTemp: IChartTemp; + get nextTemp() { + return this._nextTemp; + } +} diff --git a/packages/vstory/src/story/character/chart/spec-process/interface.ts b/packages/vstory/src/story/character/chart/spec-process/interface.ts new file mode 100644 index 0000000..a8d322c --- /dev/null +++ b/packages/vstory/src/story/character/chart/spec-process/interface.ts @@ -0,0 +1,25 @@ +import { IChartTemp } from '../temp/interface'; +import { IDataTempTransform, ISpecProcess } from '../../visactor/interface'; + +export interface IMarkStyle { + seriesType: string; + seriesIndex: number; + markName: string; + id: string; // 唯一id,避免单个元素有多个匹配样式 + itemKeys: string[]; // 数据匹配维度 + itemKeyMap: { [key: string]: any }; // 匹配维度值 + style: any; // 样式 +} + +export interface IChartDataTempTransform extends IDataTempTransform { + readonly specTemp: IChartTemp; + readonly nextTemp: IChartTemp; +} + +export interface IChartSpecProcess extends ISpecProcess { + dataTempTransform: IChartDataTempTransform; + + getSpecTemp: () => any; + + release: () => void; +} diff --git a/packages/vstory/src/story/character/chart/spec-process/spec-process.ts b/packages/vstory/src/story/character/chart/spec-process/spec-process.ts new file mode 100644 index 0000000..44b0170 --- /dev/null +++ b/packages/vstory/src/story/character/chart/spec-process/spec-process.ts @@ -0,0 +1,42 @@ +import { IChartCharacterSpec } from '../../dsl-interface'; +import { cloneDeep } from '@visactor/vutils'; +import type { IChartSpecProcess } from './interface'; +import type { ChartDataTempTransform } from './data-temp-transform'; +import { SpecProcessBase } from '../../visactor/spec-process-base'; + +const DefaultEditorSpec: IChartCharacterSpec = { + type: null, + zIndex: 0, + id: '', + position: undefined, + options: { + data: null, + theme: null, + color: null, + layout: { viewBox: { x: 0, y: 0, width: 0, height: 0 }, data: [] }, + marker: { + markLine: [], + markArea: [] + }, + markStyle: null + } +}; + +// @ts-ignore +export class SpecProcess extends SpecProcessBase implements IChartSpecProcess { + // 编辑器spec 存储和加载都是这个数据结构 + // 保证结构可序列化。 + protected _characterSpec: IChartCharacterSpec = cloneDeep(DefaultEditorSpec); + + // @ts-ignore + protected declare _character: EditorChart; + + protected declare _dataTempTransform: ChartDataTempTransform; + + updateConfig(spec: IChartCharacterSpec) { + this._characterSpec = spec; + this._dataTempTransform.updateChartTemp(this._characterSpec.type); + } + + protected _mergeConfig() {} +} diff --git a/packages/vstory/src/story/character/chart/temp/constant.ts b/packages/vstory/src/story/character/chart/temp/constant.ts new file mode 100644 index 0000000..bdd70c1 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/constant.ts @@ -0,0 +1,15 @@ +import { StoryChartType } from '../../../../dsl/constant'; + +export enum TemplateChartType { + bar = StoryChartType.BAR, + area = StoryChartType.AREA, + line = StoryChartType.LINE, + pie = StoryChartType.PIE, + scatter = StoryChartType.SCATTER, + rangeColumn = StoryChartType.RANGE_COLUMN, + rose = StoryChartType.ROSE, + radar = StoryChartType.RADAR, + wordcloud = StoryChartType.WORD_CLOUD, + treemap = StoryChartType.TREE_MAP, + sunburst = StoryChartType.SUNBURST +} diff --git a/packages/vstory/src/story/character/chart/temp/index.ts b/packages/vstory/src/story/character/chart/temp/index.ts new file mode 100644 index 0000000..16ed627 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/index.ts @@ -0,0 +1,2 @@ +export * from './templates/base-temp'; +export * from './interface'; diff --git a/packages/vstory/src/story/character/chart/temp/interface.ts b/packages/vstory/src/story/character/chart/temp/interface.ts new file mode 100644 index 0000000..b86a5f5 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/interface.ts @@ -0,0 +1,29 @@ +import { IChartCharacterSpec } from '../../dsl-interface'; +import type { StandardData, DataInfo } from '../data/interface'; +import type { ISpec } from '@visactor/vchart'; +import type { IVisactorTemp } from '../../visactor/interface'; +import { CharacterChart } from '../character'; + +export interface IChartTemp extends IVisactorTemp { + type: string; + /** + * 根据数据得到原始 vchartSpec + * @param data 数据 + * @param info 数据信息 + * @param opt 透传参数 + * @returns + */ + getSpec: (data: StandardData, ctx: { character: CharacterChart }) => ISpec | null; + + afterInitializeChart: (ctx: { character: CharacterChart }) => void; + + getChartType: () => string; + checkDataEnable: (data: StandardData, opt?: any) => boolean; + getTempInfo?: () => any; + clear: () => void; +} + +export interface IChartTempConstructor { + type: string; + new (option: any): IChartTemp; +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/area.ts b/packages/vstory/src/story/character/chart/temp/templates/area.ts new file mode 100644 index 0000000..5ed8c00 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/area.ts @@ -0,0 +1,24 @@ +import { TemplateChartType } from '../constant'; +import { CartesianSingleSeriesTemp } from './cartesian-single'; + +export class AreaTemp extends CartesianSingleSeriesTemp { + static type = TemplateChartType.area; + type = AreaTemp.type; + // 唯一系列类型 + seriesType = 'area'; + // 是否消除维度轴的2测留白 + trimPadding = true; + + protected _getSeriesSpec() { + return { + type: 'area', + stack: true, + direction: this.direction, + line: { + style: { + lineCap: 'butt' + } + } + }; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/bar.ts b/packages/vstory/src/story/character/chart/temp/templates/bar.ts new file mode 100644 index 0000000..62270f7 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/bar.ts @@ -0,0 +1,23 @@ +import { TemplateChartType } from '../constant'; +import { CartesianSingleSeriesTemp } from './cartesian-single'; + +export class BarTemp extends CartesianSingleSeriesTemp { + static type = TemplateChartType.bar; + type = BarTemp.type; + // 唯一系列类型 + seriesType = 'bar'; + // 默认是否展示总计标签 + defaultTotalLabel = true; + + protected _getSeriesSpec() { + return { + type: 'bar', + stack: true, + direction: this.direction + }; + } + + afterInitializeChart(): void { + console.log('afterInitializeChart'); + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/base-temp.ts b/packages/vstory/src/story/character/chart/temp/templates/base-temp.ts new file mode 100644 index 0000000..c4092c1 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/base-temp.ts @@ -0,0 +1,27 @@ +import { IChartTemp } from '../interface'; +import { DataInfo, StandardData } from '../../data/interface'; +import { CharacterChart } from '../../character'; + +export const EDITOR_SERIES_MARK_SINGLE = '_editor_series_mark_single'; +export const EDITOR_SERIES_MARK_SINGLE_LEVEL = 100; + +export abstract class BaseTemp implements IChartTemp { + type: string; + abstract getSpec(data: StandardData, ctx: { character: CharacterChart }, opt?: any): any; + abstract checkDataEnable(data: StandardData, info: DataInfo, opt?: any): boolean; + clear() { + // do nothing + } + + getChartType() { + return this.type; + } + + afterInitializeChart() { + // do nothing + } + + standardizedSpec(spec: any, ctx: { character: CharacterChart }) { + // do nothing + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/cartesian-single.ts b/packages/vstory/src/story/character/chart/temp/templates/cartesian-single.ts new file mode 100644 index 0000000..1f6d862 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/cartesian-single.ts @@ -0,0 +1,48 @@ +import { IChartCharacterSpec } from '../../../dsl-interface'; +import { DirectionType } from '../../const'; +import type { StandardData } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { getCartesianCommonSpec, getCartesianSpec } from './common'; + +export abstract class CartesianSingleSeriesTemp extends BaseTemp { + // 唯一系列类型 + seriesType: string; + direction: DirectionType = 'vertical'; + // 是否有维度轴分组 + multiDimensionField = false; + // 是否堆积 + stack = true; + // 是否默认有总计标签 + defaultTotalLabel = false; + // 是否是百分百图表 + percent = false; + // 是否消除维度轴的2测留白 + trimPadding = false; + // 是否默认展示图例 + defaultLegendVisible = false; + + constructor(characterSpec: IChartCharacterSpec) { + super(); + this.direction = characterSpec.options.direction ?? 'vertical'; + } + + checkDataEnable(data: StandardData, opt?: any): boolean { + return !!data; // CommonStandardDataCheck(data); + } + getSpec(data: StandardData, opt?: any) { + const cartesianCommonSpec = getCartesianCommonSpec(this.direction, this.percent, this.trimPadding) as any; + if (cartesianCommonSpec.legends) { + cartesianCommonSpec.legends.visible = this.defaultLegendVisible; + } + + return getCartesianSpec(this._getSeriesSpec.bind(this), cartesianCommonSpec, this.direction, data, { + multiDimensionField: this.multiDimensionField, + stack: this.stack, + xField: opt.character.specProcess.getCharacterSpec().options.xField, + yField: opt.character.specProcess.getCharacterSpec().options.yField, + seriesField: opt.character.specProcess.getCharacterSpec().options.seriesField + }); + } + + protected abstract _getSeriesSpec(): any; +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/common.ts b/packages/vstory/src/story/character/chart/temp/templates/common.ts new file mode 100644 index 0000000..d4d321f --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/common.ts @@ -0,0 +1,230 @@ +import type { IDataValue } from '../../data/interface'; +import { array } from '@visactor/vutils'; +import type { DataInfo, StandardData } from '../../data/interface'; +import { ChartDimensionField, ChartTypeField, ChartValueField } from '../../const'; + +export function getCommonSpec() { + return { + type: 'common', + series: [] as any[], + region: [ + { + id: 'region-0' + } + ] + }; +} + +export function getPolarCommonSpec() { + return { + ...getCommonSpec(), + axes: getPolarAxesSpec() + }; +} + +export function getPolarAxesSpec() { + return [ + { + orient: 'radius' + }, + { + orient: 'angle' + } + ]; +} + +export function getPolarSpec( + seriesSpec: () => any, + spec: any, + data: StandardData, + option: { + seriesField?: string; + categoryField: string; + valueField: string; + } +) { + spec.data = array(data); + spec.series = spec.data.map((d: IDataValue) => { + return fillPolarSeriesSpec(seriesSpec(), d, option); + }); + return spec; +} + +export function fillPolarSeriesSpec( + spec: any, + d: IDataValue, + option: { + seriesField?: string; + categoryField: string; + valueField: string; + } +) { + spec.dataId = d.id; + spec.id = `series-${d.id}`; + spec.seriesField = option.seriesField; + return spec; +} + +export function getCartesianCommonSpec(direction: 'horizontal' | 'vertical', percent = false, trimPadding = false) { + return { + direction, + ...getCommonSpec(), + axes: getCartesianAxesSpec(direction, percent, trimPadding) + }; +} + +export function getCartesianAxesSpec(direction: 'horizontal' | 'vertical', percent = false, trimPadding = false) { + return direction === 'vertical' + ? [ + { + orient: 'left', + id: 'axis-left', + type: 'linear', + autoIndent: false, + maxWidth: null as number, + maxHeight: null as number + }, + { + orient: 'bottom', + id: 'axis-bottom', + type: 'band', + autoIndent: false, + maxWidth: null as number, + maxHeight: null as number, + trimPadding, + paddingInner: [0.2, 0], + paddingOuter: [0.2, 0] + } + ] + : [ + { + orient: 'left', + id: 'axis-left', + type: 'band', + autoIndent: false, + maxWidth: null as number, + maxHeight: null as number, + trimPadding + }, + { + orient: 'bottom', + id: 'axis-bottom', + type: 'linear', + autoIndent: false, + maxWidth: null as number, + maxHeight: null as number + } + ]; +} + +export function getCartesianSpec( + seriesSpec: () => any, + spec: any, + direction: 'horizontal' | 'vertical', + data: StandardData, + option: { + multiDimensionField?: boolean; + stack?: boolean; + xField: string[] | string; + yField: string[] | string; + seriesField: string; + } +) { + spec.data = array(data); + spec.series = spec.data.map((d: IDataValue) => { + return fillCartesianSeriesSpec(seriesSpec(), direction, d, option); + }); + return spec; +} + +export function fillCartesianSeriesSpec( + spec: any, + direction: 'horizontal' | 'vertical', + d: IDataValue, + option: { + multiDimensionField?: boolean; + stack?: boolean; + xField: string[] | string; + yField: string[] | string; + seriesField: string; + } +) { + spec.xField = option.xField; + spec.yField = option.yField; + spec.dataId = d.id; + spec.id = `series-${d.id}`; + spec.seriesField = option.seriesField; + spec.stack = option.stack === true; + return spec; +} + +export function getDimensions(info: DataInfo) { + const ordinalFields: string[] = []; + const linearFields: string[] = []; + Object.keys(info).forEach(key => { + if (key.startsWith('VGRAMMAR_') || key.startsWith('__VCHART_')) { + return; + } + if (info[key].type === 'linear') { + linearFields.length === 0 && linearFields.push(key); + } else if (info[key].type === 'ordinal') { + ordinalFields.push(key); + } + }); + + return { + ordinalFields, + linearFields + }; +} + +export function CommonStandardDataCheck(data: StandardData) { + data = array(data); + if (data.length === 0) { + return false; + } + // mvp 使用total data 不再使用totalData + // const totalData = data.find(d => d.sourceKey === 'total'); + // if (totalData && totalData.values.length === 0) { + // return false; + // } + return true; +} + +export function getSeriesLabelSpec(direction: 'horizontal' | 'vertical', visible = true) { + return { + visible, + position: direction === 'vertical' ? 'end' : 'start', + label: { + style: { + lineHeight: '100%', + lineWidth: 1, + stroke: '#ffffff', + fontSize: 16, + fontWeight: 'bold' + }, + space: 10 + } + }; +} + +export function getTotalLabelSpec(visible: boolean) { + return { + visible, + position: 'top', + overlap: false, + clampForce: false, + formatConfig: { + fixed: 0, + content: 'value' + }, + style: { + lineHeight: '100%', + lineWidth: 1, + fill: '#1F2329', + stroke: '#ffffff', + fontSize: 16, + fontWeight: 'bold' + } + }; +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/line.ts b/packages/vstory/src/story/character/chart/temp/templates/line.ts new file mode 100644 index 0000000..18be3a2 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/line.ts @@ -0,0 +1,38 @@ +import { TemplateChartType } from '../constant'; +import { CartesianSingleSeriesTemp } from './cartesian-single'; +import { getSeriesLabelSpec } from './common'; + +export class LineTemp extends CartesianSingleSeriesTemp { + static type = TemplateChartType.line; + type = LineTemp.type; + // 唯一系列类型 + seriesType = 'line'; + stack = false; + // 是否消除维度轴的2测留白 + trimPadding = true; + + protected _getSeriesSpec() { + return { + direction: this.direction, + type: 'line', + stack: false, + line: { + style: { + lineCap: 'butt' + } + }, + label: { + visible: true, + position: 'top', + style: { + lineHeight: '100%', + fontSize: 16, + fontWeight: 'bold' + }, + overlap: true, + smartInvert: true + }, + seriesLabel: getSeriesLabelSpec(this.direction) + }; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/pie.ts b/packages/vstory/src/story/character/chart/temp/templates/pie.ts new file mode 100644 index 0000000..a543094 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/pie.ts @@ -0,0 +1,32 @@ +import { array } from '@visactor/vutils'; +import type { StandardData } from '../../data/interface'; +import type { DataInfo } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { ChartDimensionField, ChartValueField } from '../../const'; + +export function spec() { + return { + type: 'pie' + }; +} + +export class PieTemp extends BaseTemp { + static type = TemplateChartType.pie; + type = PieTemp.type; + checkDataEnable(data: StandardData, opt?: any): boolean { + return CommonStandardDataCheck(data); + } + getSpec(data: StandardData, opt?: any) { + const tempSpec = getCommonSpec() as any; + tempSpec.series = [spec()]; + tempSpec.data = array(data); + tempSpec.series[0].valueField = ChartValueField; + tempSpec.series[0].categoryField = ChartDimensionField; + tempSpec.series[0].dataId = tempSpec.data[0].id; + tempSpec.series[0].seriesField = ChartDimensionField; + tempSpec.series[0].id = `series-${tempSpec.data[0].id}`; + return tempSpec; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/polar-single.ts b/packages/vstory/src/story/character/chart/temp/templates/polar-single.ts new file mode 100644 index 0000000..8d97d43 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/polar-single.ts @@ -0,0 +1,32 @@ +import { IChartCharacterSpec } from '../../../dsl-interface'; +import type { StandardData } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { getPolarCommonSpec, getPolarSpec } from './common'; + +export abstract class PolarSingleSeriesTemp extends BaseTemp { + // 唯一系列类型 + seriesType: string; + defaultLegendVisible = false; + + constructor(characterSpec: IChartCharacterSpec) { + super(); + } + + checkDataEnable(data: StandardData, opt?: any): boolean { + return !!data; // CommonStandardDataCheck(data); + } + getSpec(data: StandardData, opt?: any) { + const polarCommonSpec = getPolarCommonSpec() as any; + if (polarCommonSpec.legends) { + polarCommonSpec.legends.visible = this.defaultLegendVisible; + } + + return getPolarSpec(this._getSeriesSpec.bind(this), polarCommonSpec, data, { + categoryField: opt.character.specProcess.getCharacterSpec().options.categoryField, + valueField: opt.character.specProcess.getCharacterSpec().options.valueField, + seriesField: opt.character.specProcess.getCharacterSpec().options.seriesField + }); + } + + protected abstract _getSeriesSpec(): any; +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/radar.ts b/packages/vstory/src/story/character/chart/temp/templates/radar.ts new file mode 100644 index 0000000..38460a1 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/radar.ts @@ -0,0 +1,18 @@ +import type { StandardData } from '../../data/interface'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { PolarSingleSeriesTemp } from './polar-single'; + +export class RadarTemp extends PolarSingleSeriesTemp { + static type = TemplateChartType.radar; + type = RadarTemp.type; + checkDataEnable(data: StandardData, opt?: any): boolean { + return CommonStandardDataCheck(data); + } + + protected _getSeriesSpec() { + return { + type: 'radar' + }; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/rangeColumn.ts b/packages/vstory/src/story/character/chart/temp/templates/rangeColumn.ts new file mode 100644 index 0000000..611a645 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/rangeColumn.ts @@ -0,0 +1,38 @@ +import { TemplateChartType } from '../constant'; +import { CartesianSingleSeriesTemp } from './cartesian-single'; +import { CharacterChart } from '../../character'; + +export class RangeColumnTemp extends CartesianSingleSeriesTemp { + static type = TemplateChartType.rangeColumn; + type = RangeColumnTemp.type; + // 唯一系列类型 + seriesType = 'rangeColumn'; + // 是否消除维度轴的2测留白 + trimPadding = true; + + protected _getSeriesSpec() { + return { + type: 'rangeColumn', + stack: false, + direction: this.direction + }; + } + + standardizedSpec(spec: any, ctx: { character: CharacterChart }) { + if (spec.series) { + spec.series.forEach((seriesSpec: any) => { + if (seriesSpec.minField && seriesSpec.maxField) { + if (this.direction === 'vertical') { + if (!seriesSpec.yField) { + seriesSpec.yField = [seriesSpec.minField, seriesSpec.maxField]; + } + } else { + if (!seriesSpec.xField) { + seriesSpec.xField = [seriesSpec.minField, seriesSpec.maxField]; + } + } + } + }); + } + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/rose.ts b/packages/vstory/src/story/character/chart/temp/templates/rose.ts new file mode 100644 index 0000000..088284a --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/rose.ts @@ -0,0 +1,18 @@ +import { array } from '@visactor/vutils'; +import type { StandardData } from '../../data/interface'; +import type { DataInfo } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { ChartDimensionField, ChartValueField } from '../../const'; +import { PolarSingleSeriesTemp } from './polar-single'; + +export class RoseTemp extends PolarSingleSeriesTemp { + static type = TemplateChartType.rose; + type = RoseTemp.type; + protected _getSeriesSpec() { + return { + type: 'rose' + }; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/scatter.ts b/packages/vstory/src/story/character/chart/temp/templates/scatter.ts new file mode 100644 index 0000000..ded947d --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/scatter.ts @@ -0,0 +1,19 @@ +import { TemplateChartType } from '../constant'; +import { CartesianSingleSeriesTemp } from './cartesian-single'; + +export class ScatterTemp extends CartesianSingleSeriesTemp { + static type = TemplateChartType.scatter; + type = ScatterTemp.type; + // 唯一系列类型 + seriesType = 'scatter'; + // 是否消除维度轴的2测留白 + trimPadding = true; + + protected _getSeriesSpec() { + return { + type: 'scatter', + stack: false, + direction: this.direction + }; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/sunburst.ts b/packages/vstory/src/story/character/chart/temp/templates/sunburst.ts new file mode 100644 index 0000000..69e9489 --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/sunburst.ts @@ -0,0 +1,32 @@ +import { array } from '@visactor/vutils'; +import type { StandardData } from '../../data/interface'; +import type { DataInfo } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { ChartDimensionField, ChartValueField } from '../../const'; + +export function spec() { + return { + type: 'sunburst' + }; +} + +export class SunburstTemp extends BaseTemp { + static type = TemplateChartType.sunburst; + type = SunburstTemp.type; + checkDataEnable(data: StandardData, opt?: any): boolean { + return CommonStandardDataCheck(data); + } + getSpec(data: StandardData, opt?: any) { + const tempSpec = getCommonSpec() as any; + tempSpec.series = [spec()]; + tempSpec.data = array(data); + tempSpec.series[0].valueField = ChartValueField; + tempSpec.series[0].categoryField = ChartDimensionField; + tempSpec.series[0].dataId = tempSpec.data[0].id; + tempSpec.series[0].seriesField = ChartDimensionField; + tempSpec.series[0].id = `series-${tempSpec.data[0].id}`; + return tempSpec; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/treemap.ts b/packages/vstory/src/story/character/chart/temp/templates/treemap.ts new file mode 100644 index 0000000..544a10d --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/treemap.ts @@ -0,0 +1,32 @@ +import { array } from '@visactor/vutils'; +import type { StandardData } from '../../data/interface'; +import type { DataInfo } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { ChartDimensionField, ChartValueField } from '../../const'; + +export function spec() { + return { + type: 'treemap' + }; +} + +export class TreeMapTemp extends BaseTemp { + static type = TemplateChartType.treemap; + type = TreeMapTemp.type; + checkDataEnable(data: StandardData, opt?: any): boolean { + return CommonStandardDataCheck(data); + } + getSpec(data: StandardData, opt?: any) { + const tempSpec = getCommonSpec() as any; + tempSpec.series = [spec()]; + tempSpec.data = array(data); + tempSpec.series[0].valueField = ChartValueField; + tempSpec.series[0].categoryField = ChartDimensionField; + tempSpec.series[0].dataId = tempSpec.data[0].id; + tempSpec.series[0].seriesField = ChartDimensionField; + tempSpec.series[0].id = `series-${tempSpec.data[0].id}`; + return tempSpec; + } +} diff --git a/packages/vstory/src/story/character/chart/temp/templates/wordcloud.ts b/packages/vstory/src/story/character/chart/temp/templates/wordcloud.ts new file mode 100644 index 0000000..08d734a --- /dev/null +++ b/packages/vstory/src/story/character/chart/temp/templates/wordcloud.ts @@ -0,0 +1,33 @@ +import { array } from '@visactor/vutils'; +import type { StandardData } from '../../data/interface'; +import type { DataInfo } from '../../data/interface'; +import { BaseTemp } from './base-temp'; +import { CommonStandardDataCheck, getCommonSpec } from './common'; +import { TemplateChartType } from '../constant'; +import { ChartDimensionField, ChartValueField } from '../../const'; + +export function spec() { + return { + type: 'wordCloud' + }; +} + +export class WordCloudTemp extends BaseTemp { + static type = TemplateChartType.wordcloud; + type = WordCloudTemp.type; + checkDataEnable(data: StandardData, opt?: any): boolean { + const check = CommonStandardDataCheck(data); + return check; + } + getSpec(data: StandardData, opt?: any) { + const tempSpec = getCommonSpec() as any; + tempSpec.series = [spec()]; + tempSpec.data = array(data); + tempSpec.series[0].valueField = ChartValueField; + tempSpec.series[0].nameField = ChartDimensionField; + tempSpec.series[0].dataId = tempSpec.data[0].id; + tempSpec.series[0].seriesField = ChartDimensionField; + tempSpec.series[0].id = `series-${tempSpec.data[0].id}`; + return tempSpec; + } +} diff --git a/packages/vstory/src/story/character/component/character.ts b/packages/vstory/src/story/character/component/character.ts new file mode 100644 index 0000000..ee9471c --- /dev/null +++ b/packages/vstory/src/story/character/component/character.ts @@ -0,0 +1,140 @@ +import { IGroup, createGroup } from '@visactor/vrender-core'; +import { GraphicText } from './graphic/graphic-text'; +import { IComponentCharacterSpec } from '../dsl-interface'; +import { CharacterBase } from '../base/base'; +import { Graphic } from './graphic/graphic'; +import { getLayoutFromWidget } from '../../utils/layout'; +import { StoryEvent } from '../../interface/runtime-interface'; +import { ICharacterPickInfo } from '../runtime-interface'; + +export abstract class CharacterComponent extends CharacterBase { + protected declare _spec: IComponentCharacterSpec; + get spec() { + return this._spec; + } + protected declare _graphic: Graphic; + get graphic() { + return this._graphic; + } + protected declare _text: GraphicText; + get text() { + return this._text; + } + + protected declare _group: IGroup; + get group() { + return this._group; + } + + readonly graphicType: string = 'rect'; + + protected _parserSpec(): void {} + + protected _initGraphics(): void { + this._group = createGroup({ ...getLayoutFromWidget(this._spec.position), angle: this._spec.options.angle }); + this.option.graphicParent.add(this._group); + + this._graphic = this._createGraphic(); + this._text = new GraphicText(this); + this._graphic.init(); + this._text.init(); + + this._graphic.applyGraphicAttribute(this._spec.options.graphic); + this._text.applyGraphicAttribute(this._spec.options.text); + + this._graphic.applyLayoutData(this._spec.position); + this._text.applyLayoutData(this._spec.position); + this.hide(); + } + + protected abstract _createGraphic(): Graphic; + + protected _initRuntime(): void {} + + show(): void { + this._group.setAttributes({ visible: true }); + this._text.show(); + this._graphic.show(); + } + hide(): void { + this._group.setAttributes({ visible: false }); + this._text.hide(); + this._graphic.hide(); + } + + getTextLayoutRatio(): { left: number; right: number; top: number; bottom: number } { + return this._graphic.getTextLayoutRatio(); + } + + public clearCharacter(): void { + this._group?.parent.removeChild(this._group); + this._group = null; + } + + public getGraphicParent() { + return this._group; + } + + public checkEvent(event: StoryEvent): false | ICharacterPickInfo { + if (!(event.detailPath ?? event.path).some(g => g === this._group)) { + return false; + } + return { + part: event.path[event.path.length - 1] === this._graphic.graphic ? 'graphic' : 'text' + }; + } +} + +export abstract class CharacterGraphicComponent extends CharacterBase { + protected declare _spec: IComponentCharacterSpec; + + get spec() { + return this._spec; + } + protected declare _graphic: Graphic; + get graphic() { + return this._graphic; + } + + protected declare _group: IGroup; + get group() { + return this._group; + } + + protected abstract _createGraphic(): Graphic; + + protected _initRuntime(): void {} + + protected _parserSpec(): void {} + + protected _initGraphics(): void { + this._group = createGroup({ ...getLayoutFromWidget(this._spec.position), angle: this._spec.options.angle }); + this.option.graphicParent.add(this._group); + + this._graphic = this._createGraphic(); + this._graphic.init(); + + this._graphic.applyGraphicAttribute(this._spec.options.graphic); + + this._graphic.applyLayoutData(this._spec.position); + this.hide(); + } + + show(): void { + this._graphic?.show(); + } + hide(): void { + this._graphic?.hide(); + } + + public getGraphicParent() { + return this._group; + } + + public clearCharacter(): void { + if (this._group) { + this._group.parent.removeChild(this._group); + this._graphic = null; + } + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-image.ts b/packages/vstory/src/story/character/component/characters/character-image.ts new file mode 100644 index 0000000..0e32500 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-image.ts @@ -0,0 +1,10 @@ +import { Graphic } from '../graphic/graphic'; +import { CharacterComponent } from '../character'; +import { StoryGraphicType } from '../../../../dsl/constant'; +import { GraphicImage } from '../graphic/image'; + +export class CharacterComponentImage extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicImage(StoryGraphicType.IMAGE, this as any); + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-line.ts b/packages/vstory/src/story/character/component/characters/character-line.ts new file mode 100644 index 0000000..3b4ac83 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-line.ts @@ -0,0 +1,10 @@ +import { Graphic } from '../graphic/graphic'; +import { GraphicLine } from '../graphic/line'; +import { CharacterComponent } from '../character'; +import { StoryGraphicType } from '../../../../dsl/constant'; + +export class CharacterComponentLine extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicLine(StoryGraphicType.RECT, this); + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-qipao.ts b/packages/vstory/src/story/character/component/characters/character-qipao.ts new file mode 100644 index 0000000..c0ee4b7 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-qipao.ts @@ -0,0 +1,9 @@ +import { Graphic } from '../graphic/graphic'; +import { GraphicQipao } from '../graphic/qipao'; +import { CharacterComponent } from '../character'; + +export class CharacterComponentQipao extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicQipao('QipaoComponent', this); + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-rect.ts b/packages/vstory/src/story/character/component/characters/character-rect.ts new file mode 100644 index 0000000..2c09ad8 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-rect.ts @@ -0,0 +1,10 @@ +import { Graphic } from '../graphic/graphic'; +import { GraphicRect } from '../graphic/rect'; +import { CharacterComponent } from '../character'; +import { StoryGraphicType } from '../../../../dsl/constant'; + +export class CharacterComponentRect extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicRect(StoryGraphicType.RECT, this); + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-richtext.ts b/packages/vstory/src/story/character/component/characters/character-richtext.ts new file mode 100644 index 0000000..7c04870 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-richtext.ts @@ -0,0 +1,10 @@ +import { Graphic } from '../graphic/graphic'; +import { GraphicRichText } from '../graphic/richtext'; +import { CharacterComponent } from '../character'; +import { StoryGraphicType } from '../../../../dsl/constant'; + +export class CharacterComponentRichText extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicRichText(StoryGraphicType.RICH_TEXT, this as any); + } +} diff --git a/packages/vstory/src/story/character/component/characters/character-text.ts b/packages/vstory/src/story/character/component/characters/character-text.ts new file mode 100644 index 0000000..dfaaea7 --- /dev/null +++ b/packages/vstory/src/story/character/component/characters/character-text.ts @@ -0,0 +1,13 @@ +import { Graphic } from '../graphic/graphic'; +import { GraphicPureText } from '../graphic/text'; +import { CharacterComponent } from '../character'; +import { StoryGraphicType } from '../../../../dsl/constant'; + +/** + * text component 没有关联 graphic,逻辑与 GraphicText 有所不同 + */ +export class CharacterComponentText extends CharacterComponent { + protected _createGraphic(): Graphic { + return new GraphicPureText(StoryGraphicType.TEXT, this as any); + } +} diff --git a/packages/vstory/src/story/character/component/graphic/graphic-text.ts b/packages/vstory/src/story/character/component/graphic/graphic-text.ts new file mode 100644 index 0000000..b8ea6d0 --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/graphic-text.ts @@ -0,0 +1,141 @@ +import { getLayoutFromWidget } from '../../../utils/layout'; +import { IWidgetData } from '../../dsl-interface'; +import { CharacterGraphics } from '../character'; +import { IText, createText, ITextGraphicAttribute, TextAlignType, TextBaselineType } from '@visactor/vrender-core'; + +export const MAX_LAYOUT_SIZE = 999999; + +export class GraphicText { + private _character: CharacterGraphics; + private _graphic: IText; + constructor(graphicCharacter: CharacterGraphics) { + this._character = graphicCharacter; + } + + show(): void { + this._graphic.setAttributes({ + visible: true + // visibleAll: true, + }); + } + hide(): void { + this._graphic.setAttributes({ + visible: false + // visibleAll: false, + }); + } + + init() { + this._graphic = createText( + this._transformTextAttributes({ + visible: true, + x: 0, + y: 0, + textAlign: 'center', + textBaseline: 'middle', + text: null, + fontSize: 16, + whiteSpace: 'normal', + graphicAlign: 'center', + graphicBaseline: 'middle', + fill: '#000000', + // compute real height without vrender buffer + ignoreBuf: true, + ...(this._character.spec.options?.text ?? {}), + maxLineWidth: MAX_LAYOUT_SIZE, + heightLimit: MAX_LAYOUT_SIZE + }) + ); + this._character.getGraphicParent().add(this._graphic); + } + + applyGraphicAttribute(graphicAttribute: Partial): void { + this._graphic.setAttributes({ ...graphicAttribute }); + } + + getGraphicAttribute(): ITextGraphicAttribute { + return this._graphic?.attribute; + } + + updateAttribute = (attribute: Partial): void => { + if (attribute) { + this._graphic.setAttributes(this._transformTextAttributes(attribute)); + this._updateGraphicCharacterSize(); + } + }; + + applyLayoutData(w: Partial): void { + const layoutData = getLayoutFromWidget(w); + const layoutRatio = this._character.getTextLayoutRatio(); + const graphicAlign = (this._graphic.attribute as any).graphicAlign; + const graphicBaseline = (this._graphic.attribute as any).graphicBaseline; + const left = layoutData.width * layoutRatio.left; + const right = layoutData.width * layoutRatio.right; + const center = (left + right) / 2; + const top = layoutData.height * layoutRatio.top; + const bottom = layoutData.height * layoutRatio.bottom; + const middle = (top + bottom) / 2; + let x = center; + let align: TextAlignType = 'center'; + let y = middle; + let baseline: TextBaselineType = 'middle'; + switch (graphicAlign) { + case 'left': + x = left; + align = 'left'; + break; + case 'center': + x = center; + align = 'center'; + break; + case 'right': + x = right; + align = 'right'; + break; + } + switch (graphicBaseline) { + case 'top': + y = top; + baseline = 'top'; + break; + case 'middle': + y = middle; + baseline = 'middle'; + break; + case 'bottom': + y = bottom; + baseline = 'bottom'; + break; + } + this._graphic.setAttributes( + this._transformTextAttributes({ + x, + y, + textAlign: align, + textBaseline: baseline, + angle: layoutData.angle, + anchor: [layoutData.width / 2, layoutData.height / 2], + scaleCenter: [layoutData.width / 2, layoutData.height / 2], + maxLineWidth: right - left, + heightLimit: this._character.graphic.getGraphicAttribute().isResized ? bottom - top : MAX_LAYOUT_SIZE + }) + ); + } + + private _updateGraphicCharacterSize() { + if (!this._character.graphic.getGraphicAttribute().isResized) { + const layoutRatio = this._character.graphic.getTextLayoutRatio(); + const textHeight = this._graphic.AABBBounds.height(); + const minGraphicHeight = this._character.graphic.getInitialAttributes().height; + const graphicHeight = Math.max(textHeight / (layoutRatio.bottom - layoutRatio.top), minGraphicHeight); + this._character.graphic.applyLayoutData({ + height: graphicHeight + }); + this.applyLayoutData(this._character.graphic.getPositionData()); + } + } + + private _transformTextAttributes(attributes: ITextGraphicAttribute): ITextGraphicAttribute { + return attributes; + } +} diff --git a/packages/vstory/src/story/character/component/graphic/graphic.ts b/packages/vstory/src/story/character/component/graphic/graphic.ts new file mode 100644 index 0000000..e97e226 --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/graphic.ts @@ -0,0 +1,127 @@ +import type { IGraphic } from '@visactor/vrender-core'; +import type { IPointLike } from '@visactor/vutils'; +import { isValid } from '@visactor/vutils'; +import { CharacterComponent } from '../character'; +import { IComponentCharacterSpec, IWidgetData } from '../..'; +import { getLayoutFromWidget } from '../../../utils/layout'; + +export interface IGraphicConstructor { + new (type: string, character: CharacterComponent): Graphic; +} + +export abstract class Graphic { + readonly containsShapePoints: boolean = false; + type: string; + + protected _character: CharacterComponent; + protected _graphic: IGraphic; + get graphic() { + return this._graphic; + } + protected _group: IGraphic; + + constructor(type: string, character: CharacterComponent) { + this.type = type; + this._character = character; + } + + abstract init(): void; + + getBounds() { + return this._graphic.AABBBounds; + } + + release() { + if (this._graphic) { + this._graphic.parent.removeChild(this._graphic); + this._graphic = null; + } + } + + getInitialAttributes(): any { + return { + x: 0, + y: 0, + width: 120, + height: 80, + angle: 0, + anchor: [60, 40], + lineWidth: 2, + stroke: '#000000', + shapePoints: [] as IPointLike[] + }; + } + + show(): void { + this._graphic.setAttributes({ + visible: true, + visibleAll: true + }); + } + hide(): void { + this._graphic.setAttributes({ + visible: false, + visibleAll: false + }); + } + + getGraphicAttribute(): IComponentCharacterSpec['options']['graphic'] { + return this._graphic?.attribute; + } + + applyGraphicAttribute(graphicAttribute: IComponentCharacterSpec['options']['graphic']): void { + this._graphic.setAttributes( + this._transformAttributes({ + ...graphicAttribute + }) + ); + } + + getPositionData() { + return { + x: this._graphic.attribute.x, + y: this._graphic.attribute.y, + width: this._graphic.attribute.width, + height: this._graphic.attribute.height, + angle: this._graphic.attribute.angle, + shapePoints: this._graphic.attribute.shapePoints + }; + } + + applyLayoutData(layoutData: Partial): void { + this._graphic.setAttributes( + this._transformAttributes({ + ...getLayoutFromWidget(layoutData), + shapePoints: this._character.spec.options.shapePoints + }) + ); + } + + getTextLayoutRatio(): { left: number; right: number; top: number; bottom: number } { + return { + left: 0, + right: 1, + top: 0, + bottom: 1 + }; + } + + protected _transformAttributes(attributes: any): any { + // const x = attributes.x ?? this._graphic?.attribute.x; + // const y = attributes.y ?? this._graphic?.attribute.y; + const width = attributes.width ?? this._graphic?.attribute.width; + const height = attributes.height ?? this._graphic?.attribute.height; + + const transformedAttributes = Object.assign({}, attributes); + Object.keys(transformedAttributes).forEach(key => { + if (!isValid(attributes[key])) { + delete transformedAttributes[key]; + } + }); + transformedAttributes.anchor = [width / 2, height / 2]; + transformedAttributes.scaleCenter = [width / 2, height / 2]; + transformedAttributes.x = 0; + transformedAttributes.y = 0; + return transformedAttributes; + } +} diff --git a/packages/vstory/src/story/character/component/graphic/image.ts b/packages/vstory/src/story/character/component/graphic/image.ts new file mode 100644 index 0000000..06e1d1c --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/image.ts @@ -0,0 +1,34 @@ +import type { IImage } from '@visactor/vrender-core'; +import { createImage } from '@visactor/vrender-core'; +import type { IPointLike } from '@visactor/vutils'; +import { Graphic } from './graphic'; + +export class GraphicImage extends Graphic { + protected _graphic: IImage; + + getInitialAttributes() { + return { + x: 0, + y: 0, + width: 120, + height: 80, + image: '', + angle: 0, + anchor: [60, 40], + shapePoints: [] as IPointLike[] + }; + } + + init() { + if (!this._graphic) { + this._graphic = createImage( + this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + ); + this._graphic.name = `graphic-image-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } +} diff --git a/packages/vstory/src/story/character/component/graphic/line.ts b/packages/vstory/src/story/character/component/graphic/line.ts new file mode 100644 index 0000000..2cadcaf --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/line.ts @@ -0,0 +1,33 @@ +import type { ILine, ILineGraphicAttribute } from '@visactor/vrender-core'; +import { createLine } from '@visactor/vrender-core'; +import type { IPointLike } from '@visactor/vutils'; +import { Graphic } from './graphic'; + +export class GraphicLine extends Graphic { + protected _graphic: ILine; + + getInitialAttributes() { + return { + x: 0, + y: 0, + points: [] as ILineGraphicAttribute['points'], + angle: 0, + lineWidth: 2, + stroke: '#000000', + shapePoints: [] as IPointLike[] + }; + } + + init() { + if (!this._graphic) { + this._graphic = createLine( + this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + ); + this._graphic.name = `graphic-line-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } +} diff --git a/packages/vstory/src/story/character/component/graphic/qipao.ts b/packages/vstory/src/story/character/component/graphic/qipao.ts new file mode 100644 index 0000000..aa8d81c --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/qipao.ts @@ -0,0 +1,34 @@ +import type { ISymbol } from '@visactor/vrender-core'; +import { createSymbol } from '@visactor/vrender-core'; +import { Graphic } from './graphic'; + +export class GraphicQipao extends Graphic { + protected _graphic: ISymbol; + + getInitialAttributes() { + return { + x: 0, + y: 0, + symbolType: + 'M649.6 812.8l-114.976 114.944a32 32 0 0 1-45.248 0L374.4 812.8H128a64 64 0 0 1-64-64V160a64 64 0 0 1 64-64h768a64 64 0 0 1 64 64v588.8a64 64 0 0 1-64 64h-246.4z', + angle: 0, + size: 40, + lineWidth: 2, + stroke: 'pink' + }; + } + + init() { + if (!this._graphic) { + this._graphic = createSymbol({ + ...this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + }); + console.log(this._graphic); + this._graphic.name = `graphic-qipao-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } +} diff --git a/packages/vstory/src/story/character/component/graphic/rect.ts b/packages/vstory/src/story/character/component/graphic/rect.ts new file mode 100644 index 0000000..d76687c --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/rect.ts @@ -0,0 +1,35 @@ +import type { IRect } from '@visactor/vrender-core'; +import { createRect } from '@visactor/vrender-core'; +import type { IPointLike } from '@visactor/vutils'; +import { Graphic } from './graphic'; + +export class GraphicRect extends Graphic { + protected _graphic: IRect; + + getInitialAttributes() { + return { + x: 0, + y: 0, + width: 120, + height: 80, + angle: 0, + anchor: [60, 40], + lineWidth: 2, + stroke: '#000000', + shapePoints: [] as IPointLike[] + }; + } + + init() { + if (!this._graphic) { + this._graphic = createRect( + this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + ); + this._graphic.name = `graphic-rect-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } +} diff --git a/packages/vstory/src/story/character/component/graphic/richtext.ts b/packages/vstory/src/story/character/component/graphic/richtext.ts new file mode 100644 index 0000000..e1ddfb9 --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/richtext.ts @@ -0,0 +1,56 @@ +import type { IRichText, IRichTextAttribute } from '@visactor/vrender-core'; +import { createRichText } from '@visactor/vrender-core'; +import { Graphic } from './graphic'; +import { IWidgetData } from '../../dsl-interface'; +import { getLayoutFromWidget } from '../../../utils/layout'; + +export class GraphicRichText extends Graphic { + protected _graphic: IRichText; + + getInitialAttributes() { + return { + x: 0, + y: 0, + width: 120, + height: 80, + maxWidth: 120, + maxHeight: 80, + angle: 0, + fontSize: 16, + textAlign: 'center', + textBaseline: 'middle', + fill: '#000000', + lineWidth: 2, + ignoreBuf: true, + stroke: false, + ellipsis: true, + textConfig: [] + } as Partial; + } + + init() { + if (!this._graphic) { + this._graphic = createRichText( + this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + ); + this._graphic.name = `graphic-richtext-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } + + applyLayoutData(w: Partial) { + const { x, y, width, height, angle } = getLayoutFromWidget(w); + this._graphic.setAttributes( + this._transformAttributes({ + x, + y, + angle, + maxWidth: width, + maxHeight: height + }) + ); + } +} diff --git a/packages/vstory/src/story/character/component/graphic/text.ts b/packages/vstory/src/story/character/component/graphic/text.ts new file mode 100644 index 0000000..1d1e0cd --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/text.ts @@ -0,0 +1,56 @@ +import type { IText } from '@visactor/vrender-core'; +import { createText } from '@visactor/vrender-core'; +import type { IPointLike } from '@visactor/vutils'; +import { Graphic } from './graphic'; +import { IWidgetData } from '../../dsl-interface'; +import { getLayoutFromWidget } from '../../../utils/layout'; + +export class GraphicPureText extends Graphic { + protected _graphic: IText; + + getInitialAttributes() { + return { + x: 0, + y: 0, + width: 120, + height: 80, + angle: 0, + fontSize: 16, + textAlign: 'center', + textBaseline: 'middle', + fill: '#000000', + lineWidth: 2, + ignoreBuf: true, + stroke: false, + shapePoints: [] as IPointLike[] + }; + } + + init() { + if (!this._graphic) { + this._graphic = createText( + this._transformAttributes({ + ...this.getInitialAttributes(), + ...(this._character.spec.options?.graphic ?? {}) + }) + ); + this._graphic.name = `graphic-text-${this._character.id}`; + this._character.getGraphicParent().add(this._graphic); + } + } + + applyLayoutData(w: Partial) { + const { x, y, width, height, angle } = getLayoutFromWidget(w); + this._graphic.setAttributes( + this._transformAttributes({ + x, + y, + angle, + width, + height, + maxLineWidth: width, + heightLimit: height + }) + ); + } +} diff --git a/packages/vstory/src/story/character/component/graphic/utils.ts b/packages/vstory/src/story/character/component/graphic/utils.ts new file mode 100644 index 0000000..418a95e --- /dev/null +++ b/packages/vstory/src/story/character/component/graphic/utils.ts @@ -0,0 +1,18 @@ +import { IComponentCharacterSpec } from '../../dsl-interface'; + +export const transformAttributesByType = ( + from: string, + to: string, + attributes: IComponentCharacterSpec['options'] +): IComponentCharacterSpec['options'] => { + const graphic = attributes.graphic; + // shapePoints will not be cloned + delete graphic.shapePoints; + // FIXME: rect line width is half to path graphics due to VRender logic + if (from === 'rect') { + graphic.lineWidth = graphic.lineWidth * 2; + } else if (to === 'rect') { + graphic.lineWidth = Math.ceil(graphic.lineWidth / 2); + } + return attributes; +}; diff --git a/packages/vstory/src/story/character/dsl-interface.ts b/packages/vstory/src/story/character/dsl-interface.ts new file mode 100644 index 0000000..71a3bbf --- /dev/null +++ b/packages/vstory/src/story/character/dsl-interface.ts @@ -0,0 +1,91 @@ +import { ITextGraphicAttribute } from '@visactor/vrender-core'; +import { DirectionType } from './chart/const'; + +export type IPercent = `${number}%`; +export type WidgetNumber = number; // | IPercent; + +export type IWidgetData = { + left: WidgetNumber; + top: WidgetNumber; +} & ( + | { + bottom: WidgetNumber; + right: WidgetNumber; + } + | { + width: WidgetNumber; + height: WidgetNumber; + } +); + +export interface ICharacterSpecBase { + id: string; + type: string; // 类型 + position: IWidgetData; // 定位描述 + zIndex: number; +} + +export type IEditorTextGraphicAttribute = { + graphicAlign?: 'left' | 'center' | 'right'; + graphicBaseline?: 'top' | 'middle' | 'bottom'; +} & ITextGraphicAttribute; + +export interface IComponentCharacterSpec extends ICharacterSpecBase { + options: { + graphic: any; + text?: IEditorTextGraphicAttribute; + isResized?: boolean; + angle?: number; + shapePoints?: any; + }; +} + +export interface IComponentMatch { + usrId?: string; + specIndex?: number | 'all'; // all 表示所有 + [key: string]: any; +} + +export interface IComponentSpec { + specKey: string; + matchInfo: IComponentMatch; + spec: any; +} + +export interface IChartCharacterSpec extends ICharacterSpecBase { + options: { + // 图表spec + spec?: any; + panel?: any; + // 各种图表配置属性 + theme?: any; + // 数据源 + data?: any; + // 内部模块布局信息 + padding?: any; + // 标题 + title?: any; + layout?: any; + // 色板 + color?: string[]; + // 标注 + marker?: any; + // mark单元素样式配置 + markStyle?: any[]; + // 组样式 + dataGroupSpec?: { + [key: string]: any; + }; + // 方向 + direction?: DirectionType; + // 系列配置 + seriesSpec?: { + matchInfo: IComponentMatch; + spec: any; + }[]; + // 模块 spec + componentSpec?: IComponentSpec[]; + }; +} + +export type ICharacterSpec = IChartCharacterSpec | IComponentCharacterSpec; diff --git a/packages/vstory/src/story/character/index.ts b/packages/vstory/src/story/character/index.ts new file mode 100644 index 0000000..4df47b1 --- /dev/null +++ b/packages/vstory/src/story/character/index.ts @@ -0,0 +1,2 @@ +export * from './dsl-interface'; +export * from './runtime-interface'; diff --git a/packages/vstory/src/story/character/runtime-interface.ts b/packages/vstory/src/story/character/runtime-interface.ts new file mode 100644 index 0000000..b07b267 --- /dev/null +++ b/packages/vstory/src/story/character/runtime-interface.ts @@ -0,0 +1,46 @@ +import { IGroup } from '@visactor/vrender-core'; +import { IPointLike } from '@visactor/vutils'; +import { StoryCanvas } from '../canvas/canvas'; +import { IStory, StoryEvent } from '../interface/runtime-interface'; +import { ICharacterSpec } from './dsl-interface'; + +export interface ICharacterPickInfo { + part: string; +} +export interface ICharacter { + id: string; + spec: ICharacterSpec; + + init(): void; + reset(): void; + show(): void; + hide(): void; + getGraphicParent(): IGroup; + tickTo(t: number): void; + + checkEvent(event: StoryEvent): false | (ICharacterPickInfo & any); + + updateSpec(spec: Omit, 'id' | 'type'>): void; +} + +export interface ICharacterInitOption { + story: IStory; + canvas: StoryCanvas; + graphicParent: IGroup; +} + +export interface ICharacterConstructor { + new (spec: ICharacterSpec, option: ICharacterInitOption): ICharacter; +} + +export interface ILayoutAttribute { + x: number; + y: number; + width: number; + height: number; + angle: number; + anchor?: [number | string, number | string]; + dx?: number; + dy?: number; + shapePoints?: IPointLike[]; +} diff --git a/packages/vstory/src/story/character/visactor/character.ts b/packages/vstory/src/story/character/visactor/character.ts new file mode 100644 index 0000000..9d792ed --- /dev/null +++ b/packages/vstory/src/story/character/visactor/character.ts @@ -0,0 +1,77 @@ +/* eslint-disable no-console */ +import { ICharacterSpec } from 'src/story/character/dsl-interface'; +import { CharacterBase } from '../base/base'; +import type { ISpecProcess, ICharacterVisactor, IVisactorGraphic } from './interface'; +import { ICharacterInitOption } from '../runtime-interface'; +import { IChartCharacterRuntime } from '../chart/runtime/interface'; + +export abstract class CharacterVisactor extends CharacterBase implements ICharacterVisactor { + protected declare _specProcess: ISpecProcess; + get specProcess() { + return this._specProcess; + } + get dataTempTransform() { + return this._specProcess.dataTempTransform; + } + + get chartType() { + return this._specProcess.dataTempTransform.specTemp?.getChartType(); + } + + get tempType() { + return this._specProcess.dataTempTransform.specTemp?.type; + } + + protected declare _graphic: IVisactorGraphic; + get graphic() { + return this._graphic; + } + + protected _runtime: IChartCharacterRuntime[] = []; + + constructor(spec: ICharacterSpec, option: ICharacterInitOption) { + super(spec, option); + this._initSpecProcess(); + } + + protected _initRuntime(): void {} + + clearConfig(opt: { clearCurrent: false | { [key: string]: any } }) { + // do nothing + } + + protected abstract _initSpecProcess(): void; + + onSpecReady = () => { + console.log('onSpecReady !'); + this._runtime.forEach(r => r.onSpecReady?.()); + this._specProcess.dataTempTransform.specTemp?.standardizedSpec(this._specProcess.getVisSpec(), { character: this }); + this._updateVisactorSpec(); + this._afterRender(); + }; + + protected abstract _afterRender(): void; + + protected abstract _updateVisactorSpec(): void; + + show(): void { + this._graphic.setAttribute('visibleAll', true); + } + hide(): void { + this._graphic.setAttribute('visibleAll', false); + } + + getGraphicParent() { + return this._graphic; + } + + tickTo(t: number): void { + return; + } + + release() { + this._specProcess.release(); + this._graphic?.parent?.removeChild(this._graphic); + this._specProcess = this._graphic = null; + } +} diff --git a/packages/vstory/src/story/character/visactor/data-temp-transform-base.ts b/packages/vstory/src/story/character/visactor/data-temp-transform-base.ts new file mode 100644 index 0000000..7c88a0c --- /dev/null +++ b/packages/vstory/src/story/character/visactor/data-temp-transform-base.ts @@ -0,0 +1,101 @@ +import { StoryFactory } from '../../factory/factory'; +import type { + IVisactorTemp, + IDataTempTransform, + ISpecProcess, + ICharacterVisactor, + IUpdateAttributeOption +} from './interface'; +import { EventEmitter } from '@visactor/vutils'; + +export class DataTempTransformBase implements IDataTempTransform { + protected _state = 'alive'; + + protected _specTemp: IVisactorTemp = null; + get specTemp() { + return this._specTemp; + } + + protected _character: ICharacterVisactor; + protected _specProcess: ISpecProcess; + + // 当图表类或者数据更新时,先使用 next 验证是否可用,可用再更新 + protected _nextTemp: IVisactorTemp = null; + get nextTemp() { + return this._nextTemp; + } + + protected _changeType: 'data' | 'temp' | 'dataTemp' | 'none' = 'none'; + + protected _updateOption: IUpdateAttributeOption = {}; + + emitter: EventEmitter = new EventEmitter(); + + constructor({ specProcess, character }: { character: ICharacterVisactor; specProcess: ISpecProcess }) { + this._character = character; + this._specProcess = specProcess; + } + + protected _setNoHistoryState() { + this._updateOption = this._updateOption || {}; + if (this._updateOption.triggerHistory) { + this._updateOption.saveData = true; + this._updateOption.triggerHistory = false; + } + } + + updateChartTemp(temp: string) { + if (!this._createNextTemp(temp)) { + return; + } + this._changeType = 'temp'; + if (this._checkEnable(this._nextTemp)) { + const currentTemp = this._specTemp; + this._setTempToNext(); + this.emitter.emit('tempUpdate', this._updateOption, { currentTemp, nextTemp: this._specTemp }); + this.emitter.emit('specReady'); + } else { + // fail + } + this._changeType = 'none'; + } + + protected _setTempToNext() { + this._specTemp?.clear(); + this._specTemp = this._nextTemp; + this._nextTemp = null; + } + + protected _createNextTemp(temp: string) { + if (temp === this._specTemp?.type) { + console.warn('same temp type:', temp); + return false; + } + this._nextTemp?.clear(); + this._nextTemp = StoryFactory.createChartTemp(temp, this._specProcess.getCharacterSpec()); + return !!this._nextTemp; + } + + protected _checkEnable(temp: IVisactorTemp) { + if (!temp) { + return false; + } + if (temp.checkDataEnable(this._specProcess.getCharacterSpec().options.data)) { + return true; + } + return false; + } + + getBaseSpec() { + console.log('this', this._character); + return this._specTemp.getSpec(this._specProcess.getCharacterSpec().options.data, { character: this._character }); + } + + release() { + this._state = 'release'; + this._specTemp?.clear(); + this._nextTemp?.clear(); + this.emitter.removeAllListeners(); + this.emitter = this._specTemp = null; + } +} diff --git a/packages/vstory/src/story/character/visactor/interface.ts b/packages/vstory/src/story/character/visactor/interface.ts new file mode 100644 index 0000000..099238a --- /dev/null +++ b/packages/vstory/src/story/character/visactor/interface.ts @@ -0,0 +1,139 @@ +import { IChartCharacterSpec } from '../dsl-interface'; +import type { EventEmitter } from '@visactor/vutils'; +import type { ICharacter } from '../runtime-interface'; +import type { ISpec, IVChart } from '@visactor/vchart'; +import { IGroup } from '@visactor/vrender-core'; + +export type StandardData = IDataValue | IDataValue[]; +export type IParserValue = any; +export type DataUpdateCall = (data: StandardData) => void; +export type DataErrorCall = (msg: { type: string; info: string }, opt?: any) => void; + +// visactor 元素的内部结构 +// 数据部分 start +// DataParser:数据处理。负责解析数据,得到模版可用数据,处理数据上的特性内容。 +// VisactorTemp:模版处理。负责结合数据,生成对应类型的基础 spec。不同类型图表的特殊逻辑,在 temp 中处理 +// DataTempTransform:数据与模版更新管理,当数据/模版更新时,通过这个模块判定更新是否成功,成功后抛出更新成功消息。包含 VisactorTemp 与 DataParser +// SpecProcess:编辑配置管理器,编辑属性更新的处理,对外输出合并了编辑信息的 spec 。包含一个 dataTempTransform +// 数据部分 end + +// graphic 部分 start +// IVisactorGraphic:包含一个 vchart|vtbale 。visactor 的自定义图元封装。处理图元是否重绘,viewBox的图元属性逻辑 +// IVisactorGraphic-render:实际的 draw 入口,处理绘图过程,主要是处理变换矩阵。 +// graphic 部分 end + +// Visactor-role:编辑元素,包含一个 specProcess、IVisactorGraphic + +export interface IDataTempTransform { + readonly specTemp: IVisactorTemp; + + readonly nextTemp: IVisactorTemp; + emitter: EventEmitter; + + updateChartTemp: (temp?: string) => void; + + // 得到没有经过编辑器配置加工过的基础spec + getBaseSpec: () => any; + + // 释放 + release: () => void; +} + +export interface IDataTempTransformConstructor { + new ({ specProcess, character }: { character: ICharacterVisactor; specProcess: ISpecProcess }): IDataTempTransform; +} + +export interface ISpecProcess { + dataTempTransform: IDataTempTransform; + emitter: EventEmitter; + + // 得到visactor元素的spec + getVisSpec: () => ISpec; + // 得到角色的spec + getCharacterSpec: () => IChartCharacterSpec; + + // temp + getCharacterType: () => string; + + release: () => void; +} + +export type IDataType = any; + +export interface IDataValue { + id: string; + sourceKey: string; + values: IDataType[]; +} + +export type DataInfo = { + [key: string]: { + type: 'ordinal' | 'linear'; + }; +}; + +export type DataSave = { + type: string; + value: any; +}; + +export interface IDataParser { + type: string; + getData: () => StandardData; + getDataValue: () => IParserValue; + getDataInfo?: () => DataInfo; + getSpecOption?: () => any; + getSave: () => DataSave; + updateValue: (value: IParserValue) => void; + setDataUpdateHandler: (call: DataUpdateCall) => void; + setDataErrorHandler: (call: DataErrorCall) => void; + clear: () => void; +} + +export interface IDataParserConstructor { + type: string; + new ( + value: any, + option: { + updateCall: DataUpdateCall; + errorCall: DataErrorCall; + currentData?: IDataParser; + emitter: EventEmitter; + } + ): IDataParser; +} + +// chart & table 都是用这个模版接口 +export interface IVisactorTemp { + type: string; + getSpec: (data: StandardData, ctx: any, opt?: any) => ISpec | null; + standardizedSpec: (spec: any, ctx: any, opt?: any) => void; + getChartType: () => string; + checkDataEnable: (data: StandardData, opt?: any) => boolean; + getTempInfo?: () => any; + clear: () => void; +} + +export interface IVisactorTempConstructor { + new (): IVisactorTemp; +} + +// 绘图元素 +export interface IVisactorGraphic extends IGroup { + readonly vProduct: IVChart; + + updateSpec(spec: any): void; +} + +// 编辑元素 +export interface ICharacterVisactor extends ICharacter { + // 清除编辑数据 + clearConfig: (opt: { clearCurrent: false | { [key: string]: any } }) => void; + getGraphicParent: () => IVisactorGraphic; +} + +export interface IUpdateAttributeOption { + triggerHistory?: boolean; + saveData?: boolean; + actionType?: 'data-add' | 'data-change' | 'data-replace' | string; +} diff --git a/packages/vstory/src/story/character/visactor/spec-process-base.ts b/packages/vstory/src/story/character/visactor/spec-process-base.ts new file mode 100644 index 0000000..f4d395d --- /dev/null +++ b/packages/vstory/src/story/character/visactor/spec-process-base.ts @@ -0,0 +1,96 @@ +import { IChartCharacterSpec } from '../dsl-interface'; +import { EventEmitter, cloneDeep } from '@visactor/vutils'; +import type { + IDataTempTransform, + IDataTempTransformConstructor, + ISpecProcess, + ICharacterVisactor, + IUpdateAttributeOption, + IVisactorTemp +} from './interface'; + +export abstract class SpecProcessBase implements ISpecProcess { + // 编辑器spec 存储和加载都是这个数据结构 + // 保证结构可序列化。 + protected _characterSpec: IChartCharacterSpec; + protected _onSpecReadyCall: () => void = null; + // vTableSpec 只作为临时转换结果,传递给vTable,不会存储。 + protected _visSpec: any; + + protected _dataTempTransform: IDataTempTransform; + get dataTempTransform() { + return this._dataTempTransform; + } + + protected _character: ICharacterVisactor = null; + + emitter: EventEmitter = new EventEmitter(); + + constructor(character: ICharacterVisactor, DataTempClass: IDataTempTransformConstructor, call: () => void) { + this._character = character; + this._dataTempTransform = new DataTempClass({ + character, + specProcess: this + }); + this._onSpecReadyCall = call; + this._dataTempTransform.emitter.on('specReady', this.transformSpec); + this._dataTempTransform.emitter.on('tempUpdate', this._tempUpdateSuccess); + this._dataTempTransform.emitter.on('dataUpdate', this._dataUpdateSuccess); + } + + // transform spec 的过程 + protected abstract _mergeConfig(): void; + + getVisSpec() { + return this._visSpec; + } + + getCharacterSpec() { + return this._characterSpec; + } + + protected _dataUpdateSuccess = (option: IUpdateAttributeOption) => { + this.emitter.emit('beforeTempChange'); + this._characterSpec.options.data = this._dataTempTransform.dataParser.getSave(); + this.emitter.emit('afterDataChange'); + }; + protected _tempUpdateSuccess = ( + option: IUpdateAttributeOption, + transParams: { currentTemp: IVisactorTemp; nextTemp: IVisactorTemp } + ) => { + const willPushHistory = option?.triggerHistory !== false; + this.emitter.emit('beforeTempChange', willPushHistory, transParams); + this._characterSpec.type = this._dataTempTransform.specTemp.type; + this.emitter.emit('afterTempChange', transParams); + }; + protected _dataTempUpdateSuccess = ( + option: IUpdateAttributeOption, + transParams: { currentTemp: IVisactorTemp; nextTemp: IVisactorTemp } + ) => { + const willPushHistory = option?.triggerHistory !== false; + this.emitter.emit('beforeTempChange', willPushHistory, transParams); + this._characterSpec.options.data = this._dataTempTransform.dataParser.getSave(); + this._characterSpec.type = this._dataTempTransform.specTemp.type; + this.emitter.emit('afterTempChange', transParams); + }; + + protected transformSpec = () => { + this._visSpec = this._dataTempTransform.getBaseSpec(); + this._mergeConfig(); + this._onSpecReadyCall(); + }; + + release() { + this._onSpecReadyCall = null; + this._dataTempTransform.release(); + this._dataTempTransform = null; + this._characterSpec = null; + this._visSpec = null; + this._character = null; + } + + // 得到模版类型 + getCharacterType() { + return this._characterSpec.type; + } +} diff --git a/packages/vstory/src/story/factory/factory.ts b/packages/vstory/src/story/factory/factory.ts new file mode 100644 index 0000000..432b188 --- /dev/null +++ b/packages/vstory/src/story/factory/factory.ts @@ -0,0 +1,58 @@ +import { IDataParserConstructor } from '../character/visactor/interface'; +import { IGraphicConstructor } from '../character/component/graphic/graphic'; +import { ICharacterConstructor, ICharacterInitOption } from '../character/runtime-interface'; +import { ICharacterSpec } from '../character/dsl-interface'; +import { IChartTempConstructor } from '../character/chart/temp/interface'; + +export class StoryFactory { + static characterMap: { [key: string]: ICharacterConstructor } = {}; + static registerCharacter(type: string, c: ICharacterConstructor) { + StoryFactory.characterMap[type] = c; + } + static createCharacter(spec: ICharacterSpec, opt: ICharacterInitOption) { + const classC = StoryFactory.characterMap[spec.type]; + if (!classC) { + console.error('获取模板失败', spec); + return null; + } + const el = new classC(spec, opt); + el.init(); + return el; + } + + static graphicMap: { [key: string]: IGraphicConstructor } = {}; + static registerGraphic(type: string, c: IGraphicConstructor) { + StoryFactory.graphicMap[type] = c; + } + static createGraphic(type: string, opt: any) { + const classC = StoryFactory.graphicMap[type]; + if (!classC) { + return null; + } + return new classC(type, opt); + } + + static dataParserMap: { [key: string]: IDataParserConstructor } = {}; + static registerDataParser(type: string, c: IDataParserConstructor) { + StoryFactory.dataParserMap[type] = c; + } + static createDataParser(type: string, opt: any) { + const classC = StoryFactory.dataParserMap[type]; + if (!classC) { + return null; + } + return new classC(type, opt); + } + + static chartTempMap: { [key: string]: IChartTempConstructor } = {}; + static registerChartTemp(type: string, c: IChartTempConstructor) { + StoryFactory.chartTempMap[type] = c; + } + static createChartTemp(type: string, opt: any) { + const classC = StoryFactory.chartTempMap[type]; + if (!classC) { + return null; + } + return new classC(opt); + } +} diff --git a/packages/vstory/src/story/index.ts b/packages/vstory/src/story/index.ts new file mode 100644 index 0000000..f1043d7 --- /dev/null +++ b/packages/vstory/src/story/index.ts @@ -0,0 +1,57 @@ +import { CharacterComponentQipao } from './character/component/characters/character-qipao'; +import { CharacterComponentRect } from './character/component/characters/character-rect'; +import { StoryFactory } from './factory/factory'; +import { CharacterChart } from './character/chart/character'; +import { ContainerModule, GraphicRender, container } from '@visactor/vrender-core'; +import { CanvasPickerContribution } from '@visactor/vrender-kits'; +import { ChartRender, VChartRender } from './character/chart/graphic/vchart-graphic-render'; +import { BarChartCharacter } from './character/chart/characters/bar'; +import { LineChartCharacter } from './character/chart/characters/line'; +import { AreaChartCharacter } from './character/chart/characters/area'; +import { PieChartCharacter } from './character/chart/characters/pie'; +import { RoseChartCharacter } from './character/chart/characters/rose'; +import { RadarChartCharacter } from './character/chart/characters/radar'; +import { WordCloudCharacter } from './character/chart/characters/wordcloud'; +import { TreeMapChartCharacter } from './character/chart/characters/treemap'; +import { SunburstChartCharacter } from './character/chart/characters/sunburst'; +import { ScatterChartCharacter } from './character/chart/characters/scatter'; +import { RangeColumnChartCharacter } from './character/chart/characters/rangeColumn'; +import { CharacterComponentText } from './character/component/characters/character-text'; +import { CharacterComponentRichText } from './character/component/characters/character-richtext'; +import { VChartPicker } from './character/chart/graphic/vchart-graphic-picker'; +import { StoryGraphicType } from '../dsl/constant'; +import { CharacterComponentLine } from './character/component/characters/character-line'; +import { CharacterComponentImage } from './character/component/characters/character-image'; + +StoryFactory.registerCharacter(BarChartCharacter.type, BarChartCharacter); +StoryFactory.registerCharacter(LineChartCharacter.type, CharacterChart); +StoryFactory.registerCharacter(CharacterChart.type, CharacterChart); +StoryFactory.registerCharacter(AreaChartCharacter.type, AreaChartCharacter); +StoryFactory.registerCharacter(PieChartCharacter.type, PieChartCharacter); +StoryFactory.registerCharacter(RoseChartCharacter.type, RoseChartCharacter); +StoryFactory.registerCharacter(RadarChartCharacter.type, RadarChartCharacter); +StoryFactory.registerCharacter(WordCloudCharacter.type, WordCloudCharacter); +StoryFactory.registerCharacter(TreeMapChartCharacter.type, TreeMapChartCharacter); +StoryFactory.registerCharacter(SunburstChartCharacter.type, SunburstChartCharacter); +StoryFactory.registerCharacter(ScatterChartCharacter.type, ScatterChartCharacter); +StoryFactory.registerCharacter(RangeColumnChartCharacter.type, RangeColumnChartCharacter); + +// StoryFactory.registerCharacter('BarChart', CharacterChart); +// StoryFactory.registerCharacter('CharacterChart', CharacterChart); +// StoryFactory.registerCharacter('LineChart', CharacterChart); +StoryFactory.registerCharacter(StoryGraphicType.RECT, CharacterComponentRect); +StoryFactory.registerCharacter(StoryGraphicType.TEXT, CharacterComponentText); +StoryFactory.registerCharacter(StoryGraphicType.RICH_TEXT, CharacterComponentRichText); +StoryFactory.registerCharacter(StoryGraphicType.QIPAO, CharacterComponentQipao); +StoryFactory.registerCharacter(StoryGraphicType.LINE, CharacterComponentLine); +StoryFactory.registerCharacter(StoryGraphicType.IMAGE, CharacterComponentImage); + +const splitModule = new ContainerModule((bind, unbind, isBound, rebind) => { + // chart渲染器注入 + bind(VChartRender).toSelf().inSingletonScope(); + bind(ChartRender).toService(VChartRender); + bind(GraphicRender).toService(ChartRender); + bind(VChartPicker).to(VChartPicker).inSingletonScope(); + bind(CanvasPickerContribution).toService(VChartPicker); +}); +container.load(splitModule); diff --git a/packages/vstory/src/story/interface/dsl-interface.ts b/packages/vstory/src/story/interface/dsl-interface.ts new file mode 100644 index 0000000..05bf90f --- /dev/null +++ b/packages/vstory/src/story/interface/dsl-interface.ts @@ -0,0 +1,29 @@ +import { Action } from '../../dsl/types'; +import { ICharacterSpec } from '../character'; + +export interface IAction { + startTime: number; + action: string; + duration: number; + payload?: Action['payload']; +} + +export interface IStorySpec { + acts: IActSpec[]; // 作品的章节 + characters: ICharacterSpec[]; // 作品中的元素 +} + +export interface IActionsLink { + characterId: string; + characterActions: IAction[]; +} + +export type ISceneSpec = { + id: string; + actions: IActionsLink[]; +}; + +export interface IActSpec { + id: string; + scenes: ISceneSpec[]; +} diff --git a/packages/vstory/src/story/interface/index.ts b/packages/vstory/src/story/interface/index.ts new file mode 100644 index 0000000..4df47b1 --- /dev/null +++ b/packages/vstory/src/story/interface/index.ts @@ -0,0 +1,2 @@ +export * from './dsl-interface'; +export * from './runtime-interface'; diff --git a/packages/vstory/src/story/interface/player.ts b/packages/vstory/src/story/interface/player.ts new file mode 100644 index 0000000..5a68dac --- /dev/null +++ b/packages/vstory/src/story/interface/player.ts @@ -0,0 +1,17 @@ +import { ICharacter } from '../character'; +import { IActSpec } from './dsl-interface'; + +export interface IPlayer { + tickTo(t: number): void; + play(): void; + encodeToVideo(millsecond: number, fps: number): Promise; + pause(): void; + release(): void; + addAct( + c: IActSpec, + characters: { + [key: string]: ICharacter; + } + ): void; + setCurrentAct(id: number | string): void; +} diff --git a/packages/vstory/src/story/interface/runtime-interface.ts b/packages/vstory/src/story/interface/runtime-interface.ts new file mode 100644 index 0000000..2334a5f --- /dev/null +++ b/packages/vstory/src/story/interface/runtime-interface.ts @@ -0,0 +1,14 @@ +import { IGraphic } from '@visactor/vrender-core'; + +export interface IStoryInitOption { + dom: string | HTMLDivElement; // dom id +} + +export interface IStory { + readonly id: string; +} + +export type StoryEvent = Event & { + detailPath: IGraphic[]; + path: IGraphic[]; +}; diff --git a/packages/vstory/src/story/player/encode.ts b/packages/vstory/src/story/player/encode.ts new file mode 100644 index 0000000..ab6831f --- /dev/null +++ b/packages/vstory/src/story/player/encode.ts @@ -0,0 +1,67 @@ +import { FFmpeg, createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'; + +export class Encoder { + private _FFMPEG: FFmpeg | null = null; + private _FFMPEG_Loaded = false; + + constructor() { + this.initFFMPEG(); + } + + async initFFMPEG() { + this._FFMPEG = createFFmpeg({ log: true }); + await this.loadFFmpeg(); + } + async loadFFmpeg() { + if (this._FFMPEG_Loaded) { + return; + } + if (!this._FFMPEG) { + this._FFMPEG = createFFmpeg({ log: true }); + } + await this._FFMPEG.load(); + console.log('加载'); + this._FFMPEG_Loaded = true; + } + + async exportVideo(frameNum: number, fps: number, cb: (i: number) => Promise) { + const outName = `out`; + await this.loadFFmpeg(); + const ffmpeg = this._FFMPEG; + if (!ffmpeg) { + return; + } + console.log(ffmpeg.isLoaded()); + + for (let i = 0; i < frameNum; i++) { + const data = await cb(i); + console.log(frameNum, i, data); + const num = `0000${i}`.slice(-3); + + ffmpeg.FS('writeFile', `vstory.${num}.png`, await fetchFile(data)); + } + + await ffmpeg.run( + '-framerate', + fps.toString(), + '-pattern_type', + 'glob', + '-i', + '*.png', + '-c:v', + 'libx264', + '-pix_fmt', + 'yuv420p', + `${outName}.mp4` + ); + for (let i = 0; i < frameNum; i++) { + const num = `0000${i}`.slice(-3); + ffmpeg.FS('unlink', `vstory.${num}.png`); + } + console.log('readFile'); + const data = (this._FFMPEG as FFmpeg).FS('readFile', `${outName}.mp4`); + console.log('data', data); + const objUrl = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' })); + return objUrl; + } +} diff --git a/packages/vstory/src/story/player/index.ts b/packages/vstory/src/story/player/index.ts new file mode 100644 index 0000000..2443180 --- /dev/null +++ b/packages/vstory/src/story/player/index.ts @@ -0,0 +1,202 @@ +import { isNumber } from '@visactor/vutils'; +import { StoryCanvas } from '../canvas/canvas'; +import { IActSpec, IAction } from '../interface'; +import { IPlayer } from '../interface/player'; +import { processorMap, ActionProcessor } from '../../dsl/story-processor'; +import { Encoder } from './encode'; +import { ICharacter } from '../character'; + +export class Ticker { + cb?: (delta: number) => void; + rafIdx = 0; + start(cb: (t: number) => void) { + this.stop(); + this.cb = cb; + this._tick(0); + } + + _tick = (lt: number) => { + const ct = Date.now(); + this.cb && this.cb(lt === 0 ? 0 : ct - lt); + this.rafIdx = requestAnimationFrame(() => this._tick(ct)); + }; + + stop() { + this.rafIdx && cancelAnimationFrame(this.rafIdx); + this.rafIdx = 0; + } +} + +type IChapterInstanceItem = { + id: string; + scenes: Array< + { + character: ICharacter; + action: IAction; + }[] + >; + characters: ICharacter[]; +}; + +export class Player implements IPlayer { + protected _canvas: StoryCanvas; + protected _acts: IChapterInstanceItem[]; + protected _currAct: IChapterInstanceItem; + protected _ticker: Ticker; + protected _currTime: number; + protected _encoder: Encoder; + protected _actionProcessor: ActionProcessor; + + constructor(c: StoryCanvas) { + this._canvas = c; + this._acts = []; + this._ticker = new Ticker(); + this._currTime = 0; + this._encoder = new Encoder(); + this._actionProcessor = new ActionProcessor(processorMap); + } + + addAct( + c: IActSpec, + characters: { + [key: string]: ICharacter; + } + ): void { + const scenes: IChapterInstanceItem['scenes'] = []; + const characterSet: Set = new Set(); + c.scenes.forEach(item => { + const scene: IChapterInstanceItem['scenes'][0] = []; + item.actions.forEach(({ characterActions, characterId }) => { + const _actions = characterActions.slice(); + _actions.sort((a, b) => a.startTime - b.startTime); + _actions.forEach(action => { + const character = characters[characterId]; + scene.push({ + character, + action: action + }); + characterSet.add(character); + }); + }); + scenes.push(scene); + }); + this._acts.push({ + id: c.id, + scenes: scenes, + characters: Array.from(characterSet.values()) + }); + } + + setCurrentAct(id: number | string) { + if (isNumber(id)) { + this._currAct = this._acts[id]; + } else { + this._currAct = this._acts.filter(item => item.id === id)[0]; + } + } + + // 清除当前状态,一般用于回放操作 + reset() { + this._currAct.characters.forEach(item => { + item.reset(); + }); + } + + tickTo(t: number) { + const lastTime = this._currTime; + if (lastTime > t) { + console.log('abcdefg'); + // 如果时间回退,那就重新走一遍 + this.reset(); + this._currTime = 0; + this.tickTo(0); + } + const characterSet = new Set(); + + let baseStartTime = 0; + for (let i = 0; i < this._currAct.scenes.length; i++) { + const scene = this._currAct.scenes[i]; + scene.forEach(({ character, action }) => { + const { startTime: st } = action; + const startTime = st + baseStartTime; + if (startTime > t) { + return; + } + characterSet.add(character); + // 之前没走过,现在走 + if (startTime > lastTime && startTime <= t) { + const { type } = character.spec; + this._actionProcessor.doAction(type, action.action, [character, {}, action]); + } + character.show(); + }); + let sceneTime = 0; + scene.forEach(({ action }) => { + const { startTime, duration } = action; + sceneTime = Math.max(startTime + duration, startTime); + }); + baseStartTime += sceneTime; + if (baseStartTime > t) { + break; + } + } + + // roleSet.forEach(r => { + // r.tickTo && r.tickTo(t); + // }); + + this._currTime = t; + this._canvas.getStage().ticker.tickAt(t); + this._canvas.getStage().render(); + } + + play(): void { + if (!this._currAct) { + return; + } + this._ticker.stop(); + this._currTime = 0; + this.reset(); + this._ticker.start(t => { + this.tickTo(this._currTime + t); + }); + } + + async encodeToVideo(millsecond: number, fps: number) { + // if (!this._currChapter) { + // return; + // } + const frameNum = (millsecond / 1000) * fps; + const deltaT = 1000 / fps; + this.tickTo(0); + const objUrl = await this._encoder.exportVideo(frameNum, fps, async i => { + const t = deltaT * i; + this.tickTo(t); + return new Promise((resolve, reject) => { + this._canvas + .getStage() + .window.getContext() + .canvas.nativeCanvas.toBlob((blob: any) => { + if (blob) { + resolve(blob); + } else { + console.log('no blob'); + reject('no blob'); + } + }, `image/png`); + }); + }); + + return objUrl; + } + + pause(): void { + this._ticker.stop(); + } + + resume(): void { + this._ticker._tick(this._currTime); + } + + release(): void {} +} diff --git a/packages/vstory/src/story/player/ticker.ts b/packages/vstory/src/story/player/ticker.ts new file mode 100644 index 0000000..a304b72 --- /dev/null +++ b/packages/vstory/src/story/player/ticker.ts @@ -0,0 +1,3 @@ +import { ManualTicker } from '@visactor/vrender-core'; + +export const manualTicker = new ManualTicker([]); diff --git a/packages/vstory/src/story/story.ts b/packages/vstory/src/story/story.ts new file mode 100644 index 0000000..9757ad0 --- /dev/null +++ b/packages/vstory/src/story/story.ts @@ -0,0 +1,87 @@ +import { ICharacterSpec } from './character/dsl-interface'; +import { isString } from '@visactor/vutils'; +import { IStory, IStoryInitOption } from './interface/runtime-interface'; +import { ICharacter } from './character/runtime-interface'; +import { StoryCanvas } from './canvas/canvas'; +import { IStorySpec, ICharacterLink, IActSpec } from './interface'; +import { StoryFactory } from './factory/factory'; +import { defaultTicker, defaultTimeline } from '@visactor/vrender-core'; +import { IPlayer } from './interface/player'; +import { Player } from './player'; + +defaultTicker.remTimeline(defaultTimeline); + +export class Story implements IStory { + static _id_ = 0; + + protected _player: IPlayer; + + readonly id: string; + + protected _canvas: StoryCanvas; + get canvas() { + return this._canvas; + } + + protected _characters: { [key: string]: ICharacter } = {}; + + constructor(spec: IStorySpec, option: IStoryInitOption) { + this.id = 'test-mvp_' + Story._id_++; + this._canvas = new StoryCanvas( + this, + isString(option.dom) ? (document.getElementById(option.dom) as HTMLDivElement) : option.dom + ); + this._player = new Player(this._canvas); + + if (spec) { + this.load(spec); + } + console.log(this); + } + + load(spec: IStorySpec) { + spec.characters.forEach(e => { + this._createCharacter(e); + }); + // @ts-ignore + spec.acts.forEach(e => { + this._createAct(e); + }); + } + + public getCharacters(): { [key: string]: ICharacter } { + return this._characters; + } + + private _createCharacter(spec: ICharacterSpec | ICharacterLink) { + const option = { story: this, canvas: this._canvas, graphicParent: this._canvas.getStage().defaultLayer }; + if ((spec).id) { + if (!this._characters[(spec).id]) { + this._characters[(spec).id] = StoryFactory.createCharacter(spec, option); + } + return this._characters[(spec).id]; + } else if ((spec).characterId) { + return this._characters[(spec).characterId]; + } + return null; + } + + private _createAct(spec: IActSpec) { + this._player.addAct(spec, this._characters); + } + + play(actIndex = 0) { + // player 开始播放 + this._player.setCurrentAct(actIndex); + this._player.play(); + } + + async encodeToVideo(actIndex: number, millsecond: number, fps: number) { + this._player.setCurrentAct(actIndex); + return this._player.encodeToVideo(millsecond, fps); + } + + getPlayer() { + return this._player; + } +} diff --git a/packages/vstory/src/story/utils/chart.ts b/packages/vstory/src/story/utils/chart.ts new file mode 100644 index 0000000..bea2cc9 --- /dev/null +++ b/packages/vstory/src/story/utils/chart.ts @@ -0,0 +1,134 @@ +import { ISpec } from '@visactor/vchart'; +import { isArray, isArrayLike, isNil, isObject, isPlainObject, isString, isValid } from '@visactor/vutils'; + +const directlyAssignSpecKeys = ['seriesId', 'text']; + +export function isModelInfoMatchSpec( + info: any, + spec: { id: string | number }, + specKey: string, + index: number, + option: { + ignoreIdMatch: boolean; + } = { + ignoreIdMatch: false + } +) { + if (!isNil(info.id)) { + const match = info.id === spec.id; + if (match || option.ignoreIdMatch !== true) { + return match; + } + } + return info.specKey === specKey && info.specIndex === index; +} + +function baseMerge(target: any, source: any, shallowArray = false) { + if (source) { + if (target === source) { + return; + } + if (isValid(source) && typeof source === 'object') { + // baseFor + const iterable = Object(source); + const props = []; + // keysIn + for (const key in iterable) { + props.push(key); + } + let { length } = props; + let propIndex = -1; + while (length--) { + const key = props[++propIndex]; + if (isValid(iterable[key]) && typeof iterable[key] === 'object') { + baseMergeDeep(target, source, key, shallowArray); + } else { + assignMergeValue(target, key, iterable[key]); + } + } + } + } +} + +function baseMergeDeep(target: object, source: object, key: string, shallowArray = false) { + const objValue = target[key]; + const srcValue = source[key]; + let newValue = source[key]; + let isCommon = true; + // handle excluded spec keys + if (directlyAssignSpecKeys.includes(key)) { + isCommon = false; + } + // 不考虑 buffer / typedArray 类型 + else if (isArray(srcValue)) { + if (shallowArray || !objValue) { + // 依据参数对数组做浅拷贝 + newValue = []; + } else if (isArray(objValue)) { + newValue = objValue; + } else if (isArrayLike(objValue) && !isString(objValue)) { + // 如果 objValue 是字符串则直接赋值 + // 如果 source 为数组,则 target 的 arrayLike 对象也视作为数组处理 + newValue = new Array(objValue.length); + let index = -1; + const length = objValue.length; + while (++index < length) { + newValue[index] = objValue[index]; + } + } + } + // else if (isArray(srcValue) && shallowArray) { + // newValue = []; + // } + // 不考虑 argument 类型 + else if (isPlainObject(srcValue)) { + newValue = objValue ?? {}; + // 不考虑 prototype 的额外处理 + if (typeof objValue === 'function' || typeof objValue !== 'object') { + newValue = {}; + } + } else { + isCommon = false; + } + // 对 class 等复杂对象或者浅拷贝的 array 不做拷贝处理 + if (isCommon) { + baseMerge(newValue, srcValue, shallowArray); + } + assignMergeValue(target, key, newValue); +} + +function assignMergeValue(target: object, key: string, value: any) { + if ((value !== undefined && !eq(target[key], value)) || (value === undefined && !(key in target))) { + // 不考虑 __proto__ 的赋值处理 + target[key] = value; + } +} + +function eq(value: any, other: any) { + return value === other || (Number.isNaN(value) && Number.isNaN(other)); +} + +export function mergeSpec(target: any, ...sources: any[]): any { + let sourceIndex = -1; + const length = sources.length; + while (++sourceIndex < length) { + const source = sources[sourceIndex]; + baseMerge(target, source, false); + } + return target; +} + +export function findChartSpec(s: any, vchartSpec: ISpec) { + const chartSpec = vchartSpec[s.specKey]; + if (!chartSpec) { + return null; + } + if (isArray(chartSpec)) { + return chartSpec.find((_s, index) => { + return isModelInfoMatchSpec(s, _s, s.specKey, index); + }); + } else if (isObject(chartSpec)) { + return isModelInfoMatchSpec(s, chartSpec as { id: string | number }, s.specKey, 0) ? chartSpec : null; + } + return null; +} diff --git a/packages/vstory/src/story/utils/layout.ts b/packages/vstory/src/story/utils/layout.ts new file mode 100644 index 0000000..b0f4ba7 --- /dev/null +++ b/packages/vstory/src/story/utils/layout.ts @@ -0,0 +1,10 @@ +import { ILayoutAttribute, IWidgetData } from '../character'; + +export function getLayoutFromWidget(w: Partial): Partial { + return { + x: w.left, + y: w.top, + width: 'width' in w ? w.width : w.right - w.left, + height: 'height' in w ? w.height : w.bottom - w.top + }; +} diff --git a/packages/vstory/src/task.ts b/packages/vstory/src/task.ts new file mode 100644 index 0000000..f351df9 --- /dev/null +++ b/packages/vstory/src/task.ts @@ -0,0 +1,43 @@ +import { IContext } from './interface/type'; + +export type TaskCb = () => void; + +export interface ITask { + runCb: (cb: TaskCb) => void; + run: (context?: Partial) => void; + next: ITask | null; + prev: ITask | null; +} + +export abstract class AbstractTask implements ITask { + prev: ITask; + next: ITask; + + abstract runCb(cb: TaskCb): void; + abstract run(context?: Partial): void; +} + +export class TaskManager { + protected _tail: ITask; + protected _head: ITask; + + protected _context: Partial; + setContext(context: Partial) { + this._context = context; + } + + next(task: ITask) { + if (!this._tail) { + this._tail = task; + this._head = task; + task.run(this._context); + } else { + this._tail.next = task; + task.prev = this._tail; + this._tail.runCb(() => { + task.run(this._context); + }); + this._tail = task; + } + } +} diff --git a/packages/vstory/src/template/base-template.ts b/packages/vstory/src/template/base-template.ts new file mode 100644 index 0000000..e8407b0 --- /dev/null +++ b/packages/vstory/src/template/base-template.ts @@ -0,0 +1,44 @@ +import type VChart from '@visactor/vchart'; +import { IContext } from '../interface/type'; +import { IGraphic } from '@visactor/vrender-core'; +import { TaskManager } from '../task'; +import { forEachGraphicItem } from '../util/vrender-api'; + +export abstract class Template { + declare spec: Record; + protected _chartInstance: VChart; + vchartInstance() { + return this._chartInstance; + } + + // protected _graphicAnimationManager = new Map(); + + constructor(spec: Record) { + this.spec = spec; + } + + protected abstract isValid(): boolean; + + protected abstract setUp(): Record; + + abstract render(context: Partial): void; + + onRenderEnd(context: Partial) { + // const { stage } = context; + // if (stage && this._chartInstance) { + // forEachGraphicItem(stage as unknown as IGraphic, graphic => { + // if (!this._graphicAnimationManager.get(graphic)) { + // const manager = new TaskManager(); + // this._graphicAnimationManager.set(graphic, manager); + // } + // }); + // } + } + + release() { + this._chartInstance.release(); + this._chartInstance = null; + // this._graphicAnimationManager.clear(); + // this._graphicAnimationManager = null; + } +} diff --git a/packages/vstory/src/template/charts/simple-chart.ts b/packages/vstory/src/template/charts/simple-chart.ts new file mode 100644 index 0000000..23abbb1 --- /dev/null +++ b/packages/vstory/src/template/charts/simple-chart.ts @@ -0,0 +1,42 @@ +import VChart, { IChartSpec } from '@visactor/vchart'; +import { IContext } from '../../interface/type'; +import { Template } from '../base-template'; + +// TODO: 动态生成 +export const CHART_TYPES = ['line', 'bar']; + +export class Bar extends Template { + protected isValid() { + const { xField, yField, data } = this.spec; + if (!xField || !yField) { + throw new Error('Missing config: `xField`,`yField`'); + } + if (!data) { + throw new Error('Missing data'); + } + return true; + } + + protected setUp() { + if (this.spec) { + // TODO chart 会绘制整个background + this.spec.background = 'rgba(0,0,0,0)'; + } + return this.spec; + } + + render(context: Partial = {}) { + const spec = this.setUp(); + if (spec && context.dom) { + this._chartInstance = new VChart(spec as IChartSpec, { + dom: context.dom, + stage: context.stage, + renderCanvas: context.canvas + }); + if (this._chartInstance) { + this._chartInstance.renderSync(); + // this.onRenderEnd(context); + } + } + } +} diff --git a/packages/vstory/src/template/ranking-bar/interface.ts b/packages/vstory/src/template/ranking-bar/interface.ts new file mode 100644 index 0000000..3e36941 --- /dev/null +++ b/packages/vstory/src/template/ranking-bar/interface.ts @@ -0,0 +1,57 @@ +import type { ILineGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core'; + +export type IRankingBarData = any[]; + +export interface IPlayConfig { + interval?: number; // 单位毫秒 +} + +export interface IRankingBarSpec extends IPlayConfig { + data: IRankingBarData; + + timeField: string; + xField: string; + yField: string; + + topN?: number; + + bar?: { + padding?: number; + cornerRadius?: number; + }; + + color?: Record; + + icon?: Record; + + iconPosition?: 'bar-end' | 'bar-start' | 'axis'; + + iconShape?: 'circle' | 'rect'; + + background?: string; + + label?: { + visible?: boolean; + style?: ITextGraphicAttribute; + }; + + nameLabel?: ITextGraphicAttribute & { + visible?: boolean; + position?: 'bar-end' | 'bar-start'; + style?: ITextGraphicAttribute; + }; + + timeLabel?: ITextGraphicAttribute; + + xAxis?: { + label?: ITextGraphicAttribute; + domainLine?: ILineGraphicAttribute; + grid?: ILineGraphicAttribute; + }; + + yAxis?: { + label?: ITextGraphicAttribute; + domainLine?: ILineGraphicAttribute; + grid?: ILineGraphicAttribute; + }; +} diff --git a/packages/vstory/src/template/ranking-bar/ranking-bar.ts b/packages/vstory/src/template/ranking-bar/ranking-bar.ts new file mode 100644 index 0000000..7d5fe07 --- /dev/null +++ b/packages/vstory/src/template/ranking-bar/ranking-bar.ts @@ -0,0 +1,60 @@ +import { IContext } from 'src/interface/type'; +import { IRankingBarSpec } from './interface'; +import { VChart } from '@visactor/vchart'; +import { specParser } from './spec-parser'; +import { Template } from '../base-template'; + +export class RankingBar extends Template { + declare spec: IRankingBarSpec; + + protected _chartInstance: VChart; + + protected _timeNodes: string[]; + protected _timeData: Map; + + constructor(spec: IRankingBarSpec) { + super(spec); + this.init(); + } + + protected init() { + if (!this.isValid()) { + return; + } + this._timeData = new Map(); + this._timeNodes = []; + } + + protected isValid() { + const { xField, yField, timeField, data } = this.spec; + if (!xField || !yField || !timeField) { + throw new Error('Missing config: `xField`,`yField`, `timeField`'); + } + if (!data) { + throw new Error('Missing data'); + } + return true; + } + + protected setUp() { + const { vchartSpec } = specParser(this.spec); + return vchartSpec; + } + + render(context: Partial = {}) { + const spec = this.setUp(); + if (spec && context.dom) { + this._chartInstance = new VChart(spec, { dom: context.dom, stage: context.stage }); + if (this._chartInstance) { + this._chartInstance.renderSync(); + this.onRenderEnd(context); + } + } + } + + release() { + super.release(); + this._timeData = null; + this._timeNodes = null; + } +} diff --git a/packages/vstory/src/template/ranking-bar/spec-parser.ts b/packages/vstory/src/template/ranking-bar/spec-parser.ts new file mode 100644 index 0000000..f745bd6 --- /dev/null +++ b/packages/vstory/src/template/ranking-bar/spec-parser.ts @@ -0,0 +1,364 @@ +import type { IRankingBarSpec } from 'src/template/ranking-bar/interface'; +import type { ICartesianAxisSpec, ICommonChartSpec, ILabelSpec } from '@visactor/vchart'; +import { isValid } from '@visactor/vutils'; + +export function specParser(spec: IRankingBarSpec) { + const { xField, yField, timeField, data, topN = 10, icon, interval: userInterval } = spec; + + // 数据处理 + const timeNodes = new Set(); + const timeData = new Map(); + + data.sort((d1, d2) => Number(d2[xField]) - Number(d1[xField])); + + data.forEach(d => { + const time = d[timeField]; + if (isValid(time)) { + timeNodes.add(time); + } + if (!timeData.has(time)) { + timeData.set(time, []); + } + const currentData = timeData.get(time); + if (currentData.length < topN) { + const _d = { ...d }; + if (icon && icon[_d[yField]]) { + _d['icon'] = icon[_d[yField]]; + } + currentData.push(_d); + } + }); + + const interval = userInterval ? userInterval : 1000; + const exchangeDuration = Math.min(interval, 500); + + // 配置处理 + const vchartSpec = templateSpec( + spec, + { timeNodes: Array.from(timeNodes).sort(), timeData }, + { interval, exchangeDuration } + ); + console.log(vchartSpec); + return { timeData, timeNodes, vchartSpec }; +} + +function templateSpec( + { xField, yField, color, icon, iconPosition, iconShape, timeLabel, label, nameLabel, xAxis, yAxis }: IRankingBarSpec, + data: { timeNodes: string[]; timeData: Map }, + { interval, exchangeDuration }: any +): ICommonChartSpec { + const { timeData, timeNodes } = data; + const spec: ICommonChartSpec = { + type: 'common', + data: [ + { + id: 'timeData', + values: timeData.get(timeNodes[0]) + }, + { + id: 'time', + values: [{ time: timeNodes[0] }] + } + ], + // @ts-ignore + color: { + specified: { + ...color + } + }, + region: [{ clip: true }], + series: [ + { + type: 'bar', + id: 'ranking-bar', + dataId: 'timeData', + direction: 'horizontal', + yField, + xField, + seriesField: yField, + extensionMark: [], + label: labelSpec(label, { ...nameLabel, yField }, { interval, exchangeDuration }) as any + } + ], + axes: axisSpec(xAxis, yAxis), + player: { + type: 'continuous', + // visible: false, + auto: true, + loop: false, + interval, + // slider: { visible: false }, + // controller: { visible: false }, + specs: timeNodes.map(time => ({ + data: [ + { id: 'timeData', values: timeData.get(time) }, + { id: 'time', values: [{ time }] } + ] + })) + }, + tooltip: { visible: false }, + customMark: [], + animationAppear: false, + animationUpdate: { + bar: [ + { + type: 'update', + options: { excludeChannels: ['y'] }, + easing: 'linear', + duration: interval + }, + { + channel: ['y'], + easing: 'circInOut', + duration: exchangeDuration + } + ], + axis: { + duration: interval, + easing: 'linear' + } + }, + animationEnter: { + bar: [ + { + type: 'moveIn', + duration: exchangeDuration, + easing: 'cubicInOut', + options: { + direction: 'y', + orient: 'negative', + point: (datum: any, element: any, param: any, ctx: any) => { + return { + y: param.groupHeight + element.getBounds().height() + }; + } + } + } + ] + }, + animationExit: { + bar: [ + { + type: 'moveOut', + duration: exchangeDuration, + easing: 'cubicInOut', + options: { + direction: 'y', + orient: 'negative' + } + } + ] + } + }; + if (!timeLabel || timeLabel.visible !== false) { + spec.customMark.push(timeLabelSpec() as any); + } + if (icon) { + const icon = iconSpec(iconPosition, iconShape, { interval, exchangeDuration }); + spec.series[0].extensionMark.push(icon as any); + } + return spec; +} + +function labelSpec( + label: IRankingBarSpec['label'] = {}, + nameLabel: IRankingBarSpec['nameLabel'] & { yField: string }, + { interval, exchangeDuration }: any +) { + const spec: ILabelSpec[] = []; + + if (label.visible !== false) { + spec.push({ + visible: true, + overlap: false, + style: { + // @ts-ignore + fill: `rgb(64, 64, 64)`, + ...label.style + }, + smartInvert: { + fillStrategy: label.style?.fill ? 'null' : undefined, + strokeStrategy: label.style?.stroke ? 'null' : undefined + }, + animationUpdate: [ + { + duration: exchangeDuration, + easing: 'cubicInOut', + channel: ['y'] + }, + { + options: { excludeChannels: ['y'] }, + easing: 'linear', + duration: interval + } + ] + }); + } + + if (nameLabel.visible) { + spec.push({ + visible: true, + overlap: false, + // @ts-ignore + style: { + ...nameLabel.style + }, + smartInvert: { + fillStrategy: nameLabel.style?.fill ? 'null' : undefined, + strokeStrategy: nameLabel.style?.stroke ? 'null' : undefined + }, + position: nameLabel.position === 'bar-end' ? 'inside-right' : 'inside-left', + formatter: `{${nameLabel.yField}}`, + animationUpdate: customMarkUpdateAnimation(interval, exchangeDuration) + }); + } + + return spec; +} + +function axisSpec(xAxis: IRankingBarSpec['xAxis'] = {}, yAxis: IRankingBarSpec['yAxis'] = {}) { + const leftAxis: ICartesianAxisSpec = { + orient: 'left', + type: 'band', + inverse: true, + // @ts-ignore + label: { style: yAxis.label }, + domainLine: { style: yAxis.domainLine }, + // @ts-ignore + grid: { style: yAxis.grid } + }; + const bottomAxis: ICartesianAxisSpec = { + orient: 'bottom', + type: 'linear', + nice: false, + animation: true, + // @ts-ignore + label: { style: xAxis.label }, + domainLine: { style: xAxis.domainLine }, + // @ts-ignore + grid: { style: xAxis.grid }, + // @ts-ignore + innerOffset: { right: '10%' } + }; + + if (xAxis.label) { + bottomAxis.label = xAxis.label; + } + return [leftAxis, bottomAxis]; +} + +function timeLabelSpec() { + return { + type: 'text', + dataId: 'time', + style: { + textBaseline: 'bottom', + fontSize: 200, + textAlign: 'end', + fontWeight: 600, + text: (datum: any) => datum.time, + x: (datum: any, ctx: any) => { + return ctx.vchart.getChart().getCanvasRect()?.width - 50; + }, + y: (datum: any, ctx: any) => { + return ctx.vchart.getChart().getCanvasRect()?.height - 80; + }, + fill: 'grey', + fillOpacity: 0.5 + } + }; +} + +function iconSpec( + iconPosition: IRankingBarSpec['iconPosition'] = 'bar-end', + iconShape: IRankingBarSpec['iconShape'] = 'circle', + { interval, exchangeDuration }: any +) { + return { + type: 'symbol', + dataId: 'timeData', + style: { + symbolType: iconShape, + stroke: 'white', + lineWidth: 1, + size: (data: any, ctx: any) => { + const vchart = ctx.vchart; + const series = vchart.getChart()?.getSeriesInIndex(0)[0]; + if (vchart && series) { + const bandwidth = series.getYAxisHelper().getBandwidth(0) ?? 0; + return Math.max(bandwidth - 4, 0); + } + }, + background: (data: any) => data.icon, + // globalZIndex 有bug,会有动画闪烁和报错 + // globalZIndex: 1, // 否则会被 region 区域 clip + x: (data: any, ctx: any) => { + const vchart = ctx.vchart; + const series = vchart.getChart()?.getSeriesInIndex(0)[0]; + if (vchart && series) { + const bandwidth = series.getYAxisHelper().getBandwidth(0) ?? 0; + if (iconPosition === 'bar-start') { + return bandwidth / 2; + } else if (iconPosition === 'axis') { + return -bandwidth / 2; + } else { + return series.dataToPositionX(data) - bandwidth / 2; + } + } + }, + y: (data: any, ctx: any) => { + const vchart = ctx.vchart; + const series = vchart.getChart()?.getSeriesInIndex(0)[0]; + if (vchart && series) { + const bandwidth = series.getYAxisHelper().getBandwidth(0) ?? 0; + return series.dataToPositionY(data) + bandwidth / 2; + } + }, + scaleY: iconShape === 'rect' ? 1.2 : 1 + }, + animationUpdate: customMarkUpdateAnimation(interval, exchangeDuration), + animationEnter: [ + { + type: 'moveIn', + duration: exchangeDuration, + easing: 'cubicInOut', + options: { + direction: 'y', + orient: 'negative', + point: (datum: any, element: any, param: any) => { + return { + y: param.groupHeight + element.getBounds().height() + }; + } + } + } + ], + animationExit: [ + { + type: 'moveOut', + duration: exchangeDuration, + easing: 'cubicInOut', + options: { + direction: 'y', + orient: 'negative' + } + } + ] + }; +} + +function customMarkUpdateAnimation(duration: number, exchangeDuration: number) { + return [ + { + duration: exchangeDuration, + easing: 'cubicInOut', + channel: ['y'] + }, + { + options: { excludeChannels: ['y'] }, + channel: ['x', 'x2', 'x1'], + easing: 'linear', + duration + } + ]; +} diff --git a/packages/vstory/src/type/common.ts b/packages/vstory/src/type/common.ts new file mode 100644 index 0000000..c15c4c4 --- /dev/null +++ b/packages/vstory/src/type/common.ts @@ -0,0 +1,5 @@ +import type { Dict } from '@visactor/vutils'; + +export type Data = Dict; + +export type MaybeArray = T | T[]; diff --git a/packages/vstory/src/util/common.ts b/packages/vstory/src/util/common.ts new file mode 100644 index 0000000..f619875 --- /dev/null +++ b/packages/vstory/src/util/common.ts @@ -0,0 +1,5 @@ +let uid = -1; + +export function CreateUID() { + return ++uid; +} diff --git a/packages/vstory/src/util/size.ts b/packages/vstory/src/util/size.ts new file mode 100644 index 0000000..f253bcb --- /dev/null +++ b/packages/vstory/src/util/size.ts @@ -0,0 +1,26 @@ +import { getContainerSize, isValid } from '@visactor/vutils'; + +export function calculateSize(container: HTMLElement | null, userSize: { width: number; height: number }) { + const { width: userWidth, height: userHeight } = userSize; + if (isValid(userWidth) && isValid(userHeight)) { + return { + width: userWidth, + height: userHeight + }; + } + let width = 500; + let height = 500; + if (container) { + const { width: containerWidth, height: containerHeight } = getContainerSize(container, width, height); + width = containerWidth; + height = containerHeight; + } + + width = userWidth ?? width; + height = userHeight ?? height; + + return { + width, + height + }; +} diff --git a/packages/vstory/src/util/vchart-api.ts b/packages/vstory/src/util/vchart-api.ts new file mode 100644 index 0000000..d559a86 --- /dev/null +++ b/packages/vstory/src/util/vchart-api.ts @@ -0,0 +1,22 @@ +import { IVChart } from '@visactor/vchart'; + +export function getAllSeriesMarksWithoutRoot(vchart: IVChart) { + if (!vchart) { + return null; + } + const chart = vchart.getChart(); + if (!chart) { + return null; + } + return chart + .getAllSeries() + .map(s => s.getMarksWithoutRoot()) + .flat(); +} + +export function getComponentById(vchart: IVChart, id: number) { + if (!vchart) { + return null; + } + return vchart.getComponents().find(component => component.userId === id); +} diff --git a/packages/vstory/src/util/vrender-api.ts b/packages/vstory/src/util/vrender-api.ts new file mode 100644 index 0000000..d51e18f --- /dev/null +++ b/packages/vstory/src/util/vrender-api.ts @@ -0,0 +1,14 @@ +import { IGraphic, IGroup } from '@visactor/vrender-core'; + +export function forEachGraphicItem(group: IGraphic, cb: (node: IGraphic) => boolean | void) { + if (!group) { + return; + } + + group.forEachChildren(node => { + const stopped = cb(node as IGraphic); + if ((node as IGroup).isContainer && !stopped) { + forEachGraphicItem(node as IGraphic, cb); + } + }); +} diff --git a/packages/vstory/tsconfig.eslint.json b/packages/vstory/tsconfig.eslint.json new file mode 100644 index 0000000..1b72dc5 --- /dev/null +++ b/packages/vstory/tsconfig.eslint.json @@ -0,0 +1,15 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "types": ["jest", "node"], + "lib": ["DOM", "ESNext", "ES2021.String"], + "typeRoots": ["./node_modules/@types", "./src/types"], + "baseUrl": "./", + "rootDir": "./src", + "outDir": "./es", + "composite": true + }, + "include": ["src", "demo", "examples"], + "exclude": ["bugserver-config", "src/common/inversify-lite"], + "references": [] +} diff --git a/packages/vstory/tsconfig.json b/packages/vstory/tsconfig.json new file mode 100644 index 0000000..cf7f5ce --- /dev/null +++ b/packages/vstory/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "rootDir": "./src", + "outDir": "./es", + "typeRoots": ["./node_modules/@types", "./src/types"], + "composite": true + }, + "include": ["src"], + "references": [] +} diff --git a/packages/vstory/tsconfig.test.json b/packages/vstory/tsconfig.test.json new file mode 100644 index 0000000..6e0c56e --- /dev/null +++ b/packages/vstory/tsconfig.test.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": {} + }, + "references": [] +} diff --git a/packages/vstory/vite/index.html b/packages/vstory/vite/index.html new file mode 100644 index 0000000..e0d1c84 --- /dev/null +++ b/packages/vstory/vite/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
    + + + diff --git a/packages/vstory/vite/public/vite.svg b/packages/vstory/vite/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/packages/vstory/vite/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/vstory/vite/src/App.css b/packages/vstory/vite/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/packages/vstory/vite/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/packages/vstory/vite/src/App.tsx b/packages/vstory/vite/src/App.tsx new file mode 100644 index 0000000..d6dcc83 --- /dev/null +++ b/packages/vstory/vite/src/App.tsx @@ -0,0 +1,31 @@ +import React, { useState } from 'react'; +import reactLogo from './assets/react.svg'; +import viteLogo from '/vite.svg'; +import './App.css'; + +function App() { + const [count, setCount] = useState(0); + + return ( + <> +
    +

    Vite + React

    +
    + +

    + Edit src/App.tsx and save to test HMR +

    +
    +

    Click on the Vite and React logos to learn more

    + + ); +} + +export default App; diff --git a/packages/vstory/vite/src/assets/react.svg b/packages/vstory/vite/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/packages/vstory/vite/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/vstory/vite/src/index.css b/packages/vstory/vite/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/packages/vstory/vite/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/packages/vstory/vite/src/main.tsx b/packages/vstory/vite/src/main.tsx new file mode 100644 index 0000000..b3ad8a5 --- /dev/null +++ b/packages/vstory/vite/src/main.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App.tsx'; +import './index.css'; + +ReactDOM.render( + + + , + document.getElementById('root') as HTMLElement +); diff --git a/packages/vstory/vite/src/vite-env.d.ts b/packages/vstory/vite/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/vstory/vite/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/vstory/vite/tsconfig.json b/packages/vstory/vite/tsconfig.json new file mode 100644 index 0000000..4af7fee --- /dev/null +++ b/packages/vstory/vite/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/packages/vstory/vite/tsconfig.node.json b/packages/vstory/vite/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/packages/vstory/vite/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/vstory/vite/vite.config.ts b/packages/vstory/vite/vite.config.ts new file mode 100644 index 0000000..c9b2b55 --- /dev/null +++ b/packages/vstory/vite/vite.config.ts @@ -0,0 +1,39 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import localConf from './vite.config.local'; +import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'; +import { NodeModulesPolyfillPlugin } from '@esbuild-plugins/node-modules-polyfill'; +import rollupNodePolyFill from 'rollup-plugin-node-polyfills'; + +export default defineConfig({ + plugins: [react({ jsxRuntime: 'classic' })], + define: { + __DEV__: true + }, + optimizeDeps: { + esbuildOptions: { + // Node.js global to browser globalThis + define: { + global: 'globalThis' + }, + // Enable esbuild polyfill plugins + plugins: [ + NodeGlobalsPolyfillPlugin({ + process: true, + buffer: true + }), + NodeModulesPolyfillPlugin() + ] + } + }, + build: { + rollupOptions: { + plugins: [ + // Enable rollup polyfills plugin + // used during production bundling + rollupNodePolyFill() + ] + } + }, + resolve: localConf.resolve || {} +}); diff --git a/rush.json b/rush.json new file mode 100644 index 0000000..309d1fe --- /dev/null +++ b/rush.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", + "rushVersion": "5.94.1", + "pnpmVersion": "7.32.1", + "nodeSupportedVersionRange": ">=14.15.0 <15.0.0 || >=16.13.0 <17.0.0 || >=18.15.0 <19.0.0", + "suppressNodeLtsWarning": true, + "ensureConsistentVersions": true, + "projectFolderMinDepth": 1, + "projectFolderMaxDepth": 2, + "allowMostlyStandardPackageNames": false, + "gitPolicy": { + "versionBumpCommitMessage": "Bump versions [skip ci]", + "changeLogUpdateCommitMessage": "Update changelogs [skip ci]" + }, + "repository": { + "url": "https://github.com/visactor/vstory", + "defaultBranch": "main", + "defaultRemote": "origin" + }, + "allowedProjectTags": ["tool", "share", "package", "doc"], + "projects": [ + { + "packageName": "@visactor/vstory", + "projectFolder": "packages/vstory", + "tags": ["package"], + "shouldPublish": true, + "versionPolicyName": "vstoryMain" + }, + { + "packageName": "@internal/bundler", + "projectFolder": "tools/bundler", + "tags": ["tool"], + "shouldPublish": false + }, + { + "packageName": "@internal/eslint-config", + "projectFolder": "share/eslint-config", + "tags": ["share"], + "shouldPublish": false + }, + { + "packageName": "@internal/ts-config", + "projectFolder": "share/ts-config", + "tags": ["share"], + "shouldPublish": false + }, + { + "packageName": "@internal/jest-config", + "projectFolder": "share/jest-config", + "tags": ["share"], + "shouldPublish": false + }, + { + "packageName": "@internal/docs", + "projectFolder": "docs", + "tags": ["doc"], + "shouldPublish": false + }, + { + "packageName": "@internal/bugserver-trigger", + "projectFolder": "tools/bugserver-trigger", + "tags": ["tool"], + "shouldPublish": false + } + ] +} diff --git a/share/eslint-config/package.json b/share/eslint-config/package.json new file mode 100644 index 0000000..2f2ecbe --- /dev/null +++ b/share/eslint-config/package.json @@ -0,0 +1,22 @@ +{ + "name": "@internal/eslint-config", + "version": "0.0.1", + "description": "sharable eslint configuration settings", + "private": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "5.30.0", + "@typescript-eslint/parser": "5.30.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-promise": "6.0.0", + "eslint-plugin-react": "7.30.1", + "eslint-plugin-react-hooks": "4.6.0" + }, + "devDependencies": { + "eslint": "~8.18.0", + "typescript": "4.9.5" + }, + "peerDependencies": { + "eslint": "~8.18.0", + "typescript": ">=4" + } +} diff --git a/share/eslint-config/profile/common.js b/share/eslint-config/profile/common.js new file mode 100644 index 0000000..2bd4310 --- /dev/null +++ b/share/eslint-config/profile/common.js @@ -0,0 +1,329 @@ +var baseFiles = ['*.ts', '*.tsx']; +var baseExtends = ['plugin:@typescript-eslint/recommended', 'plugin:promise/recommended', 'prettier']; + +var reactExtends = [ + 'plugin:react/recommended', + // https://github.com/jsx-eslint/eslint-plugin-react/blob/HEAD/docs/rules/react-in-jsx-scope.md + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended' +]; + +/** + * + * @param {'react' | 'lib'} type + * @returns {import('eslint').ESLint.ConfigData} + */ +module.exports = function buildConfig(type) { + var isJsx = false; + var settings = {}; + var reactRules = {}; + + var _extends = baseExtends; + + if (type === 'react') { + baseFiles.push('*.tsx'); + + _extends = baseExtends.concat(reactExtends); + + isJsx = true; + + settings.react = { + createClass: 'createReactClass', + pragma: 'React', + version: 'detect', + flowVersion: '0.53' + }; + + reactRules = { + 'react/prop-types': 'off', + 'react-hooks/rules-of-hooks': 'warn', + 'react/react-in-jsx-scope': 'off' + }; + } + + return { + root: true, + // Disable the parser by default + parser: '', + + env: { + browser: true, + es2021: true, + node: true, + jest: true + }, + + // Manually authored .d.ts files are generally used to describe external APIs that are not expected + // to follow our coding conventions. Linting those files tends to produce a lot of spurious suppressions, + // so we simply ignore them. + ignorePatterns: ['*.d.ts', 'dist/**', 'vite/**'], + + overrides: [ + { + // Declare an override that applies to TypeScript files only + files: baseFiles, + parser: '@typescript-eslint/parser', + extends: _extends, + parserOptions: { + // The "project" path is resolved relative to parserOptions.tsconfigRootDir. + // Your local .eslintrc.js must specify that parserOptions.tsconfigRootDir=__dirname. + project: './tsconfig.json', + + // Allow parsing of newer ECMAScript constructs used in TypeScript source code. Although tsconfig.json + // may allow only a small subset of ES2018 features, this liberal setting ensures that ESLint will correctly + // parse whatever is encountered. + ecmaVersion: 2018, + + sourceType: 'module', + + ecmaFeatures: { + jsx: isJsx + } + }, + + settings: settings, + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + 'promise/always-return': 'off', + 'promise/no-callback-in-promise': 'off', + + // "prettier/prettier": ["error"], + // 强制使用 Unix 换行符: \n + 'linebreak-style': ['error', 'unix'], + // 强制换行时操作符在行首 + // 与prettier冲突 + // "operator-linebreak": ["error", "before", { "overrides": { "=": "after" } }], + // 允许给能自动推断出类型的primitive类型变量额外添加类型声明 + '@typescript-eslint/no-inferrable-types': 'off', + // 在类型导入时推荐import type写法 + '@typescript-eslint/consistent-type-imports': 'warn', + // 禁止出现空接口定义 + '@typescript-eslint/no-empty-interface': 'error', + // 禁止出现空函数 + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-this-alias': 'off', + // 禁止使用namespace + '@typescript-eslint/no-namespace': 'error', + // 禁止使用for-in Array + '@typescript-eslint/no-for-in-array': 'error', + // 禁止在optional chain语句后加非空断言 + '@typescript-eslint/no-non-null-asserted-optional-chain': 'error', + // 接口定义中使用函数属性而不是对象方法声明 + '@typescript-eslint/method-signature-style': 'error', + // 默认省略除属性以外的public修饰符 + '@typescript-eslint/explicit-member-accessibility': [ + 'warn', + { + overrides: { + accessors: 'off', + constructors: 'no-public', + methods: 'no-public', + properties: 'no-public', + parameterProperties: 'explicit' + } + } + ], + 'no-console': [ + 2, + { + allow: ['warn', 'error'] + } + ], + // 如果一个变量不会被重新赋值,最好使用const进行声明 + 'prefer-const': 2, + // 禁止在条件中使用常量表达式 + 'no-constant-condition': 0, + 'no-debugger': 2, + // 禁止对象字面量中出现重复的 key + 'no-dupe-keys': 2, + // 禁止在正则表达式中使用空字符集 + 'no-empty-character-class': 2, + // 禁止对 catch 子句的参数重新赋值 + 'no-ex-assign': 2, + 'no-extra-boolean-cast': 0, + // 禁止对 function 声明重新赋值 + 'no-func-assign': 2, + // 禁止在嵌套的块中出现变量声明或 function 声明 + 'no-inner-declarations': 2, + // 禁止 RegExp 构造函数中存在无效的正则表达式字符串 + 'no-invalid-regexp': 2, + // 禁止对关系运算符的左操作数使用否定操作符 + 'no-unsafe-negation': 2, + // 禁止把全局对象作为函数调用 + 'no-obj-calls': 2, + // 禁用稀疏数组 + 'no-sparse-arrays': 2, + // 禁止在 return、throw、continue 和 break 语句之后出现不可达代码 + 'no-unreachable': 2, + // 要求使用 isNaN() 检查 NaN + 'use-isnan': 2, + // 强制 typeof 表达式与有效的字符串进行比较 + 'valid-typeof': 2, + // 要求使用 === 和 !==,除了与 null 字面量进行比较时 + eqeqeq: [ + 'error', + 'always', + { + null: 'ignore' + } + ], + // 允许 if 语句中 return 语句之后有 else 块 + 'no-else-return': 1, + // 禁用标签语句 + 'no-labels': [ + 2, + { + // 忽略循环语句中的标签 + allowLoop: true + } + ], + // 禁用 eval() + 'no-eval': 2, + // 禁止扩展原生类型 + 'no-extend-native': 2, + // 禁止不必要的 .bind() 调用 + 'no-extra-bind': 0, + // 禁止使用类似 eval() 的方法 + 'no-implied-eval': 2, + // 禁用 __iterator__ 属性 + 'no-iterator': 2, + // 禁止不规则的空白 + 'no-irregular-whitespace': 2, + // 禁用不必要的嵌套块 + 'no-lone-blocks': 2, + // 禁止循环中存在函数 + 'no-loop-func': 1, + // 禁止多行字符串 + 'no-multi-str': 2, + // 禁止对原生对象或只读的全局对象进行赋值 + 'no-global-assign': 2, + // 禁止对 String,Number 和 Boolean 使用 new 操作符 + 'no-new-wrappers': 2, + // 禁用八进制字面量 + 'no-octal': 2, + // 禁止在字符串中使用八进制转义序列 + 'no-octal-escape': 2, + // 禁用 __proto__ 属性 + 'no-proto': 2, + // 禁止自身比较 + 'no-self-compare': 2, + // 禁止可以在有更简单的可替代的表达式时使用三元操作符 + 'no-unneeded-ternary': 2, + // 禁用 with 语句 + 'no-with': 2, + // 强制在 parseInt() 使用基数参数 + radix: 2, + // 要求 IIFE 使用括号括起来 + 'wrap-iife': [2, 'any'], + // 禁止删除变量 + 'no-delete-var': 2, + // 禁止 function 定义中出现重名参数 + 'no-dupe-args': 2, + // 禁止出现重复的 case 标签 + 'no-duplicate-case': 2, + // 不允许标签与变量同名 + 'no-label-var': 2, + // 禁止将标识符定义为受限的名字 + 'no-shadow-restricted-names': 2, + // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到 + 'no-undef': 2, + // 禁止将变量初始化为 undefined + 'no-undef-init': 2, + // 允许在变量定义之前使用它们 + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 0, + // 强制或禁止调用无参构造函数时有圆括号 + 'new-parens': 2, + // 禁用 Array 构造函数 + 'no-array-constructor': 2, + // 禁用 Object 的构造函数 + 'no-new-object': 2, + // 禁止不必要的括号 + 'no-extra-parens': [2, 'functions'], + // 禁止使用 空格 和 tab 混合缩进 + 'no-mixed-spaces-and-tabs': 2, + // 强制函数中的变量在分开声明 + 'one-var': [2, 'never'], + // 建议回调函数最大嵌套深度不超过5 + 'max-nested-callbacks': [1, 5], + // 建议可嵌套的块的最大深度不超过6 + 'max-depth': [1, 6], + // 强制一行的最大长度不超过120,不包括注释和url + 'max-len': [ + 'warn', + { + code: 120, + ignoreUrls: true, + ignoreComments: true + } + ], + // 建议函数定义中最多允许的参数数量不超过15个 + 'max-params': [1, 15], + // 强制非一元操作符周围有空格 + 'space-infix-ops': 2, + // 强制尽可能地使用点号 + 'dot-notation': [ + 2, + { + // 避免对是保留字的属性使用点号 + allowKeywords: true, + allowPattern: '^catch$' + } + ], + // 强制箭头函数的箭头前后使用一致的空格 + 'arrow-spacing': 2, + // 要求在构造函数中有 super() 的调用 + 'constructor-super': 2, + // 禁止在可能与比较操作符相混淆的地方使用箭头函数 + // 与prettier冲突 + // "no-confusing-arrow": [ + // 2, + // { + // // 该规则不那么严格,将括号作为有效防止混淆的语法。 + // "allowParens": true + // } + // ], + // 禁止修改类声明的变量 + 'no-class-assign': 2, + // 禁止修改 const 声明的变量 + 'no-const-assign': 2, + // 允许在构造函数中,在调用 super() 之前使用 this 或 super + 'no-this-before-super': 0, + // 要求使用 let 或 const 而不是 var + 'no-var': 2, + // 重复模块导入 + 'no-duplicate-imports': 1, + // 建议使用剩余参数而不是 arguments + 'prefer-rest-params': 1, + // 禁止 Unicode 字节顺序标记 (BOM) + 'unicode-bom': 2, + // 强制每一行中所允许的最大语句数量为1 + 'max-statements-per-line': 1, + // 允许不必要的构造函数 + 'no-useless-constructor': 0, + // 允许在函数标识符和其调用之间有空格 + 'func-call-spacing': 'off', + '@typescript-eslint/func-call-spacing': 'error', + // 允许出现未使用过的变量 + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 1, + { + // 仅仅检测本作用域中声明的变量是否使用,允许不使用全局环境中的变量。 + vars: 'local', + // 不检查参数 + args: 'none' + } + ], + // 禁用特定的全局变量 + 'no-restricted-globals': [2, 'event', 'name', 'length', 'orientation', 'top', 'parent', 'location', 'closed'], + // 不允许省略大括号 + curly: 'error', + 'promise/catch-or-return': 'warn', + ...reactRules + } + } + ] + }; +}; diff --git a/share/eslint-config/profile/lib.js b/share/eslint-config/profile/lib.js new file mode 100644 index 0000000..40d60a2 --- /dev/null +++ b/share/eslint-config/profile/lib.js @@ -0,0 +1,2 @@ +var config = require('./common')('node'); +module.exports = config; diff --git a/share/eslint-config/profile/react.js b/share/eslint-config/profile/react.js new file mode 100644 index 0000000..26ef16d --- /dev/null +++ b/share/eslint-config/profile/react.js @@ -0,0 +1 @@ +module.exports = require('./common')('react') \ No newline at end of file diff --git a/share/jest-config/jest.base.js b/share/jest-config/jest.base.js new file mode 100644 index 0000000..b908a49 --- /dev/null +++ b/share/jest-config/jest.base.js @@ -0,0 +1,33 @@ +const path = require('path'); + +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testTimeout: 30000, + silent: true, + testMatch: [ + "**/__tests__/**/*.test.[jt]s" + ], + transform: { + '^.+\\.ts?$': [ + 'ts-jest', + { + resolveJsonModule: true, + esModuleInterop: true, + experimentalDecorators: true, + module: 'ESNext' + // ts-jest configuration goes here + }, + ], + }, + globals: { + __DEV__: true, + }, + verbose: false, + + collectCoverageFrom: ['**/*.{ts}', '!**/node_modules/**'], + moduleNameMapper: { + 'd3-color': path.resolve(__dirname, './node_modules/d3-color/dist/d3-color.min.js'), + 'd3-array': path.resolve(__dirname, './node_modules/d3-array/dist/d3-array.min.js') + } +}; diff --git a/share/jest-config/package.json b/share/jest-config/package.json new file mode 100644 index 0000000..92f277a --- /dev/null +++ b/share/jest-config/package.json @@ -0,0 +1,18 @@ +{ + "name": "@internal/jest-config", + "private": true, + "version": "0.0.1", + "dependencies": { + "@jest/globals": "^26.0.0", + "ts-jest": "^26.0.0" + }, + "devDependencies": { + "jest": "^26.0.0", + "@types/jest": "^26.0.0", + "typescript": "4.9.5" + }, + "peerDependencies": { + "jest": "^26.0.0", + "typescript": "4.3 - 6.x" + } +} diff --git a/share/ts-config/package.json b/share/ts-config/package.json new file mode 100644 index 0000000..2683745 --- /dev/null +++ b/share/ts-config/package.json @@ -0,0 +1,5 @@ +{ + "name": "@internal/ts-config", + "private": true, + "version": "0.0.1" +} diff --git a/share/ts-config/tsconfig.base.json b/share/ts-config/tsconfig.base.json new file mode 100644 index 0000000..6831460 --- /dev/null +++ b/share/ts-config/tsconfig.base.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2016", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "strict": false, + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": false, + "moduleResolution": "node", + "module": "esnext", + "esModuleInterop": true, + "importHelpers": false, + "isolatedModules": false, + "noImplicitReturns": false, + "noImplicitThis": true, + "noUnusedParameters": false, + "noUnusedLocals": false, + "resolveJsonModule": true, + "suppressImplicitAnyIndexErrors": true, + "strictNullChecks": false, + "skipLibCheck": true + } +} diff --git a/tools/bugserver-trigger/.bundle/config b/tools/bugserver-trigger/.bundle/config new file mode 100644 index 0000000..00f7fb2 --- /dev/null +++ b/tools/bugserver-trigger/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_CLEAN: "true" \ No newline at end of file diff --git a/tools/bugserver-trigger/.eslintrc.js b/tools/bugserver-trigger/.eslintrc.js new file mode 100644 index 0000000..3f78436 --- /dev/null +++ b/tools/bugserver-trigger/.eslintrc.js @@ -0,0 +1,12 @@ +require('@rushstack/eslint-patch/modern-module-resolution'); + +module.exports = { + extends: ['@internal/eslint-config/profile/lib'], + parserOptions: { tsconfigRootDir: __dirname }, + globals: { + __DEV__: 'readonly', + __VERSION__: 'readonly', + NodeJS: true + }, + ignorePatterns: ['scripts'] +}; diff --git a/tools/bugserver-trigger/bundler.config.js b/tools/bugserver-trigger/bundler.config.js new file mode 100644 index 0000000..f03958e --- /dev/null +++ b/tools/bugserver-trigger/bundler.config.js @@ -0,0 +1,13 @@ +/** + * @type {Partial} + */ +module.exports = { + formats: ['umd'], + // name: 'VRender', + + umdOutputFilename: 'index', + minify: false, + output: { + footer: '/* follow me on Twitter! @rich_harris */' + } +}; diff --git a/tools/bugserver-trigger/package.json b/tools/bugserver-trigger/package.json new file mode 100644 index 0000000..73c8a46 --- /dev/null +++ b/tools/bugserver-trigger/package.json @@ -0,0 +1,26 @@ +{ + "name": "@internal/bugserver-trigger", + "version": "0.0.1", + "description": "trigger bugserver for all vGrammar packages", + "private": true, + "scripts": { + "build": "bundle --clean", + "ci": "ts-node --transpileOnly --skipProject ./scripts/trigger-test.ts" + }, + "dependencies": { + "@visactor/vstory": "workspace:0.0.1" + }, + "devDependencies": { + "@rushstack/eslint-patch": "~1.1.4", + "@internal/bundler": "workspace:*", + "@internal/eslint-config": "workspace:*", + "@internal/ts-config": "workspace:*", + "typescript": "4.9.5", + "@types/node-fetch": "2.6.4", + "node-fetch": "2.6.6", + "form-data": "~4.0.0", + "ts-node": "10.9.0", + "@types/node": "*", + "eslint": "~8.18.0" + } +} diff --git a/tools/bugserver-trigger/scripts/trigger-test.ts b/tools/bugserver-trigger/scripts/trigger-test.ts new file mode 100644 index 0000000..ebd531b --- /dev/null +++ b/tools/bugserver-trigger/scripts/trigger-test.ts @@ -0,0 +1,301 @@ +import nodeFetch from 'node-fetch'; +import NodeFormData from 'form-data'; +import fs, { ReadStream } from 'fs'; +import path from 'path'; + +const BUG_SERVER_HOST = 'https://bug-server.zijieapi.com'; +const PRODUCT = 'VisActor/VStory'; +const CHECK_SCM_BUILD_INTERVAL_MS = 10 * 1000; +const CHECK_SCM_BUILD_MAX_COUNT = 30; +const CHECK_PHOTO_TEST_INTERVAL_MS = 10 * 1000; +const CHECK_PHOTO_TEST_MAX_COUNT = 100; +const API_END_POINT = '/api/ci/trigger'; +const API_URL = `${BUG_SERVER_HOST}${API_END_POINT}`; + +let checkPhotoTestMaxCount = CHECK_PHOTO_TEST_MAX_COUNT; + +interface Data { + data: D; + msg: string; + code: number; +} +interface UploadFileData { + fileUrl: string; +} +interface GetScmVersionData { + status: string; + version: string; +} +interface TriggerScmBuildData { + scmVersion: string; +} +interface TriggerPhotoTestData { + bundleId: string; + scmVersion: string; + taskAmount: number; +} +interface GetPhotoResultData { + totalCount: number; + successCount: number; + status: 'pending' | 'ok'; +} +async function inlineFetch( + inlineUrl: string, + inlineMethod: string, + inlineGetFormData: (isRetry: boolean) => NodeFormData, + inlineRetryCount: number +): Promise> { + let data: Data | null = null; + + const url = `${inlineUrl}?retry=${inlineRetryCount}`; + console.info('[inlineFetch][url]', url); + + const formData = inlineGetFormData(inlineRetryCount > 0); + const response = await nodeFetch(url, { + method: inlineMethod, + headers: formData.getHeaders(), + body: formData + }); + + console.info('[inlineFetch] response.status:', response.status); + console.info('[inlineFetch] response.statusText:', response.statusText); + console.info('[inlineFetch] response.headers:', JSON.stringify(response.headers.raw())); + + data = (await response.json()) as Data; + + if (data.code === -1) { + throw new Error(`Request failed with data: ${JSON.stringify(data)}`); + } + return data; +} + +async function fetch( + url: string, + method: string, + getFormData: (isRetry: boolean) => NodeFormData, + maxRetries = 3 +): Promise> { + let retryCount = 0; + let success = false; + + let data: Data | null = null; + + while (retryCount < maxRetries && !success) { + console.info('[fetch] retryCount', retryCount); + + try { + data = await inlineFetch(url, method, getFormData, retryCount); + success = true; + } catch (err) { + const _err = err as Error; + console.error('[fetch] err:', _err.message); + + retryCount++; + + if (retryCount === maxRetries) { + throw _err; + } + + // retry after 1 second while request failed + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + + if (data === null) { + throw new Error(`[fetch] failed: data not exists`); + } + + return data; +} + +const getFormData = (data: Record) => { + const formData = new NodeFormData({ readable: true }); + + formData.append('product', PRODUCT); + formData.append('token', process.env.BUG_SERVER_TOKEN); + + Object.entries(data).forEach(([key, value]) => { + if (key) { + formData.append(key, value ?? ''); + } + }); + + return formData; +}; + +async function uploadFile() { + const localFilePath = path.resolve(process.cwd(), 'dist/index.js'); + console.info(`[uploadFile] local path: ${localFilePath}`); + + let stream = fs.createReadStream(localFilePath); + const close = () => { + stream.close(); + stream.push(null); + stream.read(0); + }; + + const res = await fetch(API_URL, 'POST', isRetry => { + if (isRetry) { + close(); + stream = fs.createReadStream(localFilePath); + } + + return getFormData({ + bundleFile: stream, + triggerType: 'upload-file' + }); + }); + + return res; +} + +async function triggerScmBuild({ fileUrl }: { fileUrl: string }) { + const params = { + triggerType: 'scm-build', + fileUrl: fileUrl, + createUser: process.env.GITHUB_ACTOR ?? '', + commitBranchName: process.env.GITHUB_HEAD_REF ?? '' + }; + + const res = await fetch(API_URL, 'POST', () => getFormData(params)); + console.info(`[triggerScmBuild] scmVersion: ${res.data.scmVersion}`); + return res; +} + +async function getScmVersionInfo({ scmVersion }: { scmVersion: string }) { + const params = { + triggerType: 'scm-version-info', + scmVersion + }; + + const res = await fetch(API_URL, 'POST', () => getFormData(params)); + + console.info(`[getScmVersionInfo] result: ${JSON.stringify(res)}`); + return res; +} + +async function waitUntilScmBuildOK({ scmVersion }: { scmVersion: string }): Promise<{ status: string }> { + let count = 0; + + return await new Promise(resolve => { + const interval = setInterval(async () => { + count++; + const { + data: { status } + } = await getScmVersionInfo({ scmVersion }); + + // build_ok/build_failed/building/prepare + if (['build_ok', 'build_failed'].includes(status) || count > CHECK_SCM_BUILD_MAX_COUNT) { + resolve({ status }); + clearInterval(interval); + } + }, CHECK_SCM_BUILD_INTERVAL_MS); + }); +} + +async function triggerPhotoTest({ scmVersion, scmVersionStatus }: { scmVersion: string; scmVersionStatus: string }) { + const params = { + triggerType: 'photo-test', + scmVersion: scmVersion, + scmVersionStatus: scmVersionStatus, + commitId: process.env.GITHUB_SHA ?? '', + commitUrl: process.env.GITHUB_REF ?? '', + commitBranchName: process.env.GITHUB_HEAD_REF ?? '', + commitCreateUser: process.env.GITHUB_ACTOR ?? '', + commitDescription: '' + }; + + const res = await fetch(API_URL, 'POST', () => getFormData(params)); + return res; +} + +async function getPhotoResult({ scmVersion, bundleId }: { scmVersion: string; bundleId: string }) { + const params = { + triggerType: 'photo-result', + scmVersion, + bundleId + }; + + const res = await fetch(API_URL, 'POST', () => getFormData(params)); + + console.info(`[getPhotoResult] result: ${JSON.stringify(res)} `); + return res; +} + +async function waitUntilPhotoTestOK({ + bundleId, + scmVersion +}: { + bundleId: string; + scmVersion: string; +}): Promise { + let count = 0; + + return await new Promise(resolve => { + const interval = setInterval(async () => { + count++; + const { data } = await getPhotoResult({ scmVersion, bundleId }); + // pending / ok + if (['ok'].includes(data.status) || count > checkPhotoTestMaxCount) { + resolve(data); + clearInterval(interval); + } + }, CHECK_PHOTO_TEST_INTERVAL_MS); + }); +} + +async function trigger() { + const { + data: { fileUrl } + } = await uploadFile(); + + if (!fileUrl) { + throw new Error('uploadFile fail'); + } + console.info('[trigger] uploadFile success'); + + const { + data: { scmVersion } + } = await triggerScmBuild({ fileUrl }); + + const { status: scmVersionStatus } = await waitUntilScmBuildOK({ + scmVersion + }); + console.info(`[trigger] scmVersionStatus: ${scmVersionStatus}`); + + if (scmVersionStatus !== 'build_ok') { + throw new Error(`scm build status: ${scmVersionStatus}`); + } + + const { + data: { bundleId, taskAmount } + } = await triggerPhotoTest({ scmVersion, scmVersionStatus }); + console.info(`[trigger] bundleId: ${bundleId}`); + console.info(`[trigger] taskAmount: ${taskAmount}`); + + if (taskAmount) { + checkPhotoTestMaxCount = Math.ceil(taskAmount / 10); + } + + const { + status: photoTestStatus, + successCount, + totalCount + } = await waitUntilPhotoTestOK({ + bundleId, + scmVersion + }); + console.info( + `[trigger], test result status: ${photoTestStatus}, totalCount: ${totalCount}, successCount: ${successCount}` + ); + + if (photoTestStatus !== 'ok') { + throw new Error(`photo test status: ${photoTestStatus}`); + } + + if (successCount !== totalCount) { + throw new Error(`totalCount: ${totalCount}, successCount: ${successCount}`); + } +} + +trigger(); diff --git a/tools/bugserver-trigger/src/index.ts b/tools/bugserver-trigger/src/index.ts new file mode 100644 index 0000000..b1e46fb --- /dev/null +++ b/tools/bugserver-trigger/src/index.ts @@ -0,0 +1,5 @@ +// export const a = 'a'; +// export const b = 'b'; + +// global.a = a; +// global.b = b; diff --git a/tools/bugserver-trigger/tsconfig.eslint.json b/tools/bugserver-trigger/tsconfig.eslint.json new file mode 100644 index 0000000..91ac41e --- /dev/null +++ b/tools/bugserver-trigger/tsconfig.eslint.json @@ -0,0 +1,11 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "types": ["jest", "node"], + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "rootDir": "./" + }, + "include": ["src", "scripts"], + "exclude": [] +} diff --git a/tools/bugserver-trigger/tsconfig.json b/tools/bugserver-trigger/tsconfig.json new file mode 100644 index 0000000..dca8e21 --- /dev/null +++ b/tools/bugserver-trigger/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "paths": { + "@visactor/vstory": ["../../packages/vstory/src"] + }, + "target": "ES2016", + "useDefineForClassFields": true, + "module": "ES2015", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "references": [ + { + "path": "../../packages/vstory" + } + ], + "include": ["src", "scripts"] +} diff --git a/tools/bundler/.eslintrc.js b/tools/bundler/.eslintrc.js new file mode 100644 index 0000000..b15ec0e --- /dev/null +++ b/tools/bundler/.eslintrc.js @@ -0,0 +1,7 @@ +require("@rushstack/eslint-patch/modern-module-resolution"); + +module.exports = { + extends: ["@internal/eslint-config/profile/lib"], + parserOptions: { tsconfigRootDir: __dirname }, + ignorePatterns: ["bin", "output", "vitest.config.ts", "fixtures"], +}; diff --git a/tools/bundler/README.md b/tools/bundler/README.md new file mode 100644 index 0000000..e8645a5 --- /dev/null +++ b/tools/bundler/README.md @@ -0,0 +1,113 @@ +# @internal/bundler + +> 基于 [gulp](https://gulpjs.com/) + [rollup](https://rollupjs.org/introduction/) 封装的专门针对前端库的打包工具,支持 typescript、react、 less 和资源拷贝等能力 + +# 使用 + +``` +bundle [options] + +# eg. +bundle -f es -w dev --env __DEV__=true --env __ID__="'my_id'" +``` + +# 命令行参数说明 + +``` +-r, --root 项目根目录(绝对或相对路径) eg. --root /path/to/project +-c, --config 指定配置文件,默认 /bundler.config.js, eg. --config ./bundler.config.js +--tsconfig tsconfig.json 路径 eg. --tsconfig ./tsconfig.json +-i, --input 入口文件, 默认 /src/index.ts, eg. --config ./src/index.ts +-f, --formats 指定产物模块类型(umd,es,cjs), eg. -f es -f cjs +-n, --name UMD 产物中的全局变量名称, 默认取 package name eg. --name MyGlobalName +--copy 需要拷贝的静态资源文件后缀(umd产物无效), eg. --copy png --copy svg +--less 开启 less 编译支持 +-e, --envs 要替换的环境变量, eg. --env __DEV__=true --env __ID__="'my_id'" +--clean 删除产物目录 +--minify 是否输出压缩后的 UMD 产物文件 +-w, --watch 监听文件变化重新构建 +-s, --sourcemap 是否生成 sourcemap +``` + +# 配置文件 + +> 来自命令行参数的字段相比配置文件的相同字段优先级更高, 即可以用命令行参数覆盖配置文件中出现的字段 + +默认 `/bundler.config.js` 会被 _bundle_ 读取,配置文件需要导出一个配置对象: + +```javascript +module.exports = { + input: { + es: 'index.es.ts', + cjs: 'index.cjs.ts', + umd: 'index.umd.ts' + }, + formats: ['es', 'cjs', 'umd'], + outputDir: { + es: 'es', + cjs: 'cjs', + umd: 'dist' + }, + name: 'MyGlobalName' + // ...其他配置项 +}; +``` + +配置对象类型如下: + +```typescript +interface Config { + // 项目根路径(相对或绝对路径) + root: string; + // 项目源码所在目录(相对路径) + sourceDir: string; + // tsconfig.json 所在相对路径 + tsconfig: string; + // 入口文件相对路径 + input: string | Partial>; + // 输出产物类型 + formats: _ModuleKind[]; + // 输出产物类型相对路径 + outputDir: Partial>; + // UMD 产物中的全局变量名称, 默认取 package name + name: string; + // UMD 产物中的文件名称, 默认取 package name + umdOutputFilename: string; + // 是否开启sourcemap + sourcemap: boolean; + // 开启监听源码模式 + watch: boolean; + // 要拷贝的静态资源扩展名 + copy: string[]; + // 是否开启 less 编译支持 + less: boolean; + // 环境变量, 默认会注入版本号`__VERSION__` + envs: Record; + // 构建开始前,是否清空构建产物目录 + clean: boolean; + // 是否压缩 umd 产物文件 + minify: boolean; + // 出现编译错误时是否输出产物文件, 如果为true,则会停止构建且不输出任何东西 + noEmitOnError: boolean; + // 传给给 @babel/preset-env 的 `targets` 字段 see: https://babeljs.io/docs/babel-preset-env#targets + targets: string | string[] | Record; + // 构建 UMD 产物时,需要排除的模块名称 + external: string[] | ((rawPackageJson: RawPackageJson) => string[]); + // 构建 UMD 产物时,传递给 @rollup/plugin-alias 作为 entries 的选项 + alias: Array<{ find: string | RegExp; replacement: string; customResolver?: ResolverFunction | ResolverObject }>; + // 额外的 rollup 配置项 + rollupOptions: Omit; + // 构建前执行的任务列表 + preTasks: Record Promise>; + // 构建后执行的任务列表 + postTasks: Record Promise>; +} +type _ModuleKind = 'es' | 'cjs' | 'umd'; +``` + +# 测试 + +```shell +rushx dev --root fixtures/config [options] +rushx test +``` diff --git a/tools/bundler/bin/index.js b/tools/bundler/bin/index.js new file mode 100755 index 0000000..5820e52 --- /dev/null +++ b/tools/bundler/bin/index.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node +"use strict"; + +require('../output/bootstrap'); diff --git a/tools/bundler/fixtures/config/.gitignore b/tools/bundler/fixtures/config/.gitignore new file mode 100644 index 0000000..3adb6ed --- /dev/null +++ b/tools/bundler/fixtures/config/.gitignore @@ -0,0 +1,4 @@ +es +cjs +dist +umd \ No newline at end of file diff --git a/tools/bundler/fixtures/config/bundler.config.js b/tools/bundler/fixtures/config/bundler.config.js new file mode 100644 index 0000000..0fe587b --- /dev/null +++ b/tools/bundler/fixtures/config/bundler.config.js @@ -0,0 +1,70 @@ +const fs = require("fs-extra"); +const path = require("path"); + +function copyDistToModule(source, target) { + return fs.copy(source, target, { overwrite: true }); +} +function getModulePath(packageName, root) { + return path.join(root, "node_modules", packageName); +} + +function isModulePathExists(modulePath) { + return fs.existsSync(modulePath); +} + +function createPackageInNodeModules(packageName, root) { + const modulePath = getModulePath(packageName, root); + + if (!isModulePathExists(modulePath)) { + fs.mkdirSync(modulePath, { recursive: true }); + fs.writeJSONSync(`${modulePath}/package.json`, { + name: packageName, + version: "0.0.1", + main: "index.ts", + }); + fs.symlinkSync(`${root}/src/index.ts`, `${modulePath}/index.ts`); + console.log(`Created package: ${packageName} in node_modules`); + } +} +/** + * @type {Partial} + */ +module.exports = { + name: "qux", + formats: ["cjs", "es", "umd"], + // formats: ["es"], + sourceDir: "source", + external: (rawPackageJson) => Object.keys(rawPackageJson.dependencies), + outputDir: { + es: "es", + cjs: "cjs", + umd: "umd", + }, + noEmitOnError: true, + rollupOptions: { + cache: true, + }, + envs: { + __DEV__: JSON.stringify(true), + }, + copy: ["png", "css"], + preTasks: { + "Create Module": (_config, projectRoot, rawPackageJson) => { + createPackageInNodeModules(rawPackageJson.name, projectRoot); + return Promise.resolve(); + }, + }, + umdOutputFilename: 'index', + postTasks: { + "Copy dist": (config, projectRoot, rawPackageJson) => { + if (config.formats.includes("umd")) { + return copyDistToModule( + path.resolve(projectRoot, config.outputDir.umd), + `${getModulePath(rawPackageJson.name, projectRoot)}/dist`, + ); + } + + return Promise.resolve(); + }, + }, +}; diff --git a/tools/bundler/fixtures/config/package.json b/tools/bundler/fixtures/config/package.json new file mode 100644 index 0000000..f47268e --- /dev/null +++ b/tools/bundler/fixtures/config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@foo/qux", + "version": "1.0.0", + "scripts": { + "compile": "tsc --noEmit" + } +} diff --git a/tools/bundler/fixtures/config/source/custom.css b/tools/bundler/fixtures/config/source/custom.css new file mode 100644 index 0000000..3899cd3 --- /dev/null +++ b/tools/bundler/fixtures/config/source/custom.css @@ -0,0 +1,79 @@ +/* 欢迎页自定义 */ +.welcomePage .commands { + display: none; +} + +.welcomePage .splash .help { + display: none; +} + +.monaco-workbench .part.editor>.content .welcomePage .title { + margin-top: 1em; + margin-bottom: .5em; + flex: 1 100%; + display: none; +} + +.monaco-workbench .part.editor > .content .welcomePage a { + color: #2aa8a2; + transition: all .3s; +} + +.monaco-workbench .part.editor>.content .welcomePage .row { + display: flex; + flex-flow: row; + margin-left: 20%; +} + +.monaco-workbench .part.editor>.content .welcomePage .splash .showOnStartup, .monaco-workbench .part.editor>.content .welcomePage .splash .title { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: none; +} + +.monaco-workbench .part.editor>.content .welcomePage .splash li { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 3px 0; +} + +.monaco-workbench .part.editor > .content .welcomePage a:hover, .monaco-workbench .part.editor > .content .welcomePage a:active { + color: #6cc1bd; + border-left: 3px solid; + border-left-color: #41827e; + padding-left: 5px; + background: #2aa8a238; + padding: 0 10px; +} + +/* 欢迎页自定义 end * + +/* 自定义 quickOpen 位置 */ +.monaco-quick-open-widget { + position: absolute; + width: 600px; + z-index: 2000; + padding-bottom: 6px; + left: 55%; + top: 24% !important; + margin-left: -300px; + border: 1px solid #22A7A2; + border-bottom: 2px solid #22A7A2; +} + +/* 自定义小 quickOpen 位置 */ +.quick-input-widget { + position: absolute; + width: 600px; + z-index: 2000; + padding-bottom: 6px; + left: 55%; + top: 24% !important; + margin-left: -300px; + border: 1px solid #22A7A2; + border-bottom: 2px solid #22A7A2; +} diff --git a/tools/bundler/fixtures/config/source/foo/bar/index.ts b/tools/bundler/fixtures/config/source/foo/bar/index.ts new file mode 100644 index 0000000..90d15dd --- /dev/null +++ b/tools/bundler/fixtures/config/source/foo/bar/index.ts @@ -0,0 +1,5 @@ +import { isObject } from "@/utils"; + +export function bar(val: unknown) { + return isObject(val); +} diff --git a/tools/bundler/fixtures/config/source/foo/bar/web.png b/tools/bundler/fixtures/config/source/foo/bar/web.png new file mode 100644 index 0000000000000000000000000000000000000000..46994df596d2c5a437a0fdb21ac82bea77b3d225 GIT binary patch literal 9048 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 vAq4kG0PiP1`n~pLTFXqzNm literal 0 HcmV?d00001 diff --git a/tools/bundler/fixtures/config/source/foo/index.ts b/tools/bundler/fixtures/config/source/foo/index.ts new file mode 100644 index 0000000..a8f536b --- /dev/null +++ b/tools/bundler/fixtures/config/source/foo/index.ts @@ -0,0 +1 @@ +export const Foo = 'Foo'; diff --git a/tools/bundler/fixtures/config/source/global.d.ts b/tools/bundler/fixtures/config/source/global.d.ts new file mode 100644 index 0000000..00dda84 --- /dev/null +++ b/tools/bundler/fixtures/config/source/global.d.ts @@ -0,0 +1,2 @@ +declare const __VERSION__: string; +declare const __DEV__: boolean; \ No newline at end of file diff --git a/tools/bundler/fixtures/config/source/index.ts b/tools/bundler/fixtures/config/source/index.ts new file mode 100644 index 0000000..4cb0de0 --- /dev/null +++ b/tools/bundler/fixtures/config/source/index.ts @@ -0,0 +1,17 @@ +import { isArray } from "@/utils"; + +export type Viking = { + foo: string; +} + +export function bar(value: unknown) { + if (isArray(value)) { + return value.length; + } + if (__DEV__) { + console.log('xxx'); + } + return 0; +} + +export const version = __VERSION__; \ No newline at end of file diff --git a/tools/bundler/fixtures/config/source/utils/index.ts b/tools/bundler/fixtures/config/source/utils/index.ts new file mode 100644 index 0000000..f2919a3 --- /dev/null +++ b/tools/bundler/fixtures/config/source/utils/index.ts @@ -0,0 +1,15 @@ +import { Foo } from "@/foo"; + +export function isObject(value: unknown): value is Record { + return Object.prototype.toString.call(value) === "[object Object]"; +} + +export function isArray(value: unknown): value is Array { + return Object.prototype.toString.call(value) === "[object Array]"; +} + +export function isFunction(value: unknown): value is Function { + return typeof value === "function"; +} + +export const Bar = Foo; diff --git a/tools/bundler/fixtures/config/tsconfig.json b/tools/bundler/fixtures/config/tsconfig.json new file mode 100644 index 0000000..0c37b9c --- /dev/null +++ b/tools/bundler/fixtures/config/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "rootDir": "./", + "outDir": "output", + "target": "ES2015", + "module": "ESNext", + "declaration": true, + "sourceMap": false, + "jsx": "react-jsx", + "paths": { + "@/*": ["source/*"] + } + }, + "include": ["source"] +} + diff --git a/tools/bundler/package.json b/tools/bundler/package.json new file mode 100644 index 0000000..047ba3d --- /dev/null +++ b/tools/bundler/package.json @@ -0,0 +1,101 @@ +{ + "name": "@internal/bundler", + "version": "0.0.1", + "private": true, + "bin": { + "bundle": "bin/index.js" + }, + "files": [ + "output" + ], + "types": "output/index.d.ts", + "main": "output/index.js", + "scripts": { + "postinstall": "npm run build", + "prepublishOnly": "npm run build", + "eslint": "eslint -c .eslintrc.js src/", + "compile": "rm -rf ./output && tsc --project ./tsconfig.json --noEmit", + "build": "rm -rf ./output && tsc --project ./tsconfig.json", + "test": "vitest --run", + "run": "DEBUG='Bundler*' node ./output/bootstrap.js", + "dev": "DEBUG='Bundler*' ts-node --project ./tsconfig.json src/bootstrap.ts" + }, + "dependencies": { + "@babel/core": "7.20.12", + "@babel/generator": "7.21.1", + "@babel/plugin-proposal-class-properties": "7.18.6", + "@babel/plugin-proposal-export-default-from": "7.18.10", + "@babel/preset-env": "7.20.2", + "@babel/preset-react": "7.18.6", + "@babel/preset-typescript": "7.18.6", + "@rollup/plugin-alias": "5.0.0", + "@rollup/plugin-babel": "6.0.3", + "@rollup/plugin-commonjs": "24.1.0", + "@rollup/plugin-node-resolve": "15.0.2", + "@rollup/plugin-replace": "5.0.2", + "@rollup/plugin-terser": "0.4.1", + "@rollup/plugin-typescript": "11.1.0", + "@rollup/plugin-url": "8.0.1", + "@trufflesuite/spinnies": "0.1.1", + "rollup-plugin-visualizer": "5.9.2", + "autoprefixer": "10.4.13", + "babel-plugin-import": "1.13.6", + "clean-css": "5.3.2", + "debug": "4.3.4", + "fs-extra": "10.1.0", + "globby": "11.1.0", + "gulp": "4.0.2", + "gulp-clean": "0.4.0", + "gulp-if": "3.0.0", + "gulp-match": "1.1.0", + "gulp-replace": "1.1.4", + "gulp-sourcemaps": "3.0.0", + "gulp-typescript": "6.0.0-alpha.1", + "glob-watcher": "5.0.5", + "less": "4.1.3", + "lodash": "4.17.21", + "merge2": "1.4.1", + "ms": "2.1.3", + "postcss": "8.4.21", + "rollup": "3.20.5", + "semver": "7.3.4", + "terser": "5.17.1", + "through2": "4.0.2", + "undertaker": "1.3.0", + "vinyl": "2.2.1", + "yargs-parser": "21.1.1" + }, + "devDependencies": { + "@internal/eslint-config": "workspace:*", + "@internal/ts-config": "workspace:*", + "@rushstack/eslint-patch": "~1.1.4", + "@types/babel__core": "7.20.0", + "@types/clean-css": "4.2.6", + "@types/debug": "4.1.7", + "@types/fs-extra": "9.0.13", + "@types/gulp": "4.0.10", + "@types/gulp-if": "0.0.34", + "@types/gulp-match": "1.1.2", + "@types/gulp-sourcemaps": "0.0.35", + "@types/less": "3.0.3", + "@types/lodash": "4.14.182", + "@types/merge2": "1.4.0", + "@types/minimist": "1.2.2", + "@types/ms": "0.7.31", + "@types/node": "*", + "@types/semver": "7.3.12", + "@types/terser": "3.12.0", + "@types/through2": "2.0.38", + "@types/undertaker": "1.2.8", + "@types/vinyl": "2.0.7", + "@types/yargs-parser": "21.0.0", + "@types/glob-watcher": "5.0.2", + "eslint": "~8.18.0", + "ts-node": "10.9.0", + "typescript": "4.9.5", + "vitest": "0.30.1" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/tools/bundler/src/bootstrap.ts b/tools/bundler/src/bootstrap.ts new file mode 100644 index 0000000..d9e3dce --- /dev/null +++ b/tools/bundler/src/bootstrap.ts @@ -0,0 +1,161 @@ +/* eslint-disable no-console */ +import path from 'path'; +import ms from 'ms'; +import watcher from 'glob-watcher'; +import { DebugConfig } from './logic/debug'; +import { parserCLIArgs, getDefaultConfig, getFinalConfig, loadConfigFile, DEFAULT_CONFIG_FILE } from './logic/config'; +import type { _ModuleKind } from './logic/config'; +import { loadPackageJson } from './logic/package'; +import type { Task } from 'undertaker'; +import Undertaker from 'undertaker'; +import Spinnies from '@trufflesuite/spinnies'; +import { clean } from './tasks/clean'; +import { compile, getTSCompilerOptions, readUserTsconfig } from './tasks/modules'; +import { buildUmd } from './tasks/umd'; +import { buildStyle } from './tasks/style'; +import { copyFiles } from './tasks/copy'; + +function getSources(root: string, allowJs: boolean) { + const sources = [`${root}/**/*.tsx`, `${root}/**/*.ts`, `!${root}/**/stories/**`]; + if (allowJs) { + sources.unshift(`${root}/**/*.jsx`); + sources.unshift(`${root}/**/*.js`); + } + return sources; +} + +enum Tasks { + CLEAN_FOLDER = 'Clean folder', + BUILD_ESM = 'Build ESM', + BUILD_CJS = 'Build CJS', + BUILD_UMD = 'Build UMD', + BUILD_STYLE = 'Build style', + // COPY_DIST = "Copy dist", + COPY_FILES = 'Copy files' +} +async function bootstrap() { + const args = parserCLIArgs(process.argv.slice(2)); + DebugConfig('CLI args', args); + + const PROJECT_ROOT = path.resolve(process.env.__PROJECT_ROOT__ || args.root || process.cwd()); + DebugConfig('PROJECT_ROOT', PROJECT_ROOT); + + const rawPackageJson = loadPackageJson(PROJECT_ROOT); + if (!rawPackageJson) { + throw new Error('load project package.json failed.'); + } + + const userConfigFilePath = path.resolve(PROJECT_ROOT, args.config || DEFAULT_CONFIG_FILE); + DebugConfig('User config file path', userConfigFilePath); + + const userConfig = loadConfigFile(userConfigFilePath); + const config = getFinalConfig(args, userConfig, getDefaultConfig(), rawPackageJson.version); + DebugConfig('Final config', config); + + const taker = new Undertaker(); + const spinnies = new Spinnies(); + const taskList: Task[] = []; + const sources = getSources(`${PROJECT_ROOT}/${config.sourceDir}`, true); + const userTsConfig = readUserTsconfig(path.resolve(PROJECT_ROOT, config.tsconfig)); + + const times: Record> = {}; + function _task(name: string, cb: () => Promise) { + taker.task(name, async () => { + times[name] = { start: 0, end: 0 }; + times[name]!.start = Number(new Date()); + spinnies.add(name, { text: `Running [${name}]` }); + await cb(); + times[name]!.end = Number(new Date()); + const diff = times[name]!.end - times[name]!.start; + spinnies.succeed(name, { text: `Finished [${name}] +${ms(diff)}` }); + }); + } + + if (config.preTasks) { + const tasksKey = Object.keys(config.preTasks); + if (tasksKey.length) { + tasksKey.forEach(name => { + _task(name, () => config.preTasks[name]!(config, PROJECT_ROOT, rawPackageJson)); + taskList.push(name); + }); + } + } + + if (config.clean) { + _task(Tasks.CLEAN_FOLDER, () => clean(Object.values(config.outputDir), PROJECT_ROOT)); + taskList.push(Tasks.CLEAN_FOLDER); + } + + if (Array.isArray(config.formats) && config.formats) { + const subBuildTasks: string[] = []; + const moduleKind: Record<'es' | 'cjs', 'es2015' | 'commonjs'> = { + es: 'es2015', // default module of es is 'es2015' + cjs: 'commonjs' + }; + config.formats.forEach((format: _ModuleKind) => { + const taskName = `Build ${format}`; + subBuildTasks.push(taskName); + if (format === 'umd') { + if (config.minify) { + subBuildTasks.push(`${taskName}_min`); + _task(`${taskName}_min`, () => buildUmd(config, PROJECT_ROOT, rawPackageJson, true)); + } + _task(`${taskName}`, () => buildUmd(config, PROJECT_ROOT, rawPackageJson, false)); + return; + } + + _task(taskName, () => + compile( + sources, + getTSCompilerOptions(moduleKind[format], userTsConfig.compilerOptions, config.noEmitOnError), + config.envs, + path.resolve(PROJECT_ROOT, config.outputDir[format]!), + path.resolve(PROJECT_ROOT, config.tsconfig), + PROJECT_ROOT, + config.noEmitOnError, + config.sourcemap + ) + ); + }); + taskList.push(taker.parallel(subBuildTasks)); + } + if (config.less) { + _task(Tasks.BUILD_STYLE, () => + buildStyle([`${PROJECT_ROOT}/${config.sourceDir}/**/*.less`], PROJECT_ROOT, config.formats, config.outputDir) + ); + taskList.push(Tasks.BUILD_STYLE); + } + if ( + Array.isArray(config.copy) && + config.copy.length && + (config.formats.includes('cjs') || config.formats.includes('es')) + ) { + _task(Tasks.COPY_FILES, () => copyFiles(PROJECT_ROOT, config)); + taskList.push(Tasks.COPY_FILES); + } + if (config.postTasks) { + const tasksKey = Object.keys(config.postTasks); + if (tasksKey.length) { + tasksKey.forEach(name => { + _task(name, () => config.postTasks[name]!(config, PROJECT_ROOT, rawPackageJson)); + taskList.push(name); + }); + } + } + if (config.watch) { + watcher(sources, taker.series(taskList)).on('change', filename => { + console.log(`[${path.relative(PROJECT_ROOT, filename)}] changed, Rebuild...`); + }); + return; + } + taker.series(taskList)(err => { + if (err) { + throw err; + } + }); +} + +bootstrap().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/tools/bundler/src/global.d.ts b/tools/bundler/src/global.d.ts new file mode 100644 index 0000000..3db73b2 --- /dev/null +++ b/tools/bundler/src/global.d.ts @@ -0,0 +1,4 @@ +declare module 'gulp-clean' { + const m = (opt?: { force: boolean }): NodeJS.ReadWriteStream => {}; + export = m; +} diff --git a/tools/bundler/src/index.ts b/tools/bundler/src/index.ts new file mode 100644 index 0000000..4f8d30e --- /dev/null +++ b/tools/bundler/src/index.ts @@ -0,0 +1,8 @@ +export type { Config } from './logic/config'; +export type { RawPackageJson } from './logic/package'; + +export { loadPackageJson } from './logic/package'; +export { loadConfigFile } from './logic/config'; + +export { clean } from './tasks/clean'; +export { buildStyle } from './tasks/style'; diff --git a/tools/bundler/src/logic/alias.ts b/tools/bundler/src/logic/alias.ts new file mode 100644 index 0000000..78f6016 --- /dev/null +++ b/tools/bundler/src/logic/alias.ts @@ -0,0 +1,118 @@ +import { Transform, TransformCallback } from 'stream'; +import File from 'vinyl'; +import path from 'path'; + +type Options = { + cwd: string; + paths: Record; + // baseUrl: string; +}; + +export interface FileData { + path: string; + index: number; + import: string; +} + +const COMMENTED_PATTERN = /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)|(\/\/[^\n\r]*(?:[\n\r]+|$))/; +const IMPORT_PATTERNS = [ + /from (["'])(.*?)\1/g, + /import\((["'])(.*?)\1\)/g, + /require\((["'])(.*?)\1\)/g, + /import\s+(["'])(.*?)\1/g +]; + +function parseImports(file: ReadonlyArray, dir: string): FileData[] { + return file.flatMap((line, index) => findImports(line).map(i => ({ path: dir, index, import: i }))); +} + +function findImports(line: string): string[] { + line = line.replace(COMMENTED_PATTERN, ''); + + return IMPORT_PATTERNS.flatMap(pattern => [...line.matchAll(pattern)].map(match => match[2]!)); +} + +function resolveImports(file: ReadonlyArray, imports: FileData[], options: Options): string[] { + const { paths, cwd } = options; + + const aliases: { [key: string]: string[] | undefined } = {}; + for (const alias in paths) { + /* istanbul ignore else */ + if (paths.hasOwnProperty(alias)) { + let resolved = alias; + if (alias.endsWith('/*')) { + resolved = alias.replace('/*', '/'); + } + + aliases[resolved] = paths[alias]; + } + } + + const lines: string[] = [...file]; + for (const imported of imports) { + const line = file[imported.index]!; + + let resolved = ''; + for (const alias in aliases) { + /* istanbul ignore else */ + if (aliases.hasOwnProperty(alias) && imported.import.startsWith(alias)) { + const choices: string[] | undefined = aliases[alias]; + + if (choices !== undefined) { + resolved = choices[0]!; + if (resolved.endsWith('/*')) { + resolved = resolved.replace('/*', '/'); + } + + resolved = imported.import.replace(alias, resolved); + + break; + } + } + } + + if (resolved.length < 1) { + continue; + } + + const current = path.relative(cwd, path.dirname(imported.path)); + const target = path.relative(current, resolved); + + lines[imported.index] = line.replace(imported.import, `./${target}`); + } + + return lines; +} + +export function alias(options: Options) { + return new Transform({ + objectMode: true, + transform: (file: File, _encoding: BufferEncoding, callback: TransformCallback) => { + /* istanbul ignore if */ + if (file.isStream()) { + return callback(new Error('Streaming is not supported.')); + } + + if (file.isNull() || !file.contents) { + return callback(undefined, file); + } + + if (!file.path) { + return callback(new Error('Received file with no path. Files must have path to be resolved.')); + } + + const lines = file.contents.toString().split('\n'); + const imports = parseImports(lines, file.path); + + if (imports.length === 0) { + return callback(undefined, file); + } + + const resolved = resolveImports(lines, imports, options); + + file.contents = Buffer.from(resolved.join('\n')); + + callback(undefined, file); + } + }); +} diff --git a/tools/bundler/src/logic/babel.config.ts b/tools/bundler/src/logic/babel.config.ts new file mode 100644 index 0000000..e750fbd --- /dev/null +++ b/tools/bundler/src/logic/babel.config.ts @@ -0,0 +1,32 @@ +import type { PluginItem } from '@babel/core'; + +export type BabelPlugins = { + presets: PluginItem[]; + plugins: PluginItem[]; +}; +export function getBabelPlugins(packageName: string): BabelPlugins { + const plugins = [ + require.resolve('@babel/plugin-proposal-export-default-from'), + require.resolve('@babel/plugin-proposal-class-properties'), + [ + require.resolve('babel-plugin-import'), + { + style: true, + libraryName: packageName, + libraryDirectory: 'es', + camel2DashComponentName: false + } + ] + ]; + + const presets = [ + require.resolve('@babel/preset-react'), + require.resolve('@babel/preset-env'), + require.resolve('@babel/preset-typescript') + ]; + + return { + presets, + plugins + }; +} diff --git a/tools/bundler/src/logic/config.test.ts b/tools/bundler/src/logic/config.test.ts new file mode 100644 index 0000000..700add1 --- /dev/null +++ b/tools/bundler/src/logic/config.test.ts @@ -0,0 +1,77 @@ +import { describe, it, expect } from 'vitest'; +import { parserCLIArgs, getFinalConfig, getDefaultConfig, loadConfigFile } from './config'; +import { loadPackageJson } from './package'; +import path from 'path'; + +const userConfigFilePath = path.resolve(__dirname, '../../fixtures/config/bundler.config.js'); + +describe('config', () => { + it('parser cli args', () => { + const args = parserCLIArgs( + `--envs version="'x.y.z'" -f es --formats cjs --envs __DEV__=true --config xxx.js -c yyy.js --name foo --name qux --clean -s false` + ); + expect(args.envs?.length).toEqual(2); + expect(args.config).toEqual('xxx.js'); + expect(args.name).toEqual('foo'); + expect(args.envs).toEqual([`version="'x.y.z'"`, '__DEV__=true']); + expect(args.formats).toEqual([`es`, 'cjs']); + expect(args.sourcemap).toEqual(false); + expect(args.clean).toEqual(true); + }); + it('should get correctly config from cli args', () => { + const rawPackageJson = loadPackageJson(process.cwd()); + if (!rawPackageJson) { + return; + } + + const name = 'foo'; + const root = '/path/to/project'; + const tsconfig = '/path/to/tsconfig'; + const input = 'source/index.ts'; + + const args = parserCLIArgs( + `--root ${root} --config ${userConfigFilePath} --tsconfig=${tsconfig} --input ${input} --formats es -f cjs -f umd --name ${name} -s -w -e version="'x.y.z'" --envs __DEV__=true --less --copy png --copy css` + ); + const defaultConfig = getDefaultConfig(); + const userConfig = loadConfigFile(args.config || ''); + const config = getFinalConfig(args, userConfig, defaultConfig, rawPackageJson.version); + + // expect(defaultConfig.name).toEqual(packageNameToPath(rawPackageJson.name)); + expect(config.name).toEqual(name); + expect(config.root).toEqual(root); + expect(config.tsconfig).toEqual(tsconfig); + expect(config.input).toEqual(input); + expect(config.formats).toEqual(['es', 'cjs', 'umd']); + expect(JSON.parse(config.envs['version'] as string)).toEqual("'x.y.z'"); + expect(JSON.parse(config.envs['__DEV__'] as string)).toEqual(true); + expect(JSON.parse(config.envs['__VERSION__'] as string)).toEqual(rawPackageJson.version); + expect(config.sourcemap).toEqual(true); + expect(config.watch).toEqual(true); + expect(config.less).toEqual(true); + // expect(config.dev).toEqual(true); + expect(config.clean).toEqual(false); + expect(config.copy).toEqual(['png', 'css']); + }); + it('should get correctly config from user config', () => { + const rawPackageJson = loadPackageJson(process.cwd()); + if (!rawPackageJson) { + return; + } + + const defaultConfig = getDefaultConfig(); + const userConfig = loadConfigFile(userConfigFilePath); + const config = getFinalConfig({}, userConfig, defaultConfig, rawPackageJson.version); + + // expect(defaultConfig.name).toEqual(packageNameToPath(rawPackageJson.name)); + expect(config.name).toEqual(userConfig.name); + expect(config.formats).toEqual(userConfig.formats); + expect(config.outputDir).toBeDefined(); + expect(config.outputDir.cjs).toBe('cjs'); + if (typeof config.external === 'function') { + expect(config.external(rawPackageJson)).toEqual(Object.keys(rawPackageJson.dependencies || {})); + } + expect(config.rollupOptions.cache).toEqual(true); + // expect(config.rollupOptions.onwarn).toBeDefined(); + expect(config.copy).toEqual(['png', 'css']); + }); +}); diff --git a/tools/bundler/src/logic/config.ts b/tools/bundler/src/logic/config.ts new file mode 100644 index 0000000..5106fa0 --- /dev/null +++ b/tools/bundler/src/logic/config.ts @@ -0,0 +1,200 @@ +import type { Arguments } from 'yargs-parser'; +import ArgsParser from 'yargs-parser'; +import type { RawPackageJson } from './package'; +import type { RollupOptions } from 'rollup'; +import type { Alias } from '@rollup/plugin-alias'; + +const stringKeys = ['root', 'config', 'input', 'name', 'tsconfig']; +function getCoerce(keys: string[]) { + const coerce: { [key: string]: (arg: unknown) => unknown } = {}; + keys.forEach(key => { + coerce[key] = arg => { + if (Array.isArray(arg)) { + return arg[0]; + } + return arg; + }; + }); + return coerce; +} + +export interface CLIArgs extends Arguments { + root: string; + config: string; + input: string; + formats: _ModuleKind[]; + name: string; + sourcemap: boolean; + watch: boolean; + envs: string[]; + tsconfig: string; + less: boolean; + // dev: boolean; + clean: boolean; + minify: boolean; +} +export function parserCLIArgs(argv: string | string[]): Partial { + return ArgsParser(argv, { + alias: { + r: 'root', + c: 'config', + i: 'input', + f: 'formats', + n: 'name', + s: 'sourcemap', + w: 'watch', + e: 'envs', + m: 'minify', + a: 'analysis' + }, + array: ['formats', 'envs', 'copy'], + string: ['config'], + boolean: ['watch', 'less', 'clean', 'minify', 'sourcemap', 'analysis'], + coerce: getCoerce(stringKeys) + }); +} + +export enum ModuleKind { + es = 'es', + cjs = 'cjs', + umd = 'umd' +} +export type _ModuleKind = keyof typeof ModuleKind; + +export interface Config { + // 项目根路径(相对或绝对路径) + root: string; + // 项目源码所在目录(相对路径) + sourceDir: string; + // tsconfig.json 所在相对路径 + tsconfig: string; + // 入口文件相对路径 + input: string | Partial>; + // 输出产物类型 + formats: _ModuleKind[]; + // 输出产物类型相对路径 + outputDir: Partial>; + // UMD 产物中的全局变量名称, 默认取 package name + name: string; + // UMD 产物中的文件名称, 默认取 package name + umdOutputFilename: string; + // 是否开启sourcemap + sourcemap: boolean; + // 开启监听源码模式 + watch: boolean; + // 要拷贝的静态资源扩展名 + copy: string[]; + // 是否开启 less 编译支持 + less: boolean; + // 环境变量, 默认会注入版本号`__VERSION__` + envs: Record; + // 构建开始前,是否清空构建产物目录 + clean: boolean; + // 是否压缩 umd 产物文件 + minify: boolean; + // 出现编译错误时是否输出产物文件, 如果为true,则会停止构建且不输出任何东西 + noEmitOnError: boolean; + // 传给给 @babel/preset-env 的 `targets` 字段 see: https://babeljs.io/docs/babel-preset-env#targets + targets: string | string[] | Record; + // 构建 UMD 产物时,需要排除的模块名称 + external: string[] | ((rawPackageJson: RawPackageJson) => string[]); + // 构建 UMD 产物时,传递给 @rollup/plugin-alias 作为 entries 的选项 + alias: Array; + // 额外的 rollup 配置项 + rollupOptions: Omit; + // 构建前执行的任务列表 + preTasks: Record Promise>; + // 构建后执行的任务列表 + postTasks: Record Promise>; + globals: Record; + analysis?: boolean; +} + +export const DEFAULT_CONFIG_FILE = 'bundler.config.js'; +export function getDefaultConfig(): Config { + return { + root: process.cwd(), + sourceDir: 'src', + tsconfig: 'tsconfig.json', + input: { + es: 'index.ts', + cjs: 'index.ts', + umd: 'index.ts' + }, + formats: ['cjs', 'es', 'umd'], + outputDir: { + es: 'es', + cjs: 'cjs', + umd: 'dist' + }, + name: '', + umdOutputFilename: '', + copy: [], + sourcemap: true, + watch: false, + less: false, + envs: {}, + // dev: false, + clean: false, + minify: true, + noEmitOnError: true, + targets: 'defaults and not IE 11', + external: [], + alias: [], + rollupOptions: {}, + preTasks: {}, + postTasks: {}, + globals: {} + }; +} + +export function loadConfigFile(filePath: string): Partial { + try { + require.resolve(filePath); + } catch (error) { + // eslint-disable-next-line no-console + console.error(`The config file ${filePath} is not exists.`); + process.exit(1); + } + return require(filePath); +} + +function parserEnvsOfCLIArgs(envs: string[]): Record { + const _envs: Record = {}; + envs.forEach(env => { + const _s = env.split('='); + if (Array.isArray(_s) && _s.length) { + const key = _s[0] as string; + _envs[key] = _s[1] as boolean | string | number; + } + }); + + return _envs; +} + +function cliArgsToConfig(cliArgs: Partial): Partial { + const config: Partial = {}; + Object.keys(cliArgs).forEach(key => { + if (key === 'envs') { + return; + } + // @ts-ignore + config[key] = cliArgs[key]; + }); + return config; +} + +export function getFinalConfig( + cliArgs: Partial, + userConfig: Partial, + defaultConfig: Config, + packageVersion: string +): Config { + const parsedCLIEnvs = parserEnvsOfCLIArgs(cliArgs.envs || []); + const envs = { + ...userConfig.envs, + ...parsedCLIEnvs, + __VERSION__: JSON.stringify(packageVersion) + }; + return { ...defaultConfig, ...userConfig, ...cliArgsToConfig(cliArgs), envs }; +} diff --git a/tools/bundler/src/logic/debug.ts b/tools/bundler/src/logic/debug.ts new file mode 100644 index 0000000..befd3c6 --- /dev/null +++ b/tools/bundler/src/logic/debug.ts @@ -0,0 +1,6 @@ +import createDebug from 'debug'; + +const debug = createDebug('Bundler'); + +export const DebugConfig = debug.extend('config'); +export const DebugCompile = debug.extend('compile'); diff --git a/tools/bundler/src/logic/package.ts b/tools/bundler/src/logic/package.ts new file mode 100644 index 0000000..020b292 --- /dev/null +++ b/tools/bundler/src/logic/package.ts @@ -0,0 +1,31 @@ +import fs from 'fs-extra'; + +export type RawPackageJson = { + name: string; + description?: string; + version: string; + main?: string; + scripts?: Record; + repository?: Record; + devDependencies?: Record; + dependencies?: Record; + peerDependencies?: Record; + keywords?: string[]; + author?: string; + browserslist?: string[]; + homepage?: string; +} & Record; + +export function loadPackageJson(absPath: string): RawPackageJson | null { + try { + return fs.readJsonSync(`${absPath}/package.json`, { encoding: 'utf-8' }); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + return null; + } +} + +export function packageNameToPath(name: string) { + return name.replace('@', '').replace('/', '_'); +} diff --git a/tools/bundler/src/logic/rollup.config.ts b/tools/bundler/src/logic/rollup.config.ts new file mode 100644 index 0000000..7534867 --- /dev/null +++ b/tools/bundler/src/logic/rollup.config.ts @@ -0,0 +1,77 @@ +import type { RollupOptions, Plugin } from 'rollup'; +import type { RawPackageJson } from './package'; +import type { BabelPlugins } from './babel.config'; +import path from 'path'; + +import resolve from '@rollup/plugin-node-resolve'; +import babel from '@rollup/plugin-babel'; +import commonjs from '@rollup/plugin-commonjs'; +import typescript from '@rollup/plugin-typescript'; +import replace from '@rollup/plugin-replace'; +import terser from '@rollup/plugin-terser'; +import url from '@rollup/plugin-url'; +import Alias from '@rollup/plugin-alias'; +import { visualizer } from 'rollup-plugin-visualizer'; +import type { Config } from './config'; + +function getExternal( + rawPackageJson: RawPackageJson, + userExternal: string[] | ((rawPackageJson: RawPackageJson) => string[]) +): string[] { + if (typeof userExternal === 'function') { + return userExternal(rawPackageJson); + } + if (Array.isArray(userExternal) && userExternal.length) { + return userExternal; + } + return Object.keys(rawPackageJson.peerDependencies || {}); +} + +export function getRollupOptions( + projectRoot: string, + entry: string, + rawPackageJson: RawPackageJson, + babelPlugins: BabelPlugins, + config: Config +): RollupOptions { + const analysisPlugins = config.analysis + ? [ + visualizer({ + open: true, + gzipSize: true, + emitFile: true, + template: 'treemap' + }) + ] + : []; + + return { + input: entry, + external: getExternal(rawPackageJson, config.external), + ...config.rollupOptions, + plugins: [ + resolve(), + commonjs(), + babel({ ...babelPlugins, babelHelpers: 'bundled' }), + replace({ ...config.envs, preventAssignment: true }), + typescript({ + tsconfig: path.resolve(projectRoot, config.tsconfig), + compilerOptions: { + sourceMap: false, + declaration: false + } + }), + url({ + limit: 8192, // 小于 8kb 的图片将被转换为 base64 + include: ['**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.svg'], + fileName: 'static/media/[name].[hash:8].[ext]', + publicPath: '/', + destDir: path.resolve(projectRoot, config.outputDir.umd!) + }), + Alias({ entries: config.alias }), + ...analysisPlugins, + ...(config.minify ? [terser()] : []), + ...((config.rollupOptions.plugins as Plugin[]) || []) + ] + }; +} diff --git a/tools/bundler/src/tasks/clean.ts b/tools/bundler/src/tasks/clean.ts new file mode 100644 index 0000000..bfaa8dc --- /dev/null +++ b/tools/bundler/src/tasks/clean.ts @@ -0,0 +1,17 @@ +import gulp from 'gulp'; +import gulpClean from 'gulp-clean'; + +export function clean(folders: string[], cwd?: string) { + return new Promise(resolve => { + gulp + .src(folders, { + cwd: cwd, + read: false, + allowEmpty: true + }) + .pipe(gulpClean({ force: true })) + .on('finish', () => { + resolve(undefined); + }); + }); +} diff --git a/tools/bundler/src/tasks/copy.ts b/tools/bundler/src/tasks/copy.ts new file mode 100644 index 0000000..a27ae6c --- /dev/null +++ b/tools/bundler/src/tasks/copy.ts @@ -0,0 +1,24 @@ +import gulp from 'gulp'; +import path from 'path'; + +import type { Config } from '../logic/config'; + +export function copyFiles(projectRoot: string, config: Config) { + return new Promise(resolve => { + const willCopyAssets = gulp.src(config.copy.map(ext => `${projectRoot}/${config.sourceDir}/**/*.${ext}`)); + + const esFolder = path.resolve(projectRoot, config.outputDir.es!); + const cjsFolder = path.resolve(projectRoot, config.outputDir.cjs!); + let stream: NodeJS.ReadableStream | undefined = undefined; + if (config.formats.includes('cjs')) { + stream = willCopyAssets.pipe(gulp.dest(cjsFolder)); + } + if (config.formats.includes('es')) { + stream = (stream || willCopyAssets).pipe(gulp.dest(esFolder)); + } + + stream?.on('finish', () => { + resolve(undefined); + }); + }); +} diff --git a/tools/bundler/src/tasks/modules.ts b/tools/bundler/src/tasks/modules.ts new file mode 100644 index 0000000..66edb1d --- /dev/null +++ b/tools/bundler/src/tasks/modules.ts @@ -0,0 +1,164 @@ +import gulp from 'gulp'; +import * as ts from 'typescript'; +import gulpSourceMaps from 'gulp-sourcemaps'; +import type { Settings } from 'gulp-typescript'; +import gulpTS from 'gulp-typescript'; +import gulpReplace from 'gulp-replace'; +import fs from 'fs'; +import merge from 'merge2'; +import through2 from 'through2'; +import { minify } from 'terser'; +import gulpIF from 'gulp-if'; +import gulpMatch from 'gulp-match'; +import { DebugCompile, DebugConfig } from '../logic/debug'; +import { alias } from '../logic/alias'; + +export function getTSCompilerOptions( + moduleKind: 'esnext' | 'commonjs' | 'es2015', + userTSCompilerOptions: Record = {}, + noEmitOnError: boolean +): Settings { + delete userTSCompilerOptions.outDir; + const res: Settings = { + moduleResolution: 'node', + target: 'es2016', + noEmit: false, + emitDeclarationOnly: false, + declaration: true, + isolatedModules: false, + allowSyntheticDefaultImports: true, + module: moduleKind, + skipLibCheck: true, + noEmitOnError: noEmitOnError, + ...userTSCompilerOptions + }; + + return res; +} + +// getTSCompilerOptions(ModuleKind.ESNext) + +export function readUserTsconfig(absTsConfigPath: string): { + extends: string; + compilerOptions: Record; +} { + const configJson = ts.readConfigFile(absTsConfigPath, path => fs.readFileSync(path, { encoding: 'utf-8' })); + + if (configJson.error) { + throw new Error(ts.formatDiagnostics([configJson.error], ts.createCompilerHost(ts.getDefaultCompilerOptions()))); + } + return configJson.config; +} + +export function cssInjection(content: string) { + return content + .replace(/\/style\/?'/g, "/style/css'") + .replace(/\/style\/?"/g, '/style/css"') + .replace(/\.less/g, '.css'); +} + +export function compile( + sources: string[], + tsCompilerOptions: Settings, + envs: Record, + outputPath: string, + absTsConfigPath: string, + projectRoot: string, + noEmitOnError: boolean, + sourceMap: boolean +) { + DebugConfig('tsCompilerOptions', tsCompilerOptions); + + const tsProject = gulpTS.createProject(absTsConfigPath, tsCompilerOptions); + const hasAlias = Object.keys(tsProject.config.compilerOptions?.paths || {}).length > 0; + + return new Promise(resolve => { + let sourcesStream = gulp.src(sources); + for (const [key, value] of Object.entries(envs)) { + sourcesStream = sourcesStream + .pipe( + through2.obj(function _z(file, _encoding, cb) { + if (!gulpMatch(file, '**/*.d.ts')) { + this.push(file); + } + return cb(); + }) + ) + .pipe(gulpReplace(key, value)); + } + + const tsResult = sourcesStream + .pipe( + gulpIF( + hasAlias, + alias({ + paths: tsProject.config.compilerOptions.paths, + cwd: projectRoot + }) + ) + ) + .pipe(gulpIF(sourceMap, gulpSourceMaps.init())) + .pipe(tsProject(gulpTS.reporter.longReporter())) + .on('error', function _err() { + if (noEmitOnError) { + process.exit(1); + } else { + // @ts-ignore + (this as any).emit('end'); + } + }); + + merge([ + tsResult.js + .pipe( + through2.obj(async function z(file, encoding, next) { + // only remove dead code + const _contents = await minify(file.contents.toString(encoding), { + compress: { + unused: true, + drop_debugger: false, + drop_console: false, + dead_code: true, + global_defs: {}, + passes: 1 + }, + mangle: false, + format: { + beautify: true, + comments: 'all' + } + }); + if (_contents.code) { + file.contents = Buffer.from(_contents.code); + this.push(file); + } else { + DebugCompile('UnRemove dead code for', file.path); + } + next(); + }) + ) + .pipe( + through2.obj(function z(file, encoding, next) { + this.push(file.clone()); + if (file.path.match(/(\/|\\)style(\/|\\)index\.js/)) { + DebugCompile('CSS inject for', file.path); + + const content = file.contents.toString(encoding); + + file.contents = Buffer.from(cssInjection(content)); + file.path = file.path.replace(/index\.js/, 'css.js'); + + this.push(file); + } + + next(); + }) + ) + .pipe(gulp.dest(outputPath)), + tsResult.js.pipe(gulpIF(sourceMap, gulpSourceMaps.write('.'))).pipe(gulp.dest(outputPath)), + tsResult.dts.pipe(gulp.dest(outputPath)) + ]).on('finish', () => { + resolve(undefined); + }); + }); +} diff --git a/tools/bundler/src/tasks/style.ts b/tools/bundler/src/tasks/style.ts new file mode 100644 index 0000000..9ac1f53 --- /dev/null +++ b/tools/bundler/src/tasks/style.ts @@ -0,0 +1,85 @@ +import less from 'less'; +import postcss from 'postcss'; +import autoprefixer from 'autoprefixer'; +import through2 from 'through2'; +import path from 'path'; +import fs from 'fs'; +import gulpIf from 'gulp-if'; +import gulp from 'gulp'; +import CleanCss from 'clean-css'; +import type { _ModuleKind } from '../logic/config'; + +export function compileLess(content: string) { + const _content = content.replace(/^\uFEFF/, ''); + + const lessOpts = { + javascriptEnabled: true + }; + + return less + .render(_content, lessOpts) + .then(result => postcss([autoprefixer]).process(result.css, { from: undefined })) + .then(r => r.css); +} + +export function buildStyle( + sources: string[], + projectRoot: string, + formats: _ModuleKind[], + outputDir: Partial> +) { + return new Promise(resolve => { + const lessEntry: string[] = []; + const cssEntry: string[] = []; + + gulp + .src(sources) + .pipe( + // see file type: https://www.npmjs.com/package/vinyl + through2.obj(function foo(file, _encoding, next) { + this.push(file.clone()); + if (file.path.match(/(\/|\\)style(\/|\\)index\.less$/)) { + // contact output entry less file + const relativePath = path.relative(`${outputDir.umd}/css`, outputDir.es!); + lessEntry.push(`@import '${relativePath}/${file.relative}';`); + + compileLess(file.contents.toString()) + .then(css => { + file.contents = Buffer.from(css); + file.path = file.path.replace(/\.less$/, '.css'); + + this.push(file); + + // contact output entry css file + cssEntry.push(file.contents.toString()); + + next(); + }) + .catch(e => { + // eslint-disable-next-line no-console + console.error(e); + }); + } else { + next(); + } + }) + ) + .pipe(gulpIf(formats.includes('es'), gulp.dest(outputDir.es!, { cwd: projectRoot }))) + .pipe(gulpIf(formats.includes('cjs'), gulp.dest(outputDir.cjs!, { cwd: projectRoot }))) + .on('finish', () => { + if (formats.includes('umd')) { + // write output entry less/css file + fs.mkdirSync(`${outputDir.umd}/css`, { recursive: true }); + + const cssEntryContent = cssEntry.join('\n'); + const minifyCssEntryContent = new CleanCss().minify(cssEntryContent); + fs.writeFileSync(`${outputDir.umd}/css/index.css`, cssEntryContent); + fs.writeFileSync(`${outputDir.umd}/css/index.min.css`, minifyCssEntryContent.styles); + + fs.writeFileSync(`${outputDir.umd}/css/index.less`, lessEntry.join('\n')); + } + + resolve(undefined); + }); + }); +} diff --git a/tools/bundler/src/tasks/umd.ts b/tools/bundler/src/tasks/umd.ts new file mode 100644 index 0000000..eebf4dc --- /dev/null +++ b/tools/bundler/src/tasks/umd.ts @@ -0,0 +1,46 @@ +import { rollup } from 'rollup'; +import path from 'path'; +import type { OutputOptions, RollupBuild } from 'rollup'; +import type { RawPackageJson } from '../logic/package'; +import type { Config } from '../logic/config'; +import { getBabelPlugins } from '../logic/babel.config'; +import { getRollupOptions } from '../logic/rollup.config'; +import { DebugConfig } from '../logic/debug'; + +async function generateOutputs(bundle: RollupBuild, outputOptionsList: OutputOptions[]) { + for (const outputOptions of outputOptionsList) { + await bundle.write(outputOptions); + } +} +function packageNameToPath(name: string) { + return name.replace('@', '').replace('/', '_'); +} +export async function buildUmd(config: Config, projectRoot: string, rawPackageJson: RawPackageJson, minify: boolean) { + const babelPlugins = getBabelPlugins(rawPackageJson.name); + const entry = path.resolve( + projectRoot, + config.sourceDir, + typeof config.input === 'string' ? config.input : config.input.umd! + ); + const rollupOptions = getRollupOptions(projectRoot, entry, rawPackageJson, babelPlugins, { ...config, minify }); + + DebugConfig('RollupOptions', JSON.stringify(rollupOptions)); + const bundle = await rollup(rollupOptions); + + const dest = path.resolve(projectRoot, config.outputDir.umd!); + await generateOutputs(bundle, [ + { + format: 'umd', + name: config.name || packageNameToPath(rawPackageJson.name), + file: minify + ? `${dest}/${config.umdOutputFilename || packageNameToPath(rawPackageJson.name)}.min.js` + : `${dest}/${config.umdOutputFilename || packageNameToPath(rawPackageJson.name)}.js`, + exports: 'named', + globals: { react: 'React', ...config.globals } + } + ]); + + if (bundle) { + await bundle.close(); + } +} diff --git a/tools/bundler/tsconfig.json b/tools/bundler/tsconfig.json new file mode 100644 index 0000000..590f5eb --- /dev/null +++ b/tools/bundler/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "declaration": true, + "sourceMap": true + } + }, + "compilerOptions": { + "baseUrl": ".", + "outDir": "output", + "target": "ES2015", + "module": "CommonJS", + "declaration": true, + "sourceMap": false + }, + "include": [ + "src" + ] +} diff --git a/tools/bundler/vitest.config.ts b/tools/bundler/vitest.config.ts new file mode 100644 index 0000000..f24980c --- /dev/null +++ b/tools/bundler/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["src/**/*.{test,spec}.ts"], + }, +});