From a1fb96b9d188d04a44c88d4b080d2dffdd528947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Thu, 21 Jul 2022 12:30:11 +0800 Subject: [PATCH 01/34] init website --- .github/workflows/build.yaml | 21 + .gitignore | 15 + .vscode/extensions.json | 5 + README.md | 49 + website/.eslintrc.js | 66 + website/.gitignore | 23 + website/.prettierignore | 3 + website/.prettierrc | 9 + website/.stylelintrc.js | 13 + website/babel.config.js | 12 + website/blog/hello-blog.mdx | 19 + website/docs/batch-job-guide.md | 67 + website/docs/datasource.md | 1051 ++ website/docs/docker-setup.md | 62 + website/docs/encrypt-in-properties-file.md | 35 + website/docs/end-to-end-showcase-postgres.md | 425 + website/docs/end-to-end-showcase.md | 412 + website/docs/excel-template-dwd.md | 1376 +++ website/docs/excel-template-ods.md | 86 + website/docs/log-driven.md | 124 + website/docs/quick-start-guide.md | 310 + website/docs/ranger-integrate.md | 174 + website/docs/single-job-guide.md | 64 + website/docs/sql-scripts-guide.md | 100 + website/docs/sql-syntax.md | 33 + website/docs/transformer-guide.md | 282 + website/docusaurus.config.js | 121 + website/package.json | 57 + website/sidebars.js | 65 + website/src/css/custom.css | 37 + website/src/pages/index.js | 100 + website/src/pages/markdown-page.md | 7 + website/src/pages/styles.module.css | 36 + website/static/.nojekyll | 0 website/static/assets/images/github.png | Bin 0 -> 1104 bytes website/static/assets/images/logdriven-1.svg | 3 + website/static/assets/images/logdriven-2.svg | 3 + website/static/assets/images/logdriven-3.svg | 3 + website/static/assets/images/logdriven.png | Bin 0 -> 25362 bytes website/static/assets/images/roadmap.png | Bin 0 -> 146918 bytes website/static/assets/images/sql-scripts.png | Bin 0 -> 141676 bytes .../static/assets/images/workflowarrow.png | Bin 0 -> 3595 bytes website/static/img/docusaurus.png | Bin 0 -> 5142 bytes website/static/img/favicon.ico | Bin 0 -> 3626 bytes .../static/img/undraw_docusaurus_mountain.svg | 171 + .../static/img/undraw_docusaurus_react.svg | 170 + website/static/img/undraw_docusaurus_tree.svg | 40 + website/yarn.lock | 8674 +++++++++++++++++ 48 files changed, 14323 insertions(+) create mode 100644 .github/workflows/build.yaml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 website/.eslintrc.js create mode 100644 website/.gitignore create mode 100644 website/.prettierignore create mode 100644 website/.prettierrc create mode 100644 website/.stylelintrc.js create mode 100644 website/babel.config.js create mode 100644 website/blog/hello-blog.mdx create mode 100644 website/docs/batch-job-guide.md create mode 100644 website/docs/datasource.md create mode 100644 website/docs/docker-setup.md create mode 100644 website/docs/encrypt-in-properties-file.md create mode 100644 website/docs/end-to-end-showcase-postgres.md create mode 100644 website/docs/end-to-end-showcase.md create mode 100644 website/docs/excel-template-dwd.md create mode 100644 website/docs/excel-template-ods.md create mode 100644 website/docs/log-driven.md create mode 100644 website/docs/quick-start-guide.md create mode 100644 website/docs/ranger-integrate.md create mode 100644 website/docs/single-job-guide.md create mode 100644 website/docs/sql-scripts-guide.md create mode 100644 website/docs/sql-syntax.md create mode 100644 website/docs/transformer-guide.md create mode 100644 website/docusaurus.config.js create mode 100644 website/package.json create mode 100644 website/sidebars.js create mode 100644 website/src/css/custom.css create mode 100644 website/src/pages/index.js create mode 100644 website/src/pages/markdown-page.md create mode 100644 website/src/pages/styles.module.css create mode 100644 website/static/.nojekyll create mode 100644 website/static/assets/images/github.png create mode 100644 website/static/assets/images/logdriven-1.svg create mode 100644 website/static/assets/images/logdriven-2.svg create mode 100644 website/static/assets/images/logdriven-3.svg create mode 100644 website/static/assets/images/logdriven.png create mode 100644 website/static/assets/images/roadmap.png create mode 100644 website/static/assets/images/sql-scripts.png create mode 100644 website/static/assets/images/workflowarrow.png create mode 100644 website/static/img/docusaurus.png create mode 100644 website/static/img/favicon.ico create mode 100644 website/static/img/undraw_docusaurus_mountain.svg create mode 100644 website/static/img/undraw_docusaurus_react.svg create mode 100644 website/static/img/undraw_docusaurus_tree.svg create mode 100644 website/yarn.lock diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..c6d896c --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,21 @@ +name: Build and Deploy +on: [push] +permissions: + contents: write +jobs: + build-and-deploy: + concurrency: ci-${{ github.ref }} + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v3 + + - name: Install and Build 🔧 + run: | + cd website && yarn install && yarn run build + cp -R build/ ../public/ + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: public diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4392b28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Directories # +/build/ +target/ + +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +.idea/ +*.iml +.DS_Store +*.pdf +*.log +website/metastore_db +content diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..bd5eac5 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "takumii.markdowntable" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ffad61 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. + +### Continuous Integration + +Some common defaults for linting/formatting have been set for you. If you integrate your project with an open source Continuous Integration system (e.g. Travis CI, CircleCI), you may check for issues using the following command. + +``` +$ yarn ci +``` diff --git a/website/.eslintrc.js b/website/.eslintrc.js new file mode 100644 index 0000000..8ccf3b1 --- /dev/null +++ b/website/.eslintrc.js @@ -0,0 +1,66 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +const OFF = 0; +const WARNING = 1; +const ERROR = 2; + +module.exports = { + root: true, + env: { + browser: true, + commonjs: true, + jest: true, + node: true, + }, + parser: '@babel/eslint-parser', + parserOptions: { + allowImportExportEverywhere: true, + }, + extends: ['airbnb', 'prettier'], + plugins: ['react-hooks', 'header'], + rules: { + // Ignore certain webpack alias because it can't be resolved + 'import/no-unresolved': [ + ERROR, + {ignore: ['^@theme', '^@docusaurus', '^@generated']}, + ], + 'import/extensions': OFF, + 'header/header': [ + ERROR, + 'block', + + [ + '*', + ' * Copyright (c) Meta Platforms, Inc. and affiliates.', + ' *', + ' * This source code is licensed under the MIT license found in the', + ' * LICENSE file in the root directory of this source tree.', + ' *', + // Unfortunately eslint-plugin-header doesn't support optional lines. + // If you want to enforce your website JS files to have @flow or @format, + // modify these lines accordingly. + { + pattern: '.* @format', + }, + ' ', + ], + ], + 'react/jsx-filename-extension': OFF, + 'react-hooks/rules-of-hooks': ERROR, + 'react/prop-types': OFF, // PropTypes aren't used much these days. + 'react/function-component-definition': [ + WARNING, + { + namedComponents: 'function-declaration', + unnamedComponents: 'arrow-function', + }, + ], + }, +}; diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..a2f1b00 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,23 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# ESLint +.eslintcache diff --git a/website/.prettierignore b/website/.prettierignore new file mode 100644 index 0000000..9b74406 --- /dev/null +++ b/website/.prettierignore @@ -0,0 +1,3 @@ +node_modules +build +.docusaurus diff --git a/website/.prettierrc b/website/.prettierrc new file mode 100644 index 0000000..34cf084 --- /dev/null +++ b/website/.prettierrc @@ -0,0 +1,9 @@ +{ + "arrowParens": "always", + "bracketSameLine": true, + "bracketSpacing": false, + "printWidth": 80, + "proseWrap": "never", + "singleQuote": true, + "trailingComma": "all" +} diff --git a/website/.stylelintrc.js b/website/.stylelintrc.js new file mode 100644 index 0000000..11b6ffb --- /dev/null +++ b/website/.stylelintrc.js @@ -0,0 +1,13 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +module.exports = { + plugins: ['stylelint-copyright'], + rules: { + 'docusaurus/copyright-header': true, + }, +}; diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 0000000..84ad45a --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,12 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/blog/hello-blog.mdx b/website/blog/hello-blog.mdx new file mode 100644 index 0000000..7fcffd2 --- /dev/null +++ b/website/blog/hello-blog.mdx @@ -0,0 +1,19 @@ +--- +slug: hello sharp etl blog +title: hello sharp etl blog +tags: [sharp etl] +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +Use the power of React to create interactive blog posts. + +```js + +``` + + + +::: diff --git a/website/docs/batch-job-guide.md b/website/docs/batch-job-guide.md new file mode 100644 index 0000000..a494b26 --- /dev/null +++ b/website/docs/batch-job-guide.md @@ -0,0 +1,67 @@ +This guide provides a quick guide for commandline `batch-job` + +## Introduction + +The command `batch-job` runs all jobs in batch each time and should be noted as one of arguments when running a job. For example, when running a sample job,and the command is as follows: + +```bash +# run all job in batch by `spark-submit` +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time="2021-09-30 00:00:00" --local --once + +# run all job locally +./gradlew :spark:run --args="batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time='2021-09-30 00:00:00' --local --once" +``` + +## Parameters + +### common command params + +1. `--local` + +Declare that the job is running in standalone mode. If `--local` not provided, the job will try running with Hive support enabled. + +2. `--release-resource` + +The function is to automatically close spark session after job completion. + +3. `--skip-running` + +When there is a flash crash, use `--skip-running` to set last job status(in running state) as failed and start a new one. + +4. `--default-start` / `--default-start-time` + +Specify the default start time(eg, 20210101000000)/incremental id of this job. If the command is running for the first time, the default time would be the time set by the argument. If not, the argument would not work. + +5. `--once` + +It means that the job only run one time(for testing usage). + +6. `--env` + +Specify the default env path: local/test/dev/qa/prod running the job. + +7. `--property` + +Using specific property file, eg `--property=hdfs:///user/admin/etl-conf/etl.properties` + +8. `--override` + +Overriding config in properties file, eg `--override=etl.workflow.path=hdfs:///user/hive/sharp-etl,a=b,c=d` + +### batch-job params + +1. `--names` + +Specify the names of the job to run. + +2. `-f` / `--file` + +Specify excel file to run. + +3. `--period` + +Specify the period of job execution. + +4. `-h` / `--help` + +Take an example of parameters and its default value is false. diff --git a/website/docs/datasource.md b/website/docs/datasource.md new file mode 100644 index 0000000..0643385 --- /dev/null +++ b/website/docs/datasource.md @@ -0,0 +1,1051 @@ +--- +title: "Datasource" +sidebar_position: 1 +toc: true +last_modified_at: 2021-11-03T18:25:57-04:00 +--- + +## 支持的数据源 + +### Read +- hive + + 该 step 直接通过 SparkSession (需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | -------------- | + | dataSourceType | 无 | 否 | 可选值:hive。 | + + 示例: + + ```sql + -- step=1 + -- source=hive + -- target=console + select * + from table1; + ``` + +- temp + + 该 step 直接通过 SparkSession (不需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | -------------- | + | dataSourceType | 无 | 否 | 可选值:temp。 | + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=temp + -- tableName=temp_table + select 1 as a; + + -- stepId=2 + -- source=temp + -- target=console + select * + from temp_table; + ``` + +- jdbc 类 + + - mysql + - oracle + - postgres + - ms_sql_server + - impala + - informix + + + jdbc 类型的操作支持的配置项基本一致,区别只是数据源不同。 + + jdbc 类操作需在 application.properties 中配置基本连接信息,格式为 `${dbName}.${dataSourceType}.*`,示例: + + ```properties + test.postgres.driver=org.postgresql.Driver + test.postgres.fetchsize=10 + test.postgres.url=jdbc:postgresql://localhost:5432/default?currentSchema="default" + test.postgres.user=root + test.postgres.password=root + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:mysql、oracle、postgres、ms_sql_server、impala。 | + | dbName | 无 | 是 | 如果指定了 dbName,会使用 application.properties 配置文件中以指定的 dbName 开头的配置项去读数据,不指定默认无前缀。 | + | numPartitions | 无 | 是 | 需要将一个大的查询拆分为多少个可并行的小查询。 | + | partitionColumn | 无 | 是 | 拆分查询依据的字段。 | + | lowerBound | 无 | 是 | 拆分查询依据字段的最小值(spark2.3仅支持数字类型)。 | + | upperBound | 无 | 是 | 拆分查询依据字段的最大值(spark2.3仅支持数字类型)。 | + + 示例: + + ```sql + -- step=1 + -- source=postgres + -- dbName=test + -- target=variables + select cast(min(id) as int8) as lowerBound, + cast(max(id) as int8) as upperBound + from test_table; + + -- stepId=2 + -- source=postgres + -- dbName=test + -- numPartitions=10000 + -- lowerBound=${lowerBound} + -- upperBound=${upperBound} + -- partitionColumn=id + -- target=hive + -- tableName=ods_test_table + -- writeMode=overwrite + select * + from test_table; + ``` + +- kudu + + 该 step 通过 kudu spark 去读取 kudu 表中的数据,之后根据 selectSql 对 load 出来的数据做其他操作(基本的查询谓词可下推到 kudu)。 + + kudu 表的读取需在 application.properties 中配置 `kudu.master`,示例: + + ```properties + kudu.master=localhost:7051 + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | -------------- | + | dataSourceType | 无 | 否 | 可选值:kudu。 | + | dbName | 无 | 否 | kudu库名。 | + | tableName | 无 | 否 | kudu表名。 | + + 示例: + + ```sql + -- step=1 + -- source=kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + select * + from test_table; + ``` + +- impala_kudu + + impale_kudu 与 kudu 查询的逻辑基本一致,都是通过 kudu spark 去操作数据,但不同的是 impale_kudu 是操作由 impala 托管的 kudu 表。由于 impala 默认会在建表时给表名加一个前缀,因此我们在 impala 中操作 kudu 表时使用的表名可能是 'test_db.test_table',但通过 kudu 直接去操作时表名可能就是 `impala::test_db.test_table` 了。 + + 因此,需要在 application.properties 配置文件中额外配置 `kudu.table.prefix` 参数。 + + ```properties + kudu.master=localhost:7051 + kudu.table.prefix=impala:: + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | --------------------- | + | dataSourceType | 无 | 否 | 可选值:impala_kudu。 | + | dbName | 无 | 否 | kudu库名。 | + | tableName | 无 | 否 | kudu表名。 | + + 示例: + + ```sql + -- step=1 + -- source=impala_kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + select * + from test_table; + ``` + +- 文件传输类 + + 该 step 只是 copy 文件,不解析文件内容(不涉及 spark 操作)。暂时只支持 copy 文件到 hdfs。 + + 文件传输类操作配置内容基本一致,区别只是数据源不同。 + + 文件传输类操作需要在 application.properties 中配置服务器连接信息,格式为 `${configPrefix}.${dataSourceType}.*`,示例: + + ```properties + test.ftp.host=localhost + test.ftp.port=21 + test.ftp.user=root + test.ftp.password=root + test.ftp.dir=/test + test.ftp.localTempDir=/tmp/ftp/test + test.ftp.hdfsTempDir=/tmp/ftp/test + + test.scp.host=localhost + test.scp.port=22 + test.scp.user=root + test.scp.password=root + test.scp.dir=/test + test.scp.localTempDir=/tmp/scp/test + test.scp.hdfsTempDir=/tmp/scp/test + + test.sftp.host=localhost + test.sftp.port=22 + test.sftp.user=root + test.sftp.password=root + test.scp.proxy.host=localhost + test.scp.proxy.port=22 + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:scp、ftp、hdfs、sftp、mount。 | + | configPrefix | 无 | 否 | 需读取文件的系统连接配置前缀。 | + | fileDir | 无 | 事 | 如果在 application.properties 中已配置过 `${configPrefix}.${dataSourceType}.dir` 参数,则此处无需再次指定 `fileDir`,如果重复指定,会已 `fileDir` 指定的目录为准。 | + | fileNamePattern | .* | 否 | 文件匹配正则。分三段,格式为:"(前缀)(文件名主体)(后缀)"。
一般情况下前后缀都给个空括号即可。
个别情况下读取文件时需要根据同目录下的标志文件判断文件是否已写出完整。例如:正则为:`()(a\.txt)(\.OK)`,则目录下只存在 `a.txt` 文件时不会读取此文件,只有目录下同时存在 `a.txt.OK` 文件时才会去读取文件 `a.txt`。 | + | deleteSource | false | 否 | 是否在文件复制完成后删除原始文件,默认false,不删除。 | + | decompress | false | 否 | 是否需要解压后上传到 hdfs,默认 fasle,不解压。 | + | codecExtension | 无 | 是 | 需解压后上传到 hdfs 时,指定压缩格式后缀,例如:gz、zip。默认为空,不解压。 | + | onlyOneName | false | 否 | 文件名是否始终不变。
如果文件名始终不变,则每次执行此 step 都会重复读取同一文件,反之则在第一次成功读取后就不会再次读取该文件了。 | + + - scp + + 示例: + + ```sql + -- step=1 + -- source=scp + -- configPrefix=test + -- fileNamePattern=()(a\.test\..+)(OK) + -- deleteSource=false + -- target=hdfs + -- configPrefix=test + -- writeMode=overwrite + ``` + + - ftp + + 示例: + + ```sql + -- step=1 + -- source=ftp + -- configPrefix=test + -- fileNamePattern=()(a\.test\..+)(OK) + -- deleteSource=false + -- target=hdfs + -- configPrefix=test + -- writeMode=overwrite + ``` + + - hdfs + + 示例: + + ```sql + -- step=1 + -- source=hdfs + -- configPrefix=test + -- fileNamePattern=()(a\.test.+)() + -- target=ftp + -- configPrefix=test + -- filePath=/test + -- writeMode=overwrite + ``` + + - sftp + 对于sftp,会将匹配的文件先下载到本地,然后再将本地文件上传到hdfs + + 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------------- | ------ | -------- | ------------------------------------------------------------ | + | sourceDir | 无 | 否 | 表示sftp服务器里的绝对路径 | + | tempDestination | 无 | 否 | sftp文件存在的本地的临时路径 | + | tempDestinationDirPermission | rw-rw---- | 是 | 表示临时路径的文件权限 | + | hdfsDir | 无 | 否 | | 上到到hdfs的路径 | + | filterByTime | false | 是 | 可填true/false, 过滤sftp上的文件时,是否按文件修改时间过滤,如果是true,则会除了文件名正则匹配,也需要文件修改时间在[dataRangeStart, dataRangeEnd)之间 | + | timezone | GMT+8 | 是 | ETL Frames所在服务器的时区 | + + 示例: + + ```sql + -- step=1 + -- source=sftp + -- configPrefix=test + -- fileNamePattern=()(a\.test.+)() + -- sourceDir=/Distribution/NMBOData + -- tempDestinationDir=/data1/ticketflap/tmp + -- hdfsDir=hdfs:///data/ticketflap/ + -- filterByTime=false + -- target=ftp + -- configPrefix=test + -- filePath=/test + -- writeMode=overwrite + ``` + + - mount(sharefolder) + + 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------------- | ------ | -------- | ------------------------------------------------------------ | + | sourceDir | 无 | 否 | 表示sftp服务器里的绝对路径 | + | tempDestination | 无 | 否 | sftp文件存在的本地的临时路径 | + | tempDestinationDirPermission | rw-rw---- | 是 | 表示临时路径的文件权限 | + | hdfsDir | 无 | 否 | | 上到到hdfs的路径 | + | filterByTime | false | 是 | 可填true/false, 过滤sharefolder上的文件时,是否按文件修改时间过滤,如果是true,则会除了文件名正则匹配,也需要文件修改时间在[dataRangeStart, dataRangeEnd)之间 | + | timezone | GMT+8 | 是 | ETL Framework所在服务器的时区 | + + 示例 + ```sql + -- step=1 + -- source=mount + -- fileNamePattern=[\s\S]*.csv.\w* + -- sourceDir=/mnt/ltg/Archive + -- tempDestinationDir=/data1/shared_folder/tmp + -- hdfsDir=hdfs:///data/ltg + -- target=variables + -- checkPoint=false + -- dateRangeInterval=0 + ``` + +- hdfs 文件读取类 + + 该 step 会读取并解析文件内容,返回一个 DataFrame 以供后续使用。 + + hdfs 文件类 step 都有一部分相同的基本参数,如下: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:hdfs、json、csv、excel。 | + | configPrefix | 无 | 否 | 需读取文件的系统连接配置前缀。 | + | fileDir | 无 | 事 | 如果在 application.properties 中已配置过 `${configPrefix}.${dataSourceType}.dir` 参数,则此处无需再次指定 `fileDir`,如果重复指定,会已 `fileDir` 指定的目录为准。 | + | fileNamePattern | .* | 否 | 文件匹配正则。分三段,格式为:"(前缀)(文件名主体)(后缀)"。
一般情况下前后缀都给个空括号即可。
个别情况下读取文件时需要根据同目录下的标志文件判断文件是否已写出完整。例如:正则为:`()(a\.txt)(\.OK)`,则目录下只存在 `a.txt` 文件时不会读取此文件,只有目录下同时存在 `a.txt.OK` 文件时才会去读取文件 `a.txt`。 | + | deleteSource | false | 否 | 是否在文件复制完成后删除原始文件,默认false,不删除。 | + + - hdfs + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ----------------- | ------ | -------- | ------------------------------------------------------------ | + | codecExtension | 无 | 是 | 需解压后上传到 hdfs 时,指定压缩格式后缀,例如:gz、zip。默认为空,不解压。 | + | separator | 无 | 是 | 按分隔符解析文本时使用的分割符。separator 与 fieldLengthConfig 只配置一个即可。 | + | fieldLengthConfig | 无 | 是 | 按字段长度解析文本时各字段的长度配置(字节数)。separator 与 fieldLengthConfig 只配置一个即可。 | + | strictColumnNum | false | 否 | 文件列数是否需要严格一致,默认不需要。例如:源文件包含 30 个字段,目标表需要 20 个字段,非严格模式直接取文件前 20 列,严格模式会过滤掉列数不一致的数据行。 | + + 分隔符分割文本示例: + + ```sql + -- step=1 + -- source=hdfs + -- configPrefix=test + -- fileNamePattern=()(a\.test.+\.gz)() + -- encoding=utf-8 + -- codecExtension=.gz + -- separator=\|\+\| + -- target=hive + -- tableName=test_table + -- writeMode=overwrite + ``` + + 固定字段长度文本示例: + + ```sql + -- step=1 + -- source=hdfs + -- configPrefix=test + -- fileNamePattern=()(a\.test.+\.gz)() + -- encoding=gbk + -- codecExtension= + -- fieldLengthConfig=28,10,3,23,23,23 + -- deleteSource=false + -- target=hive + -- tableName=test_table + -- writeMode=overwrite + ``` + + - json + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | --------- | ---------- | -------- | ------------------------------------------------------------ | + | multiline | false | 否 | 一个 json 串是否可能由多行数据组成,默认false,启用此功能性能影响较大,如无必要不建议启用。 | + | mode | PERMISSIVE | 是 | 是否启用严格模式,严格模式会严格校验字段数。默认不启用。 | + + 示例: + + ```sql + -- step=1 + -- source=json + -- configPrefix=test + -- fileNamePattern=()(test_\d{14}\.json)() + -- multiline=false + -- target=temp + -- tableName=temp + ``` + + - csv + + 暂时只是简单实现,全部使用代码中指定的默认参数,无可自定义参数。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ----------- | ------ | -------- | ------------------------------------------------------------ | + | inferSchema | true | 否 | 是否启用 schema 推测,默认 true。 | + | encoding | utf-8 | 否 | 文件编码。默认 utf-8。 | + | sep | , | 否 | 分隔符,默认英文逗号。 | + | header | true | 否 | 文件内是否包含表头,默认包含。 | + | selectExpr | * | 否 | 每个 csv 需要返回的字段列表,多个字段逗号分隔。使用场景如下:
一次性加载多个 csv 文件,此时可以通过指定返回字段避免因为列数、列序不一致而导致的程序报错(ps:列数、列序可以不一致,但是必需的字段必需全部包含)。 | + + 示例: + + ```sql + -- step=1 + -- source=csv + -- configPrefix=test + -- fileNamePattern=()(test\.csv)() + -- selectExpr=field1,field2 + -- target=temp + -- tableName=temp + ``` + + - excel + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ----------------------- | ------------------- | -------- | ------------------------------------------------------------ | + | header | true | 否 | 是否包含表头,默认 true,包含表头。 | + | treatEmptyValuesAsNulls | false | 否 | 是否将空值转换为 null,默认 false,不转换。 | + | inferSchema | false | 否 | 是否启用结构推断,默认 false,不启用。 | + | addColorColumns | false | 否 | 是否额外添加列颜色字段,默认 false,不添加。 | + | dataAddress | 无 | 是 | 数据地址,默认 A1 ,可部分设置,只设置 sheet 页或只设置开始单元格位置都可以。
例:'Sheet2'!A1:D3
'${sheet页名称}'!${开始单元格位置}:${终止单元格位置}
${sheet页下标}!${开始单元格位置}:${终止单元格位置} | + | timestampFormat | MM-dd-yyyy HH:mm:ss | 是 | 默认 yyyy-mm-dd hh:mm:ss[.fffffffff] | + | maxRowsInMemory | 无 | 是 | 读取超大文档可设置此值,会使用 streaming reader。 | + | excerptSize | 无 | 是 | 结构推断时使用的数据行数,默认 10。 | + | workbookPassword | 无 | 是 | 文档密码,默认 null,无密码。 | + + 示例: + + ```sql + -- step=1 + -- source=excel + -- configPrefix=test + -- fileNamePattern=()(^BA\.xlsx$)() + -- dataAddress=0!A1 + -- onlyOneName=true + -- target=console + ``` + +- udf 注册类 + + 该 step 在 read 时会将指定类路径下的类加载到内存中。普通的 object 和 class 没什么差别,可以混着用。如果是带参的 class ,需要修改代码支持(pmml即是这种类型)。 + + 在 write 时将此方法注册为指定名称的 udf 函数,生效范围为当前 SparkSession 的生命周期。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ----------------------- | + | dataSourceType | 无 | 否 | 可选值:object、class。 | + | className | 无 | 否 | 需要加载的类路径。 | + + 示例: + + ```sql + -- step=1 + -- source=object + -- className=com.box.datapipeline.udf.DesDecryptUDF + -- target=udf + -- methodName=desDecryptHex + -- udfName=des_decrypt + + -- stepId=2 + -- source=hive + -- target=hive + -- tableName=test_table + -- writeMode=overwrite + select des_decrypt(trim(a), '11111111', 'GBK') as actnum + from test_table; + ``` + + - object + + - class + + - pmml + + 此处的 pmml 是一种带参的 class 反射,需要在配置中指定 pmml 文件路径。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:pmml。 | + | className | 无 | 否 | 需要加载的类路径,`com.github.sharpdata.sharpetl.spark.udf.PmmlUDF`。 | + | pmmlFileName | 无 | 否 | 预测需要使用的模型文件名称。 | + + 示例: + + ```sql + -- step=1 + -- source=pmml + -- className=com.github.sharpdata.sharpetl.spark.udf.PmmlUDF + -- pmmlFileName=test_pmml.pmml + -- target=udf + -- methodName=predict + -- udfName=predict + + -- stepId=2 + -- source=hive + -- target=hive + -- tableName=test_table + select id, + predict( + struct( + * + ) + ) as result + from temp; + ``` + +- bigquery + + 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ----------------------- | + | dataSourceType | 无 | 否 | 值必须为bigquery | + | system | 无 | 否 | 通过bigquery.${system}.*来获取数据源的配置信息 | + + bigquery在application.properties里的配置信息 + ```properties + bigquery.test.proxyAddress=localhost:8080 + bigquery.test.parentProject=project1 + bigquery.test.project=project2 + bigquery.test.dataset=main_qa + bigquery.test.materializationDataset=main_qa + bigquery.test.credentialsFile=abc3.json + bigquery.test.viewsEnabled=true + ``` + + 示例 + ```sql + -- stepId=2 + -- source=bigquery + -- system=test + -- target=temp + -- tableName=`login_raw` + -- skipFollowStepWhenEmpty=true + select * from project2.table1 + ``` + +### Write + +输出类型分为以下几类: + +1. 返回 DataFrame,基于 DataFrame 做进一步操作。 +2. 注册指定内容到 SparkSession 。 + +详细输出类型如下: + +- temp + + 该 step 的计算结果将注册为当前 SparkSession 生命周期内可用的内存临时表,可在后续 Read 类型为 `hive` 或 `temp` 的 step 中直接在 sql 中调用。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------ | + | dataSourceType | 无 | 否 | 可选值:temp。 | + | tableName | 无 | 否 | 计算结果注册为临时表时的表名。 | + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=temp + -- tableName=temp_table + select 1 as a; + + -- stepId=2 + -- source=temp + -- target=temp + select * + from temp_table; + ``` + +- hive + + 该 step 的计算结果将写入到目标 hive 表,默认采用动态分区的方式。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:hive。 | + | tableName | 无 | 否 | 计算结果写出到 hive 时的 hive 表名。 | + | writeMode | 无 | 否 | 可选值:overwrite、append。 | + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=hive + -- tableName=temp_table + select 1 as a, + 2 as b; + ``` + +- 命令行输出 + + 该 step 的计算结果将输出到 console ,最多显示前 10000 行。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ----------------- | + | dataSourceType | 无 | 否 | 可选值:console。 | + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=console + select 1 as a; + ``` + +- variables + + 该 step 的执行结果为只有一行(可以为多列)数据的 DataFrame,每个字段都将被设置为全局变量,可以在后续 step 的 sql 中直接引用。 + + 参数: + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=variables + select '1' as a, + '2' as b; + + -- stepId=2 + -- source=temp + -- target=hive + -- tableName=temp_table + select '${a}' as a, + '${b}' as b, + c + from test_table; + ``` + +- udf + + 该 step 将会把 Read 时加载到内存中的类的指定方法注册为 udf。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------ | + | dataSourceType | 无 | 否 | 可选值:udf。 | + | methodName | 无 | 否 | 需注册为 udf 的方法名 | + | udfName | 无 | 否 | 注册成 udf 后的 udf 名称 | + + 示例: + + ```sql + -- step=1 + -- source=pmml + -- className=com.box.datapipeline.udf.PmmlUDF + -- pmmlFileName=test_rand_model.pmml + -- target=udf + -- methodName=predict + -- udfName=predict + + -- stepId=2 + -- source=hive + -- target=temp + -- tableName=temp1 + select cast(1.0 as float) as x1, + cast(1.0 as float) as x2, + cast(1.0 as float) as x3; + + -- stepId=3 + -- source=temp + -- target=temp + -- tableName=temp2 + select predict( + struct( + x1, + x2, + x3 + ) + ) as target, + x1, + x2, + x3 + from temp1; + ``` + +- do_nothing + + 该 step 只执行 Read 部分的操作,Write 部分不做任何处理。 + + 示例: + + ```sql + -- step=1 + -- source=hive + -- target=do_nothing + truncate table test_table; + ``` + +- jdbc 类 + + jdbc 类的 Write 基于统一的接口,用法一致。支持以下输出模式: + + - append + + 追加写数据到目标表,如果存在主键冲突则报错。 + + - upsert + + 根据主键对目标表做 upsert 操作。 + + - delete + + 根据主键对目标表对 delete 操作。 + + - execute + + 直接执行该 step 中的 sql。适合做一些 DDL 之类的操作,例如:truncat table、create table、create index 等。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:mysql、oracle、postgres、ms_sql_server。 | + | dbName | 无 | 否 | 如果指定了 dbName,会使用 application.properties 配置文件中以指定的 dbName 开头的配置项去读数据,不指定默认无前缀。 | + | tableName | 无 | 否 | 目标表名称。 | + | writeMode | 无 | 否 | 可选值:append、upsert、delete、execute。 | + + 示例: + + ```sql + -- step=1 + -- source=temp + -- target=postgres + -- dbName=test + -- tableName=test_table + -- writeMode=upsert + select * + from temp; + ``` + + - mysql + - oracle + - postgres + - ms_sql_server + +- es + + es 操作需在 application.properties 中配置基本连接信息,格式为 `es.*`,示例: + + ```properties + es.nodes=localhost:9200,localhost:9201,localhost:9202 + es.net.http.auth.user=elastic + es.net.http.auth.pass=123456 + es.batch.write.refresh=false + es.index.auto.create=true + es.batch.size.entries=5000 + es.batch.size.bytes=15mb + es.write.operation=index + es.spark.dataframe.write.null=true + es.nodes.wan.only=true + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------------------------------------ | + | dataSourceType | 无 | 否 | 可选值:es。 | + | tableName | 无 | 否 | 需写入的 es index 名称。 | + | primaryKeys | 无 | 是 | es 中的主键(不设置的话会自动生成),update 模式必须设置,否则无法更新。 | + + 示例: + + ```sql + -- step=1 + -- source=hive + -- target=es + -- tableName=test_index + -- primaryKeys=id + select id, + name + from test_table; + ``` + +- kudu + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------------- | + | dataSourceType | 无 | 否 | 可选值:kudu。 | + | tableName | 无 | 否 | 需写入的 kudu 表(库名.表名)。 | + + ```sql + -- step=1 + -- source=hive + -- target=impala_kudu + -- tableName=test.test_table + -- writeMode=upsert + select * + from test_table; + ``` + +- impala_kudu + + impale_kudu 与 kudu 查询的逻辑基本一致,都是通过 kudu spark 去操作数据,但不同的是 impale_kudu 是操作由 impala 托管的 kudu 表。由于 impala 默认会在建表时给表名加一个前缀,因此我们在 impala 中操作 kudu 表时使用的表名可能是 'test_db.test_table',但通过 kudu 直接去操作时表名可能就是 `impala::test_db.test_table` 了。 + + 因此,需要在 application.properties 配置文件中额外配置 `kudu.table.prefix` 参数。 + + ```properties + kudu.master=localhost:7051 + kudu.table.prefix=impala:: + ``` + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ---------------------- | + | dataSourceType | 无 | 否 | 可选值:impala_kudu。 | + | dbName | 无 | 否 | 需写入的 kudu 表库名。 | + | tableName | 无 | 否 | 需写入的 kudu 表表名。 | + + 示例: + + ```sql + -- step=1 + -- source=hive + -- target=impala_kudu + -- dbName=test + -- tableName=test_table + -- writeMode=upsert + select * + from test_table; + ``` + +- 文件传输类 + + 此类操作的数据源格式为文件(ftp、scp、hdfs),输出类型也是文件,整个过程不需要解析文件内容,只需完成文件传输。 + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ------------------------ | + | dataSourceType | 无 | 否 | 可选值:scp、ftp、hdfs。 | + | filePath | 无 | 否 | 文件输出路径。 | + + - scp + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ------------ | ------ | -------- | ------------------------------ | + | configPrefix | 无 | 否 | 需读取文件的系统连接配置前缀。 | + + 示例: + + ```sql + -- step=1 + -- source=hdfs + -- configPrefix=test + -- fileNamePattern=()(a\.test.+)() + -- target=scp + -- configPrefix=test + -- filePath=/test + -- writeMode=overwrite + ``` + + - ftp + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ------------ | ------ | -------- | ------------------------------ | + | configPrefix | 无 | 否 | 需读取文件的系统连接配置前缀。 | + + 示例: + + ```sql + -- step=1 + -- source=hdfs + -- configPrefix=test + -- fileNamePattern=()(a\.test.+)() + -- target=ftp + -- configPrefix=test + -- filePath=/test + -- writeMode=overwrite + ``` + + - hdfs + + 示例: + + ```sql + -- step=1 + -- source=ftp + -- configPrefix=test + -- fileNamePattern=()(a\.test\..+)(OK) + -- deleteSource=false + -- target=hdfs + -- configPrefix=test + -- writeMode=overwrite + ``` + +- hdfs 文件写出类 + + 此类 step 数据源格式为结构化数据(各种类型的表),整个输出过程需要将源数据按照指定规则处理好并最终输出。 + + hdfs 文件类 step 都有一部分相同的基本参数,如下: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | -------------------------------------------------- | + | dataSourceType | 无 | 否 | 可选值:hdfs、csv。 | + | filePath | 无 | 否 | 文件输出路径。 | + | writeMode | 无 | 否 | 可选值:overWrite、append。一般都使用 overWrite 。 | + + - hdfs + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | ----------------- | -------- | -------- | ------------------------------------------------------------ | + | Encoding | utf-8 | 否 | 输出文件的编码格式,默认:utf-8。 | + | codecExtension | 空字符串 | 是 | 需压缩后上传到 hdfs 时,指定压缩格式后缀,例如:gz、zip。默认为空,不压缩。 | + | separator | 无 | 是 | 按指定分隔符拼接文本时使用的分割符。separator 与 fieldLengthConfig 只配置一个即可。 | + | fieldLengthConfig | 无 | 是 | 按固定字段长度拼接文本时各字段的长度配置(字节数)。separator 与 fieldLengthConfig 只配置一个即可。 | + + 示例: + + ```sql + -- stepId=3 + -- source=hive + -- target=hdfs + -- configPrefix=test + -- filePath=/test.txt + -- encoding=gbk + -- fieldLengthConfig=18,4 + -- writeMode=overwrite + select a, + b + from test_table; + ``` + + - csv + + 示例: + + ```sql + -- stepId=3 + -- source=hive + -- target=csv + -- filePath=/test.csv + -- writeMode=overwrite + select a, + b + from test_table; + ``` + +- yellowbrick + + yellowbrick此数据库目前只支持用作目标数据库,会将此step里read的DataFrame存入yellowbrick里 + yellowbrick操作需在 application.properties 中配置基本连接信息,格式为 `${dbName}.yellowbrick.*`,示例: + + ```properties + test.yellowbrick.host=localhost + test.yellowbrick.port=5432 + test.yellowbrick.user=root + test.yellowbrick.password=root + test.yellowbrick.relayHost=localhost + test.yellowbrick.relayPort=21212 + test.yellowbrick.partition=4 + ``` + + 参数: + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ----------------------- | + | dataSourceType | 无 | 否 | 值必须为yellowbrick | + | dbName | 无 | 否 | 数据库名字,用以从配置文件里读取连接信息 | + | primaryKeys | 无 | 是 | 只有当writeMode是upsert时,才需要使用, 并且此值不能为空, 当有多个primaryKeys使用","拼接 | + + 示例 + ```sql + -- step=1 + -- source=impala_kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + -- dbName=test + -- writeMode=append + select * + from test_table; + ``` + + 目前yellowbrick支持的writeMode有三种: append, overwrite和upsert + + - append + + 示例 + ```sql + -- step=1 + -- source=impala_kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + -- dbName=test + -- writeMode=append + select * + from test_table; + ``` + + - overwrite + + 示例 + ```sql + -- step=1 + -- source=impala_kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + -- dbName=test + -- writeMode=overwrite + select * + from test_table; + ``` + + - upsert + + 示例 + ```sql + -- step=1 + -- source=impala_kudu + -- dbName=test_db + -- tableName=test_table + -- target=console + -- dbName=test + -- primaryKeys=loginhistory_id + -- writeMode=upsert + select * + from test_table; + ``` \ No newline at end of file diff --git a/website/docs/docker-setup.md b/website/docs/docker-setup.md new file mode 100644 index 0000000..bca9fe0 --- /dev/null +++ b/website/docs/docker-setup.md @@ -0,0 +1,62 @@ +--- +title: "Docker setup" +sidebar_position: 5 +toc: true +last_modified_at: 2021-11-03T18:25:57-04:00 +--- + +This guide provides quick docker setup for local testing + +## Requirments + +- Docker +- Docker compose + +## Setup step by step + +```bash +cd docker +docker compose up -d # to start ETL database(mysql 5.7) & hive instance(version 2.3.7) +``` + +To access local hive instance you need + +in `spark/build.gradle` + +```diff +-compile(project(":datasource:hive3")) ++compile(project(":datasource:hive2")) +``` + +add `hive-site.xml` in `spark/src/main/resources/hive-site.xml` + +```xml + + + hive.metastore.uris + thrift://localhost:9083 + + + + hive.metastore.warehouse.dir + file:///Users/$(whoami)/Documents/warehouse + + + + hive.metastore.warehouse.external.dir + file:///Users/$(whoami)/Documents/warehouse + + +``` + +add `core-site.xml` in `spark/src/main/resources/core-site.xml` + +```xml + + + fs.defaultFS + file:///Users/$(whoami)/Documents/warehouse + true + + +``` diff --git a/website/docs/encrypt-in-properties-file.md b/website/docs/encrypt-in-properties-file.md new file mode 100644 index 0000000..bcf29b5 --- /dev/null +++ b/website/docs/encrypt-in-properties-file.md @@ -0,0 +1,35 @@ +--- +title: "Encrypt your confidential information in properties file" +sidebar_position: 8 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## generate your private key `etl.key` + +1. open the test `ETLConfigSpec`. +2. replace the path where you want to save the key. +3. replace the content which is the encryter password key. +4. if you want to use the offset, you can replace to 10 to the number that you want. +5. run the test. + +## Set up it in your env + +1. upload the key file to hdfs path. eg, `hdfs:///etl/conf/etl.key` +2. update the properties file in hdfs. eg, `encrpy.keyPath=hdfs:///etl/conf/etl.key` +3. if you have set a new offset instead of 10, you need to update the properties file in hdfs. eg, `encrypt.offset=11xx` + +## using encrypt command + +1. prepare `application.properties`: + +```properties +encrypt.algorithm=PBEWithMD5AndDES +encrypt.keyPath=/path/to/etl.key +``` + +2. run encrypt command + +```bash +./gradlew :spark:run --args="encrypt -p file:///path/to/application.properties 'content_to_be_encrypted'" +``` diff --git a/website/docs/end-to-end-showcase-postgres.md b/website/docs/end-to-end-showcase-postgres.md new file mode 100644 index 0000000..a630283 --- /dev/null +++ b/website/docs/end-to-end-showcase-postgres.md @@ -0,0 +1,425 @@ +--- +title: "End to end showcase(Postgres)" +sidebar_position: 2 +toc: true +last_modified_at: 2022-04-09T10:59:57+8:00 +--- + + +## 环境准备 + +* [Docker setup](docker-setup) + +```bash +docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres:12.0-alpine +``` + +## 运行任务 + +### 准备源表 + +postgres: + +```sql +create schema if not exists sales; + +drop table if exists sales.order; +create table if not exists sales.order +( + order_sn varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp +); + +drop table if exists sales.user; +create table if not exists sales.user +( + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + create_time timestamp, + update_time timestamp +); + +drop table if exists sales.product; +create table if not exists sales.product +( + mid varchar(128), + name varchar(128), + version varchar(128), + status varchar(128), + create_time timestamp, + update_time timestamp +); +``` + + +Postgres ods: + +```sql +create schema if not exists ods; + +drop table if exists ods.t_order; +create table if not exists ods.t_order +( + order_sn varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + job_id varchar(128) +) ; + +drop table if exists ods.t_user; +create table if not exists ods.t_user +( + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + create_time timestamp, + update_time timestamp, + job_id varchar(128) +); + +drop table if exists ods.t_product; +create table if not exists ods.t_product +( + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + create_time timestamp, + update_time timestamp, + job_id varchar(128) +); +``` + +Postgres dwd: + +```sql +SET search_path TO dwd, public; +create extension if not exists "uuid-ossp"; +create schema if not exists dwd; +drop table if exists dwd.t_fact_order; +create table dwd.t_fact_order +( + order_sn varchar(128), + product_id varchar(128), + user_id varchar(128), + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10, 4), + job_id varchar(128) +); + +drop table if exists dwd.t_dim_product; +create table if not exists dwd.t_dim_product +( + product_id varchar(128) default uuid_generate_v1(), + mid varchar(128), + name varchar(128), + version varchar(128), + status varchar(128), + create_time timestamp, + update_time timestamp, + job_id varchar(128), + start_time timestamp, + end_time timestamp, + is_latest varchar(1), + is_active varchar(1), + is_auto_created varchar(1) +); + +drop table if exists dwd.t_dim_user; +create table if not exists dwd.t_dim_user +( + dim_user_id varchar(128) default uuid_generate_v1(), + user_info_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + create_time timestamp, + update_time timestamp, + job_id varchar(128), + start_time timestamp, + end_time timestamp, + is_latest varchar(1), + is_active varchar(1), + is_auto_created varchar(1) +); +``` + +Postgres report: + +```sql +-- ==report层 华为mate40-v2真实的销量表 +create schema if not exists report; +drop table if exists report.t_fact_order_report_actual; +create table report.t_fact_order_report_actual( + order_sn varchar(128), + product_id varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + price decimal(10,4), + discount decimal(10,4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10,4) +); + +-- ==report层 华为mate40-v2算上v1的销量 +create schema if not exists report; +drop table if exists report.t_fact_order_report_latest; +create table report.t_fact_order_report_latest( + order_sn varchar(128), + product_id varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + price decimal(10,4), + discount decimal(10,4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10,4) +); +``` + + + +### 运行从源到ods的任务 + +0. 准备数据 + +为dwd插入预先提供的数据 + +```sql +truncate table dwd.t_fact_order; +insert into dwd.t_fact_order (order_sn, product_id, + user_id, product_count, price, + discount, order_status, + order_create_time, + order_update_time, actual, + job_id) +values ('AAA', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 20, 0.3, 1, + '2022-04-04 10:00:00', '2022-04-04 10:00:00', 19.7, 1), + ('BBB', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 10, 0.3, 2, + '2022-04-04 11:00:00', '2022-04-08 11:00:00', 9.7, 1), + ('CCC', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 30, 0.3, 1, + '2022-04-04 12:00:00', '2022-04-04 12:00:00', 29.7, 1); + +truncate table dwd.t_dim_user; +insert into dwd.t_dim_user (dim_user_id, user_info_code, user_name, + user_age, user_address, create_time, + update_time, + start_time, end_time, is_active, + is_latest, is_auto_created) +values ('06347be1-f752-4228-8480-4528a2166e14', 'u1', '张三', 12, '胜利街道', '2020-01-01 10:00:00', '2020-01-01 10:00:00', + '2020-01-01 10:00:00', null, '1', '1', '0'); + + +truncate table dwd.t_dim_product; +insert into dwd.t_dim_product (product_id, mid, name, version, + status, create_time, update_time, + start_time, end_time, + is_active, + is_latest, is_auto_created) +values ('3abd0495-9abe-44a0-b95b-0e42aeadc807', 'p1', '华为', 'mate40', '上架', '2022-01-01 10:00:00', + '2022-01-01 10:00:00', '2022-01-01 10:00:00', '2022-04-04 13:00:00', '0', '0', '0') + , ('a9cd4e31-9268-4ee9-94b4-18c5e839a937', 'p1', '华为', 'mate40-v2', '上架', '2022-01-01 10:00:00', + '2022-04-04 13:00:00', '2022-04-04 13:00:00', null, '1', '1', '0'); + +``` + +准备源表数据 + +```sql +truncate table sales.order; +insert into sales.order (order_sn, product_code, product_name, product_version, product_status, + user_code, user_name, user_age, user_address, product_count, price, discount, order_status, + order_create_time, order_update_time) +values ('AAA', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利街道', 12, 20, 0.3, 2, '2022-04-04 10:00:00', + '2022-04-08 10:00:00') -- 正常更新 + , ('AAA', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利街道', 12, 20, 0.3, 2, '2022-04-04 10:00:00', + '2022-04-08 10:00:00') -- 重复数据 + , ('BBB', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利街道', 12, 10, 0.3, 1, '2022-04-04 10:00:00', + '2022-04-08 10:00:00') -- 时间顺序错乱,不做修改 + , ('DDD', 'p1', '华为', 'mate40-v2', '上架', 'u2', '李四', 32, '迎宾街道', 15, 200, 0.4, 1, '2022-04-08 09:00:00', + '2022-04-08 10:00:00') -- 新增,华为p1名称修改 + , ('DDD', 'p2', '华为', 'mate50', '上架', 'u3', '李四', 32, '迎宾街道', 15, 330, 0.4, 1, '2022-04-08 09:00:00', + '2022-04-08 10:00:00'); -- 新增, p2迟到维不作处理的场景 +``` + + +1. 下载已经编辑好的 [soudce->ods模板](https://docs.google.com/spreadsheets/d/1vvWq26t7i_9bFXaRMQpQsFKXnBBHkIEzVEI3EI_eLIg/edit#gid=0) 到 `~/Desktop` 来准备生成对应的任务脚本 + +2. 通过这个命令生成任务脚本 + +```bash +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/postgres-ods.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks/" +``` + +3. 你看到如下日志表示任务脚本已经生成好了 + +```log +2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.order__ods.t_order.sql +2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.user__ods.t_user.sql +2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.product__ods.t_product.sql +``` + +4. 创建ods表 + + +5. 准备连接信息 + +```properties +sales.postgres.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified +sales.postgres.user=postgres +sales.postgres.password=postgres +sales.postgres.driver=org.postgresql.Driver +sales.postgres.fetchsize=10 +``` + +6. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="single-job --name=sales.order__ods.t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --local --once" +``` + + + +### 运行从ods到dwd的任务 + +1. 下载提前准备好的[ods->dwd 模板](https://docs.google.com/spreadsheets/d/19pOIogg31JWRUiKYyFLnQXCnPihYFOitamlfzrIXWfE/edit#gid=0)到桌面 + +2. 通过这个命令生成任务脚本 + +```bash +./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/postgres-dwd.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks/" +``` + +3. 你看到如下日志表示任务脚本已经生成好了 + +```log +2022/04/10 14:27:42 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks//ods.t_order_dwd.t_fact_order.sql +``` + +4. 创建dwd/dim表 + +6. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="single-job --name=ods.t_order_dwd.t_fact_order --period=1440 --upstream_job_name=sales.order__ods.t_order --local" +``` + + + +### 运行从dwd到report的任务 + +1. 手动创建两个step,分别代表两个report的需求: + 1. report层 华为mate40-v2真实的销量表,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_actual.sql` + + ```sql + -- step=1 + -- sourceConfig + -- dataSourceType=postgres + -- dbName=postgres + -- tableName=dwd.t_fact_order + -- targetConfig + -- dataSourceType=postgres + -- dbName=postgres + -- tableName=report.t_fact_order_report_actual + -- writeMode=overwrite + -- incrementalType=depend_on_upstream + select + fact.order_sn order_sn, + dim.product_id product_id, + dim.mid product_code, + dim.name product_name, + dim.version product_version, + dim.status product_status, + fact.price price, + fact.discount discount, + fact.order_status order_status, + fact.order_create_time order_create_time, + fact.order_update_time order_update_time, + fact.actual actual + from dwd.t_fact_order fact + inner join dwd.t_dim_product dim + on fact.product_id = dim.product_id; + ``` + + 2. report层 华为mate40-v2算上v1的销量,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_latest.sql` + + ```sql + -- step=1 + -- sourceConfig + -- dataSourceType=postgres + -- dbName=postgres + -- tableName=dwd.t_fact_order + -- targetConfig + -- dataSourceType=postgres + -- dbName=postgres + -- tableName=report.t_fact_order_report_latest + -- writeMode=overwrite + -- incrementalType=depend_on_upstream + select + fact.order_sn order_sn, + dim2.product_id product_id, + dim2.mid product_code, + dim2.name product_name, + dim2.version product_version, + dim2.status product_status, + fact.price price, + fact.discount discount, + fact.order_status order_status, + fact.order_create_time order_create_time, + fact.order_update_time order_update_time, + fact.actual actual + from dwd.t_fact_order fact + inner join dwd.t_dim_product dim on fact.product_id = dim.product_id + inner join (select * from dwd.t_dim_product dim_latest where is_latest='1') dim2 on dim.mid = dim2.mid; + ``` + +2. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="single-job --name=order_report_actual --period=1440 --upstream_job_name=ods.t_order_dwd.t_fact_order --local" +``` +```bash +./gradlew :spark:run --args="single-job --name=order_report_latest --period=1440 --upstream_job_name=ods.t_order_dwd.t_fact_order --local" +``` + + diff --git a/website/docs/end-to-end-showcase.md b/website/docs/end-to-end-showcase.md new file mode 100644 index 0000000..ff157ca --- /dev/null +++ b/website/docs/end-to-end-showcase.md @@ -0,0 +1,412 @@ +--- +title: "End to end showcase(Hive)" +sidebar_position: 2 +toc: true +last_modified_at: 2022-04-09T10:59:57+8:00 +--- + + +## 环境准备 + +* [Docker setup](docker-setup) + +```bash +docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres:12.0-alpine +``` + +## 运行任务 + +### 准备源表 + +postgres: + +```sql +create schema if not exists sales; + +create table if not exists sales.order +( + order_sn varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp +); + +create table if not exists sales.user +( + user_code varchar(128), + user_name varchar(128), + user_age int, + user_address varchar(128), + create_time timestamp, + update_time timestamp +); + +create table if not exists sales.product +( + mid varchar(128), + name varchar(128), + version varchar(128), + status varchar(128), + create_time timestamp, + update_time timestamp +); +``` + + +hive ods: + +```sql +create database if not exists ods; + +create table if not exists ods.t_order +( + order_sn string, + product_code string, + product_name string, + product_version string, + product_status string, + user_code string, + user_name string, + user_age int, + user_address string, + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status string, + order_create_time timestamp, + order_update_time timestamp, + job_id string +) partitioned by (`year` string, `month` string, `day` string); + +create table if not exists ods.t_user +( + user_code string, + user_name string, + user_age int, + user_address string, + create_time timestamp, + update_time timestamp, + job_id string +) partitioned by (`year` string, `month` string, `day` string); + +create table if not exists ods.t_product +( + product_code string, + product_name string, + product_version string, + product_status string, + create_time timestamp, + update_time timestamp, + job_id string +) partitioned by (`year` string, `month` string, `day` string); +``` + +hive dwd: + +```sql +create database if not exists dwd; +create database if not exists dim; +create table dwd.t_fact_order +( + order_id string, + order_sn string, + product_id string, + user_id string, + product_count int, + price decimal(10, 4), + discount decimal(10, 4), + order_status string, + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10, 4), + job_id string, + start_time timestamp, + end_time timestamp, + is_latest string, + is_active string +) partitioned by (`year` string, `month` string, `day` string); + +create table if not exists dim.t_dim_product +( + product_id string, + mid string, + name string, + version string, + status string, + create_time timestamp, + update_time timestamp, + job_id string, + start_time timestamp, + end_time timestamp, + is_latest string, + is_active string, + is_auto_created string +) partitioned by (`year` string, `month` string, `day` string); + + +create table if not exists dim.t_dim_user +( + dim_user_id string, + user_info_code string, + user_name string, + user_age int, + user_address string, + create_time timestamp, + update_time timestamp, + job_id string, + start_time timestamp, + end_time timestamp, + is_latest string, + is_active string, + is_auto_created string +) partitioned by (`year` string, `month` string, `day` string); +``` + +hive report: + +```sql +-- ==report层 华为mate40-v2真实的销量表 +create database if not exists report; +create table if not exists report.t_fact_order_report_actual( + order_sn varchar(128), + product_id varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + price decimal(10,4), + discount decimal(10,4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10,4) +); + +-- ==report层 华为mate40-v2算上v1的销量 +create table if not exists report.t_fact_order_report_latest( + order_sn varchar(128), + product_id varchar(128), + product_code varchar(128), + product_name varchar(128), + product_version varchar(128), + product_status varchar(128), + price decimal(10,4), + discount decimal(10,4), + order_status varchar(128), + order_create_time timestamp, + order_update_time timestamp, + actual decimal(10,4) +); +``` + + +### 运行从源到ods的任务 + +1. 准备数据 + +为dwd插入预先提供的数据 + +```sql +set hive.exec.dynamic.partition=true; +truncate table dwd.t_fact_order; +insert into dwd.t_fact_order partition (`year` = '2022', `month` = '04', `day` = '04') (order_id, order_sn, product_id, + user_id, product_count, price, + discount, order_status, + order_create_time, + order_update_time, actual, + start_time, end_time, is_active, + is_latest, + job_id) +values ('aaa', 'AAA', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 20, 0.3, 1, + '2022-04-04 10:00:00', '2022-04-04 10:00:00', 19.7, '2022-04-04 10:00:00', null, '1', '1', 1), + ('bbb', 'BBB', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 10, 0.3, 2, + '2022-04-04 11:00:00', '2022-04-04 11:00:00', 9.7, '2022-04-04 11:00:00', null, '1', '1', 1), + ('ccc', 'CCC', '3abd0495-9abe-44a0-b95b-0e42aeadc807', '06347be1-f752-4228-8480-4528a2166e14', 12, 30, 0.3, 1, + '2022-04-04 12:00:00', '2022-04-04 12:00:00', 29.7, '2022-04-04 12:00:00', null, '1', '1', 1); + +truncate table dim.t_dim_user; +insert into dim.t_dim_user partition (year = '2022', month = '04', day = '04') (dim_user_id, user_info_code, user_name, + user_age, user_address, create_time, + update_time, + start_time, end_time, is_active, + is_latest, is_auto_created) +values ('06347be1-f752-4228-8480-4528a2166e14', 'u1', '张三', 12, '胜利街道', '2020-01-01 10:00:00', '2020-01-01 10:00:00', + '2020-01-01 10:00:00', null, '1', '1', '0'); + +truncate table dim.t_dim_product; + +insert into dim.t_dim_product partition (year = '2022', month = '04', day = '04') (product_id, mid, name, version, + status, create_time, update_time, + start_time, end_time, + is_active, + is_latest, is_auto_created) +values ('3abd0495-9abe-44a0-b95b-0e42aeadc807', 'p1', '华为', 'mate40', '上架', '2022-01-01 10:00:00', + '2022-01-01 10:00:00', '2022-01-01 10:00:00', '2022-04-04 13:00:00', '0', '0', '0') + , ('a9cd4e31-9268-4ee9-94b4-18c5e839a937', 'p1', '华为', 'mate40-v2', '上架', '2022-01-01 10:00:00', + '2022-04-04 13:00:00', '2022-04-04 13:00:00', null, '1', '1', '0'); + +``` + +准备源表数据 + +```sql +truncate table sales.order; +insert into sales.order (order_sn, product_code, product_name, product_version, product_status, + user_code, user_name, user_age, user_address, product_count, price, discount, order_status, + order_create_time, order_update_time) +values ('AAA', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利街道', 12, 20, 0.3, 2, '2022-04-04 10:00:00', + '2022-04-08 10:00:00') -- 正常更新 + , ('DDD', 'p1', '华为', 'mate40-v2', '上架', 'u2', '李四', 32, '迎宾街道', 15, 200, 0.4, 2, '2022-04-08 09:00:00', + '2022-04-08 10:00:00'); -- 新增 +``` + + +2. 下载已经编辑好的 [excel模板](https://docs.google.com/spreadsheets/d/1Zn_Q-QUTf6us4RwdgUgBosXL09-D-TowmgwWlDskvlA/edit?usp=sharing) 到 `~/Desktop` 来准备生成对应的任务脚本 + +3. 通过这个命令生成任务脚本 + +```bash +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/ods.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks" +``` + +4. 你看到如下日志表示任务脚本已经生成好了 + +```log +2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.order__t_order.sql +2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.user__t_user.sql +2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.product__t_product.sql +``` + +5. 准备连接信息 + +```properties +sales.postgres.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified +sales.postgres.user=postgres +sales.postgres.password=postgres +sales.postgres.driver=org.postgresql.Driver +sales.postgres.fetchsize=10 +``` + +6. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="batch-job --names=sales.order__t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --once" +``` + +运行结果: + +```log +Total jobs: 1, success: 1, failed: 0, skipped: 0 +Details: +job name: sales.order__t_order SUCCESS x 1 +``` + +### 运行从ods到dwd的任务 + +1. 下载提前准备好的[excel](https://docs.google.com/spreadsheets/d/1CetkqBsXj_E8oZBsws9iGdaJB1QJUajnwqH4FoKhXKA/edit?usp=sharing)到桌面 + +2. 通过这个命令生成任务脚本 + +```bash +./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/dwd.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks" +``` + +3. 你看到如下日志表示任务脚本已经生成好了 + +```log +2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_order_t_fact_order.sql +2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_user_t_dim_user.sql +2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_product_t_dim_product.sql +``` + +4. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="batch-job --names=t_order_t_fact_order --period=1440 --default-start-time='2022-04-08 00:00:00' --once" +``` + +运行结果: + +```log +Total jobs: 1, success: 1, failed: 0, skipped: 0 +Details: +job name: t_order_t_fact_order SUCCESS x 1 +``` + +### 运行从dwd到report的任务 + +1. 手动创建两个step,分别代表两个report的需求, 华为mate40-v2真实的销量表,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_actual_hive.sql` + +```sql +-- step=1 +-- source=hive +-- dbName=dwd +-- tableName=t_fact_order +-- target=hive +-- dbName=report +-- tableName=t_fact_order_report_actual +-- writeMode=overwrite +select fact.order_sn as order_sn, + dim.product_id as product_id, + dim.mid as product_code, + dim.name as product_name, + dim.version as product_version, + dim.status as product_status, + fact.price as price, + fact.discount as discount, + fact.order_status as order_status, + fact.order_create_time as order_create_time, + fact.order_update_time as order_update_time, + fact.actual as actual +from dwd.t_fact_order fact + inner join dim.t_dim_product dim + on fact.product_id = dim.product_id + and fact.is_latest = '1'; +``` + +2. 手动创建两个step,分别代表两个report的需求, 华为mate40-v2算上v1的销量,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_latest_hive.sql` + +```sql + +-- step=1 +-- source=hive +-- dbName=dwd +-- tableName=t_fact_order +-- target=hive +-- dbName=report +-- tableName=t_fact_order_report_latest +-- writeMode=overwrite +select fact.order_sn as order_sn, + dim2.product_id as product_id, + dim2.mid as product_code, + dim2.name as product_name, + dim2.version as product_version, + dim2.status as product_status, + fact.price as price, + fact.discount as discount, + fact.order_status as order_status, + fact.order_create_time as order_create_time, + fact.order_update_time as order_update_time, + fact.actual as actual +from dwd.t_fact_order fact + inner join dim.t_dim_product dim on fact.product_id = dim.product_id and fact.is_latest = '1' + inner join (select * from dim.t_dim_product dim_latest where is_latest = '1') dim2 + on dim.mid = dim2.mid and fact.is_latest = '1'; +``` + +2. 通过脚本启动任务 + +```bash +./gradlew :spark:run --args="batch-job --names=order_report_actual_hive,order_report_latest_hive --period=1440 --default-start-time='2022-04-08 00:00:00' --once" +``` diff --git a/website/docs/excel-template-dwd.md b/website/docs/excel-template-dwd.md new file mode 100644 index 0000000..ba1d7bf --- /dev/null +++ b/website/docs/excel-template-dwd.md @@ -0,0 +1,1376 @@ +--- +title: "Excel template for ods to dwd" +sidebar_position: 4 +toc: true +last_modified_at: 2021-10-21T10:59:57-04:00 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## pre-requirements + +* all table(fact & dim) must exist before running ETL jobs(ETL doesn't create table) +* you can download [this excel](https://docs.google.com/spreadsheets/d/1Prw1LFfkSkaAuf1K6O0TTI5PPRP7lLtzIR63x9HCSVw/edit#gid=1642393109) to your `~/Desktop` for the quick start guide. + +## Case 1 + +Just copy all data from ods to dwd, not joining with other tables and no quality check. + + + + + +| source_db_name | source_table_name | column_name | incremental_type | target_db_name | target_table_name | Target column_name | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column | +| :------------- | :---------------- | :----------------- | :----------------- | :------------- | :---------------- | :----------------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :-------------- | :-------------- | +| usecase_ods | test_cust | id | incremental_append | usecase_dwd | t_fact_test_cust | id | | TRUE | | | | | | | | | | | | +| usecase_ods | test_cust | code | incremental_append | usecase_dwd | t_fact_test_cust | code | | | | | | | | | | | | | | +| usecase_ods | test_cust | bz_time | incremental_append | usecase_dwd | t_fact_test_cust | bz_time | TRUE | | | | | | | | | | | | | + + + + +:::note +You need to rename the sheet name of Case1 to `Fact` to ensure the above command to execute successfully. +::: + +When generating dimension-split table, the corresponding command line is as follows: + +```bash +./gradlew clean :spark:run --args="generate-fact-sql -f ~/Desktop/数据字典-模版.xlsx --output ~/Desktop/" +``` + +The sql file corresponding to Case1 then will be generated on your desktop named `dwd_t_fact_test_cust.sql`: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_cust +-- options +-- idColumn=id +-- target=temp +-- tableName=`1d764347` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `id` as `id`, + `code` as `code`, + `bz_time` as `bz_time`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_cust`; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=t_fact_test_cust +-- target=temp +-- tableName=`0e5a2f6c` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`t_fact_test_cust` `t_fact_test_cust` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`t_fact_test_cust` `t_fact_test_cust`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`1d764347` +-- dwViewName=`0e5a2f6c` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=t_fact_test_cust +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +``` + + + + +## Case 2 +The Case2 is generated by the new Excel: the dim table is firstly imported, then is the fact table. +The fact table joining with the dim table on the basis that the dim table is already existing and completed. + + + + + +| source_db_name | source_table_name | column_name | incremental_type | target_db_name | target_table_name | Target column_name | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column | +| :------------- | :---------------- | :----------------- | :----------------- | :------------- | :---------------- | :----------------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :------------- | :-------------- | +| usecase_ods | test_split | id | incremental_append | usecase_dwd | test_fact_split | id | | TRUE | | | | | | | | | | | +| usecase_ods | test_split | user_id | incremental_append | usecase_dwd | test_fact_split | user_id | | | | TRUE | | TRUE | | | usecase_dwd | t_dim_user | id | | +| usecase_ods | test_split | user_name | incremental_append | usecase_dwd | test_fact_split | user_name | | | | | | TRUE | | | usecase_dwd | t_dim_user | user_name | | +| usecase_ods | test_split | user_account | incremental_append | usecase_dwd | test_fact_split | user_account | | | | | | | | | usecase_dwd | t_dim_user | user_account | | +| usecase_ods | test_split | bz_time | incremental_append | usecase_dwd | test_fact_split | bz_time | TRUE | | | | | | | | | | | | +| usecase_ods | test_user | id | incremental_append | usecase_dwd | t_dim_user | id | | TRUE | | | | | | | | | | | +| usecase_ods | test_user | user_name | incremental_append | usecase_dwd | t_dim_user | user_name | | | | | | | | | | | | | +| usecase_ods | test_user | user_account | incremental_append | usecase_dwd | t_dim_user | user_account | | | | | | | | | | | | | +| usecase_ods | test_user | bz_time | incremental_append | usecase_dwd | t_dim_user | bz_time | TRUE | | | | | | | | | | | | + + + + + +:::note +You need to rename the sheet name of Case2 to `Fact` to ensure the above command to execute successfully. +Then there will be 2 sql files corresponding to Case2 generated on your desktop, the first one is named `dwd_t_dim_user.sql`: +::: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_user +-- options +-- idColumn=id +-- target=temp +-- tableName=`efa9e5ec` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `id` as `id`, + `user_name` as `user_name`, + `user_account` as `user_account`, + `bz_time` as `bz_time`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_user`; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=t_dim_user +-- target=temp +-- tableName=`8c325c5e` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`t_dim_user` `t_dim_user` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`t_dim_user` `t_dim_user`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`efa9e5ec` +-- dwViewName=`8c325c5e` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=t_dim_user +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +``` + +The second one is named `dwd_test_fact_split.sql`: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_split +-- options +-- idColumn=id +-- target=temp +-- tableName=`9e69b8df` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `test_split`.`id` as `id`, + `test_split`.`bz_time` as `bz_time`, + ifnull(`t_dim_user`.`id`, '-1') as `user_id`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_split` `test_split` + left join `usecase_dwd`.`t_dim_user` `t_dim_user` + on `test_split`.`user_id` = `t_dim_user`.`id` and `t_dim_user`.is_latest = '1'; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_fact_split +-- target=temp +-- tableName=`8efabcf7` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_fact_split` `test_fact_split` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_fact_split` `test_fact_split`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`9e69b8df` +-- dwViewName=`8efabcf7` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_fact_split +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +``` + + + + + +## Case 3 + +Case 3 is generated by joining with the dim table which has the single primary key. + + + + + +| source_db_name | source_table_name | column_name | incremental_type | target_db_name | target_table_name | Target column_name | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column | +| :------------- | :---------------- | :----------------- | :----------------- | :------------- | :---------------- | :----------------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :------------- | :-------------- | +| usecase_ods | test_fact_case_3 | id | incremental_append | usecase_dwd | test_fact_target_case_3 | id | | TRUE | | | | | | | | | | | | +| usecase_ods | test_fact_case_3 | real_cust_id | incremental_append | usecase_dwd | test_fact_target_case_3 | real_cust_id | | | null check, power null check | TRUE | | | TRUE | | usecase_dwd | test_cust_case_3 | id | | | +| usecase_ods | test_fact_case_3 | real_cust_code | incremental_append | usecase_dwd | test_fact_target_case_3 | real_cust_code | | | | | | TRUE | TRUE | | usecase_dwd | test_cust_case_3 | code | | | +| usecase_ods | test_fact_case_3 | real_cust_bz_time | incremental_append | usecase_dwd | test_fact_target_case_3 | real_cust_bz_time | | | | | TRUE | TRUE | TRUE | | usecase_dwd | test_cust_case_3 | bz_time | | | +| usecase_ods | test_fact_case_3 | bz_time | incremental_append | usecase_dwd | test_fact_target_case_3 | bz_time | TRUE | | | | | | | | | | | | | + + + + +After running the same command, the sql file named `default_test_fact_target.sql` corresponding to Case3 will be generated: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_fact_case_3 +-- options +-- idColumn=id +-- column.real_cust_id.qualityCheckRules=null check, power null check +-- target=temp +-- tableName=`a8cc8c22` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select * +from `usecase_ods`.`test_fact_case_3`; + +-- stepId=3 +-- source=temp +-- target=temp +-- tableName=`ce47db66` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with join_fact_temp as (select nullif(`test_fact_case_3`.`real_cust_id`, `test_cust_case_3`.`id`) as `real_cust_id`, + nullif(`test_fact_case_3`.`real_cust_code`, `test_cust_case_3`.`code`) as `real_cust_code`, + nullif(`test_fact_case_3`.`real_cust_bz_time`, `test_cust_case_3`.`bz_time`) as `real_cust_bz_time` + from `a8cc8c22` `test_fact_case_3` + left join `usecase_dwd`.`test_cust_case_3` `test_cust_case_3` + on `test_fact_case_3`.`real_cust_id` = `test_cust_case_3`.`id` + and `test_cust_case_3`.`is_latest` = '1'), + distinct_dim_temp as (select `real_cust_id`, + `real_cust_code`, + `real_cust_bz_time` + from join_fact_temp + where 1 = 1 + and (`real_cust_id` is not null) + group by `real_cust_id`, `real_cust_code`, `real_cust_bz_time` + grouping sets ( + ( `real_cust_id`, `real_cust_code`, `real_cust_bz_time`) + )) +select `real_cust_id` as `real_cust_id`, + first_value(`real_cust_code`) as `real_cust_code`, + first_value(`real_cust_bz_time`) as `real_cust_bz_time`, + count(1) as `distinct_count_num` +from distinct_dim_temp +group by `real_cust_id` + grouping sets ( + ( `real_cust_id`) + ) +having 1 = 1 + and (`real_cust_id` is not null); + +-- stepId=4 +-- source=temp +-- target=temp +-- tableName=test_cust_case_3__f1e256b9 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `real_cust_id` as `id`, + `real_cust_code` as `code`, + `real_cust_bz_time` as `bz_time`, + '1' as `is_auto_create`, + '${EFFECTIVE_START_TIME}' as `effective_start_time`, + '9999-01-01 00:00:00' as `effective_end_time`, + '1' as `is_active`, + '1' as `is_latest`, + '${DATA_RANGE_START}' as `idempotent_key`, + '${DATE_END}' as `dw_insert_date` +from `ce47db66` `ce47db66` +where 1 = 1 + and (`real_cust_id` is not null) + and `distinct_count_num` = 1; + +-- stepId=5 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_cust_case_3 +-- target=temp +-- tableName=`8b936862` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_cust_case_3`; + +-- stepId=6 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=test_cust_case_3__f1e256b9 +-- dwViewName=`8b936862` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_cust_case_3 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +-- stepId=7 +-- source=temp +-- target=temp +-- tableName=test_fact_target_case_3__6637c70e +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with duplicate_dimension_temp as ( + select * + from `ce47db66` `ce47db66` + where 1 = 1 + and `distinct_count_num` > 1 +) +select `test_fact_case_3`.`id` as `id`, + `test_fact_case_3`.`bz_time` as `bz_time`, + (case + when `duplicate_dimension_temp_0`.`real_cust_id` is not null + then '-99' + else IFNULL(`test_cust_case_3`.`id`, '-1') + end) as `real_cust_id`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `a8cc8c22` `test_fact_case_3` + left join `usecase_dwd`.`test_cust_case_3` `test_cust_case_3` + on `test_fact_case_3`.`real_cust_id` = `test_cust_case_3`.`id` and `test_cust_case_3`.is_latest = '1' + left join `duplicate_dimension_temp` `duplicate_dimension_temp_0` + on `test_fact_case_3`.`real_cust_id` = `duplicate_dimension_temp_0`.`real_cust_id`; + +-- stepId=8 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select '' as `DW_PARTITION_CLAUSE`; + +-- stepId=9 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case_3 +-- target=temp +-- tableName=`1a280f2f` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_fact_target_case_3` `test_fact_target_case_3` + ${DW_PARTITION_CLAUSE}; + +-- step=10 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=test_fact_target_case_3__6637c70e +-- dwViewName=`1a280f2f` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case_3 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +``` + + + + +## Case 4 +In Case4, these 2 columns: area_code and area_name, are composite keys, to generate a new primary key (area_id) for the dim table. + + + + + +| source_db_name | source_table_name | Source column name | incremental_type | target_db_name | target_table_name | Target column_name | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column +| :------------- | :---------------- | :----------------- | :----------------- | :------------- | :---------------- | :----------------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :------------- | :-------------- | +| uesecase_ods | test_fact_auto_dim | id | incremental_append | usecase_dwd | test_fact_target_auto_dim | id | | TRUE | | | | | | | | | | | +| uesecase_ods | test_fact_auto_dim | | incremental_append | usecase_dwd | test_fact_target_auto_dim | area_id | | | | | | | TRUE | TRUE | usecase_dwd | test_area | id | | +| uesecase_ods | test_fact_auto_dim | area_code | incremental_append | usecase_dwd | test_fact_target_auto_dim | area_code | | | | TRUE | | | TRUE | | usecase_dwd | test_area | area_cd | | +| uesecase_ods | test_fact_auto_dim | area_name | incremental_append | usecase_dwd | test_fact_target_auto_dim | area_name | | | | TRUE | | | TRUE | | usecase_dwd | test_area | area_nm | | +| uesecase_ods | test_fact_auto_dim | area_bz_time | incremental_append | usecase_dwd | test_fact_target_auto_dim | area_bz_time | | | | | TRUE | TRUE | TRUE | | usecase_dwd | test_area | bz_time | | +| uesecase_ods | test_fact_auto_dim | bz_time | incremental_append | usecase_dwd | test_fact_target_auto_dim | bz_time | TRUE | | | | | | | | | | | | + + + + + +After running the same command, the sql file corresponding to Case4 named `default_test_fact_target.sql` will be generated on your desktop: + + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_fact_auto_dim +-- options +-- idColumn=id +-- target=temp +-- tableName=`634737e2` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select * +from `usecase_ods`.`test_fact_auto_dim`; + +-- stepId=3 +-- source=temp +-- target=temp +-- tableName=`cb939fe5` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with join_fact_temp as (select nullif(`test_fact_auto_dim`.`area_code`, `test_area`.`area_cd`) as `area_code`, + nullif(`test_fact_auto_dim`.`area_name`, `test_area`.`area_nm`) as `area_name`, + nullif(`test_fact_auto_dim`.`area_bz_time`, `test_area`.`bz_time`) as `area_bz_time` + from `634737e2` `test_fact_auto_dim` + left join `usecase_dwd`.`test_area` `test_area` + on `test_fact_auto_dim`.`area_code` = `test_area`.`area_cd` + and `test_fact_auto_dim`.`area_name` = `test_area`.`area_nm` + and `test_area`.`is_latest` = '1'), + distinct_dim_temp as (select `area_code`, + `area_name`, + `area_bz_time` + from join_fact_temp + where 1 = 1 + and (`area_code` is not null and `area_name` is not null) + group by `area_code`, `area_name`, `area_bz_time` + grouping sets ( + ( `area_code`, `area_name`, `area_bz_time`) + )) +select `area_code` as `area_code`, + `area_name` as `area_name`, + first_value(`area_bz_time`) as `area_bz_time`, + count(1) as `distinct_count_num` +from distinct_dim_temp +group by `area_code`, `area_name` + grouping sets ( + ( `area_code`, `area_name`) + ) +having 1 = 1 + and (`area_code` is not null and `area_name` is not null); + +-- stepId=4 +-- source=temp +-- target=temp +-- tableName=test_area__f5045d67 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select uuid() as `id`, + `area_code` as `area_cd`, + `area_name` as `area_nm`, + `area_bz_time` as `bz_time`, + '1' as `is_auto_create`, + '${EFFECTIVE_START_TIME}' as `effective_start_time`, + '9999-01-01 00:00:00' as `effective_end_time`, + '1' as `is_active`, + '1' as `is_latest`, + '${DATA_RANGE_START}' as `idempotent_key`, + '${DATE_END}' as `dw_insert_date` +from `cb939fe5` `cb939fe5` +where 1 = 1 + and (`area_code` is not null and + `area_name` is not null) + and `distinct_count_num` = 1; + +-- stepId=5 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_area +-- target=temp +-- tableName=`8878baea` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_area` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_area`); + +-- stepId=6 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=test_area__f5045d67 +-- dwViewName=`8878baea` +-- primaryFields=area_cd,area_nm +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_area +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +-- stepId=7 +-- source=temp +-- target=temp +-- tableName=test_fact_target_auto_dim__d3531bfc +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with duplicate_dimension_temp as ( + select * + from `cb939fe5` `cb939fe5` + where 1 = 1 + and `distinct_count_num` > 1 +) +select `test_fact_auto_dim`.`id` as `id`, + `test_fact_auto_dim`.`bz_time` as `bz_time`, + (case + when `duplicate_dimension_temp_0`.`area_code` is not null and `duplicate_dimension_temp_0`.`area_name` is not null + then '-99' + else IFNULL(`test_area`.`id`, '-1') + end) as ``, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `634737e2` `test_fact_auto_dim` + left join `usecase_dwd`.`test_area` `test_area` + on `test_fact_auto_dim`.`area_code` = `test_area`.`area_cd` + and `test_fact_auto_dim`.`area_name` = `test_area`.`area_nm` and `test_area`.is_latest = '1' + left join `duplicate_dimension_temp` `duplicate_dimension_temp_0` + on `test_fact_auto_dim`.`area_code` = `duplicate_dimension_temp_0`.`area_code` + and `test_fact_auto_dim`.`area_name` = `duplicate_dimension_temp_0`.`area_name`; + +-- stepId=8 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_auto_dim +-- target=temp +-- tableName=`a3652e87` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_fact_target_auto_dim` `test_fact_target_auto_dim` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_fact_target_auto_dim` `test_fact_target_auto_dim`); + +-- stepId=9 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`634737e2` +-- dwViewName=`a3652e87` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_auto_dim +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +``` + + + +## Case 5 + +if origin data has no id column + +not supported for now. + + +## Case 6 + +In Case 6, the origin data has no business time column. + + + + + +| source_db_name | source_table_name | column_name | incremental_type | target_db_name | target_table_name | target_column_name | expression | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column| +| :------------- | :---------------- | :---------- | :----------------- | :------------- | :---------------- | :----------------- | :--------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :---------- | :--------------| +| usecase_ods | test_fact_case_6 | id | incremental_append | usecase_dwd | test_fact_target_case_6 | id | TRUE | TRUE | | | | | | | | | | | | +| usecase_ods | test_fact_case_6 | | incremental_append | usecase_dwd | test_fact_target_case_6 | area_id | | | | | TRUE | TRUE | | TRUE | | usecase_dwd | test_area_case_6 | id | | +| usecase_ods | test_fact_case_6 | area_code | incremental_append | usecase_dwd | test_fact_target_case_6 | area_code | | | | | | | TRUE | TRUE | | usecase_dwd | test_area_case_6 | area_cd | | +| usecase_ods | test_fact_case_6 | area_name | incremental_append | usecase_dwd | test_fact_target_case_6 | area_name | | | | | | | TRUE | TRUE | | usecase_dwd | test_area_case_6 | area_nm | | + + + + + +After running the same command, the sql file `default_test_fact_target.sql` will be generated: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_fact_case_6 +-- options +-- idColumn=id +-- target=temp +-- tableName=`b53c9449` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select * +from `usecase_ods`.`test_fact_case_6`; + +-- stepId=3 +-- source=temp +-- target=temp +-- tableName=`6954aac5` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with join_fact_temp as (select nullif(`test_fact_case_6`.`area_id`, `test_area_case_6`.`id`) as `area_id`, + nullif(`test_fact_case_6`.`area_code`, `test_area_case_6`.`area_cd`) as `area_code`, + nullif(`test_fact_case_6`.`area_name`, `test_area_case_6`.`area_nm`) as `area_name` + from `b53c9449` `test_fact_case_6` + left join `usecase_dwd`.`test_area_case_6` `test_area_case_6` + on `test_fact_case_6`.`area_id` = `test_area_case_6`.`id` + and `test_area_case_6`.`is_latest` = '1'), + distinct_dim_temp as (select `area_id`, + `area_code`, + `area_name` + from join_fact_temp + where 1 = 1 + and (`area_id` is not null) + group by `area_id`, `area_code`, `area_name` + grouping sets ( + ( `area_id`, `area_code`, `area_name`) + )) +select `area_id` as `area_id`, + first_value(`area_code`) as `area_code`, + first_value(`area_name`) as `area_name`, + count(1) as `distinct_count_num` +from distinct_dim_temp +group by `area_id` + grouping sets ( + ( `area_id`) + ) +having 1 = 1 + and (`area_id` is not null); + +-- stepId=4 +-- source=temp +-- target=temp +-- tableName=test_area_case_6__ebc46690 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `area_id` as `id`, + `area_code` as `area_cd`, + `area_name` as `area_nm`, + '1' as `is_auto_create`, + '${EFFECTIVE_START_TIME}' as `effective_start_time`, + '9999-01-01 00:00:00' as `effective_end_time`, + '1' as `is_active`, + '1' as `is_latest`, + '${DATA_RANGE_START}' as `idempotent_key`, + '${DATE_END}' as `dw_insert_date` +from `6954aac5` `6954aac5` +where 1 = 1 + and (`area_id` is not null) + and `distinct_count_num` = 1; + +-- stepId=5 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_area_case_6 +-- target=temp +-- tableName=`1c7bcb60` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_area_case_6`; + +-- stepId=6 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=id +-- odsViewName=test_area_case_6__ebc46690 +-- dwViewName=`1c7bcb60` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_area_case_6 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +-- stepId=7 +-- source=temp +-- target=temp +-- tableName=test_fact_target_case_6__e9ae24c3 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +with duplicate_dimension_temp as ( + select * + from `6954aac5` `6954aac5` + where 1 = 1 + and `distinct_count_num` > 1 +) +select `test_fact_case_6`.`id` as `id`, + (case + when `duplicate_dimension_temp_0`.`area_id` is not null + then '-99' + else IFNULL(`test_area_case_6`.`id`, '-1') + end) as `area_id`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `b53c9449` `test_fact_case_6` + left join `usecase_dwd`.`test_area_case_6` `test_area_case_6` + on `test_fact_case_6`.`area_id` = `test_area_case_6`.`id` and `test_area_case_6`.is_latest = '1' + left join `duplicate_dimension_temp` `duplicate_dimension_temp_0` + on `test_fact_case_6`.`area_id` = `duplicate_dimension_temp_0`.`area_id`; + +-- stepId=8 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select '' as `DW_PARTITION_CLAUSE`; + +-- stepId=9 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case_6 +-- target=temp +-- tableName=`775d93f3` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_fact_target_case_6` `test_fact_target_case_6` + ${DW_PARTITION_CLAUSE}; + +-- step=10 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=id +-- odsViewName=test_fact_target_case_6__e9ae24c3 +-- dwViewName=`775d93f3` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case_6 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +``` + + + + +Script for creating ODS tables: + + +```sql +create table usecase_ods.test_fact +( + id varchar(255), + area_code varchar(255), + area_name varchar(255), + job_time timestamp +) +``` + +Insert data to ODS: + +```sql +insert into usecase_ods.test_fact values(1, '123', 'area-123', '2020-01-01 15:05:05'); +insert into usecase_ods.test_fact values(2, '456', 'area-456', '2020-11-01 15:05:05'); +``` + + + + +Script for creating DWD tables. + +```sql +create table usecase_dwd.test_fact_target +( + id varchar(255), + area_id varchar(255), + job_time timestamp, + is_auto_create varchar(255), + effective_start_time timestamp, + effective_end_time timestamp, + is_active varchar(255), + is_latest varchar(255), + idempotent_key varchar(255), + dw_insert_date varchar(255) +); + +create table usecase_dwd.test_area +( + id varchar(255), + area_cd varchar(255), + area_nm varchar(255), + bz_time timestamp, + is_auto_create varchar(255), + effective_start_time timestamp, + effective_end_time timestamp, + is_active varchar(255), + is_latest varchar(255), + idempotent_key varchar(255), + dw_insert_date varchar(255) +); + +``` + + + + +## Case 7 + +if origin system do HARD delete + +incremental_type = incremental_diff + +## Case 8 + +In Case8, the auto-created dim table combine from multiple fact table + + + + + +| source_db_name | source_table_name | column_name | incremental_type | target_db_name | target_table_name | target_column_name | expression | sort_column | id_column | quality_check_rules | dim_key | dim_sort_column | dim_description | auto_create_dim | auto_create_dim_id | dim_db_name | dim_table_name | dim_column_name | zip_dim_key | partition_column | +| :------------- | :----------------- | :------------- | :----------------- | :------------- | :--------------------- | :----------------- | :--------- | :---------- | :-------- | :------------------ | :------ | :-------------- | :-------------- | :-------------- | :----------------- | :---------- | :------------- | :-------------- | :---------- | :--------------- | +| usecase_ods | test_fact_case8 | id | incremental_append | usecase_dwd | test_fact_target_case8 | id | | | TRUE | | | | | | | | | | | | +| usecase_ods | test_fact_case8 | region_id | incremental_append | usecase_dwd | test_fact_target_case8 | region_id | | | | | TRUE | | | TRUE | | usecase_dwd | test_region | id | | | +| usecase_ods | test_fact_case8 | region_code | incremental_append | usecase_dwd | test_fact_target_case8 | region_code | | | | | | | TRUE | TRUE | | usecase_dwd | test_region | region_cd | | | +| usecase_ods | test_fact_case8 | region_name | incremental_append | usecase_dwd | test_fact_target_case8 | region_name | | | | | | | TRUE | TRUE | | usecase_dwd | test_region | region_nm | | | +| usecase_ods | test_fact_case8 | region_bz_time | incremental_append | usecase_dwd | test_fact_target_case8 | region_bz_time | | | | | | TRUE | TRUE | TRUE | | usecase_dwd | test_region | bz_time | | | +| usecase_ods | test_fact_case8 | bz_time | incremental_append | usecase_dwd | test_fact_target_case8 | bz_time | | TRUE | | | | | | | | | | | | | +| usecase_ods | test_store_fact | id | incremental_append | usecase_dwd | test_store_fact_target | id | | | TRUE | | | | | | | | | | | | +| usecase_ods | test_store_fact | region_id | incremental_append | usecase_dwd | test_store_fact_target | region_id | | | | | TRUE | | | TRUE | | usecase_dwd | test_region | id | | | +| usecase_ods | test_store_fact | region_count | incremental_append | usecase_dwd | test_store_fact_target | region_count | | | | | | | TRUE | TRUE | | usecase_dwd | test_region | region_ct | | | +| usecase_ods | test_store_fact | region_address | incremental_append | usecase_dwd | test_store_fact_target | region_address | | | | | | | TRUE | TRUE | | usecase_dwd | test_region | region_address | | | +| usecase_ods | test_store_fact | region_bz_time | incremental_append | usecase_dwd | test_store_fact_target | region_bz_time | | | | | | TRUE | TRUE | TRUE | | usecase_dwd | test_region | bz_time | | | +| usecase_ods | test_store_fact | bz_time | incremental_append | usecase_dwd | test_store_fact_target | bz_time | | TRUE | | | | | | | | | | | | | +| usecase_ods | test_region_source | id | incremental_append | usecase_dwd | test_region | id | | | TRUE | | | | | | | | | | | | +| usecase_ods | test_region_source | region_cd | incremental_append | usecase_dwd | test_region | region_cd | | | | | | | | | | | | | | | +| usecase_ods | test_region_source | region_nm | incremental_append | usecase_dwd | test_region | region_nm | | | | | | | | | | | | | | | +| usecase_ods | test_region_source | region_ct | incremental_append | usecase_dwd | test_region | region_ct | | | | | | | | | | | | | | | +| usecase_ods | test_region_source | region_address | incremental_append | usecase_dwd | test_region | region_address | | | | | | | | | | | | | | | +| usecase_ods | test_region_source | bz_time | incremental_append | usecase_dwd | test_region | bz_time | | TRUE | | | | | | | | | | | | | +| usecase_ods | test_region_source | | incremental_append | usecase_dwd | test_region | is_auto_create | '0' | | | | | | | | | | | | | | + + + + + + +There will be 3 sql files generated on your desktop, named `usecase_dwd_test_region.sql`, `usecase_dwd_test_fact_target_case8.sql` and `usecase_dwd_test_store_fact_target.sql`, respectively. + +`usecase_dwd_test_region.sql`: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_region_source +-- options +-- idColumn=id +-- target=temp +-- tableName=`b84d02c6` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `id` as `id`, + `region_cd` as `region_cd`, + `region_nm` as `region_nm`, + `region_ct` as `region_ct`, + `region_address` as `region_address`, + `bz_time` as `bz_time`, + '0' as `is_auto_create`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_region_source`; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_region +-- target=temp +-- tableName=`eac5375c` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_region` `test_region` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_region` `test_region`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`b84d02c6` +-- dwViewName=`eac5375c` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_region +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +``` + +`usecase_dwd_test_fact_target_case8.sql`: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_fact_case8 +-- options +-- idColumn=id +-- target=temp +-- tableName=`c7a033fe` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `test_fact_case8`.`id` as `id`, + `test_fact_case8`.`bz_time` as `bz_time`, + ifnull(`test_region`.`id`, '-1') as `region_id`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_fact_case8` `test_fact_case8` + left join `usecase_dwd`.`test_region` `test_region` + on `test_fact_case8`.`region_id` = `test_region`.`id` and `test_region`.is_latest = '1'; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case8 +-- target=temp +-- tableName=`b99ce421` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_fact_target_case8` `test_fact_target_case8` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_fact_target_case8` `test_fact_target_case8`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`c7a033fe` +-- dwViewName=`b99ce421` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_fact_target_case8 +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + +``` + +`usecase_dwd_test_store_fact_target.sql`: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'yyyyMMdd') as `DATE_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; + +-- stepId=2 +-- source=hive +-- dbName=usecase_ods +-- tableName=test_store_fact +-- options +-- idColumn=id +-- target=temp +-- tableName=`ee9d6f1e` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `test_store_fact`.`id` as `id`, + `test_store_fact`.`bz_time` as `bz_time`, + ifnull(`test_region`.`id`, '-1') as `region_id`, + '${EFFECTIVE_START_TIME}' as effective_start_time, + '9999-01-01 00:00:00' as effective_end_time, + '1' as is_active, + '1' as is_latest, + '${DATA_RANGE_START}' as idempotent_key, + '${DATE_END}' as dw_insert_date +from `usecase_ods`.`test_store_fact` `test_store_fact` + left join `usecase_dwd`.`test_region` `test_region` + on `test_store_fact`.`region_id` = `test_region`.`id` and `test_region`.is_latest = '1'; + +-- stepId=3 +-- source=hive +-- dbName=usecase_dwd +-- tableName=test_store_fact_target +-- target=temp +-- tableName=`ff1acfcc` +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +select `(dw_insert_date)?+.+`, + '${DATE_END}' as `dw_insert_date` +from `usecase_dwd`.`test_store_fact_target` `test_store_fact_target` +where `dw_insert_date` = (select max(`dw_insert_date`) + from `usecase_dwd`.`test_store_fact_target` `test_store_fact_target`); + +-- stepId=4 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer +-- methodName=transform +-- dwDataLoadType=incremental +-- sortFields=bz_time +-- odsViewName=`ee9d6f1e` +-- dwViewName=`ff1acfcc` +-- primaryFields=id +-- transformerType=object +-- target=hive +-- dbName=usecase_dwd +-- tableName=test_store_fact_target +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite + + +``` + + + + +Script for creating ODS tables: + + +```sql +create table usecase_ods.test_fact_case8 +( + id varchar(255), + region_id varchar(255), + region_code varchar(255), + region_name varchar(255), + region_bz_time timestamp, + bz_time timestamp, + job_id varchar(255), + job_time timestamp +); + +create table usecase_ods.test_store_fact +( + id varchar(255), + region_id varchar(255), + region_count varchar(255), + region_address varchar(255), + region_bz_time timestamp, + bz_time timestamp, + job_id varchar(255), + job_time timestamp +); + +create table usecase_ods.test_region_source +( + id varchar(255), + region_cd varchar(255), + region_nm varchar(255), + region_ct int, + region_address varchar(255), + bz_time timestamp, + job_id varchar(255), + job_time timestamp +); +``` + +Insert data to ODS: + +```sql +insert into usecase_ods.test_fact_case8 values(1, '1', '123', 'region-123', '2020-01-01 15:05:05', '2020-01-01 15:05:05', '1', '2020-01-01 15:05:05'); +insert into usecase_ods.test_fact_case8 values(2, '2', '456', 'region-456', '2020-11-01 15:05:05', '2020-11-01 15:05:05', '2', '2020-11-01 15:05:05'); + +insert into usecase_ods.test_store_fact values(1, '1', 123, 'address-123', '2020-01-01 15:05:05', '2020-01-01 15:05:05', '1', '2020-01-01 15:05:05'); +insert into usecase_ods.test_store_fact values(2, '2', 456, 'address-456', '2020-11-01 15:05:05', '2020-11-01 15:05:05', '2', '2020-11-01 15:05:05'); + +insert into usecase_ods.test_region_source values(1, '123', 'region-123', 123, 'address-123', '2020-01-01 15:05:05', '1', '2020-01-01 15:05:05'); +insert into usecase_ods.test_region_source values(2, '456', 'region-456', 456, 'address-456', '2020-11-01 15:05:05', '2', '2020-11-01 15:05:05'); +``` + + + + +Script for creating DWD tables. + +```sql +create table usecase_dwd.test_fact_target_case8 +( + id varchar(255), + region_id varchar(255), + bz_time timestamp, + job_time timestamp, + effective_start_time timestamp, + effective_end_time timestamp, + is_active varchar(255), + is_latest varchar(255), + idempotent_key varchar(255), + dw_insert_date varchar(255) +); + +create table usecase_dwd.test_store_fact_target +( + id varchar(255), + region_id varchar(255), + bz_time timestamp, + job_time timestamp, + effective_start_time timestamp, + effective_end_time timestamp, + is_active varchar(255), + is_latest varchar(255), + idempotent_key varchar(255), + dw_insert_date varchar(255) +); + +create table usecase_dwd.test_region +( + id varchar(255), + region_cd varchar(255), + region_nm varchar(255), + region_ct int, + region_address varchar(255), + bz_time timestamp, + job_time timestamp, + is_auto_create varchar(255), + effective_start_time timestamp, + effective_end_time timestamp, + is_active varchar(255), + is_latest varchar(255), + idempotent_key varchar(255), + dw_insert_date varchar(255) +); +``` + +> Please Note: field `is_auto_create` is required for **Dim** table. It is used to mark whether this is from source data or generated by ETL framework. + + + + + diff --git a/website/docs/excel-template-ods.md b/website/docs/excel-template-ods.md new file mode 100644 index 0000000..7b0a996 --- /dev/null +++ b/website/docs/excel-template-ods.md @@ -0,0 +1,86 @@ +--- +title: "Excel template for source to ods" +sidebar_position: 3 +toc: true +last_modified_at: 2021-10-21T10:59:57-04:00 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## pre-requirements + +* all tables must exist before running ETL jobs(ETL doesn't create table) + +* you can download [this excel](https://docs.google.com/spreadsheets/d/1Prw1LFfkSkaAuf1K6O0TTI5PPRP7lLtzIR63x9HCSVw/edit#gid=1642393109) to your `~/Desktop` for the quick start guide. +## config sample + + + + + +| source_db_name | source_table_name | source_column_name | is_PK | incremental_column | additional_filter | target_db_name | target_table_name | target_column_name | expression | incremental_type | partition column | update_frequency | +| :------------- | :---------------- | :----------------- | :---- | :----------------- | :---------------- | :------------- | :---------------- | :----------------- | :--------- | :----------------- | :--------------- | :--------------- | +| db_name | table_name | xx1 | 1 | | | db_name | ods_table_name | xx1 | | incremental_append | | 1440 | +| db_name | table_name | xx2 | | | | db_name | ods_table_name | xx2 | | incremental_append | | 1440 | +| db_name | table_name | xx3 | | | | db_name | ods_table_name | xx3 | | incremental_append | | 1440 | +| db_name | table_name | xx4 | | | | db_name | ods_table_name | xx4 | | incremental_append | | 1440 | +| db_name | table_name | xx5 | | | | db_name | ods_table_name | xx5 | | incremental_append | | 1440 | +| db_name | table_name | xx6 | | | | db_name | ods_table_name | xx6 | | incremental_append | | 1440 | +| db_name | table_name | xx7 | | | | db_name | ods_table_name | xx7 | | incremental_append | | 1440 | +| db_name | table_name | xx8 | | | | db_name | ods_table_name | xx8 | | incremental_append | | 1440 | +| db_name | table_name | xx9 | | | | db_name | ods_table_name | xx9 | | incremental_append | | 1440 | +| db_name | table_name | xx10 | | TRUE | | db_name | ods_table_name | xx10 | | incremental_append | | 1440 | +| db_name | table_name | | | | | db_name | ods_table_name | job_id | ${JOB_ID} | incremental_append | | 1440 | +| db_name | table_name | | | | | db_name | ods_table_name | job_time | now() | incremental_append | | 1440 | +| db_name | table_name | | | | | db_name | ods_table_name | load_dt | now() | incremental_append | | 1440 | + + + + + +By running the following command, there is a sql file generated on your desktop: + +```bash +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/数据字典-模版.xlsx --output ~/Desktop/" +``` + +Then the .sql file illustrates the steps on how to handle the data from the excel config. + +```sql +-- step=1 +-- source=hive +-- dbName=db_name +-- tableName=table_name +-- target=hive +-- dbName=db_name +-- tableName=ods_table_name +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +-- incrementalType=incremental_append +SELECT `xx1` AS `xx1`, + `xx2` AS `xx2`, + `xx3` AS `xx3`, + `xx4` AS `xx4`, + `xx5` AS `xx5`, + `xx6` AS `xx6`, + `xx7` AS `xx7`, + `xx8` AS `xx8`, + `xx9` AS `xx9`, + `xx10` AS `xx10`, + ${JOB_ID} AS `job_id`, + now() AS `job_time`, + now() AS `load_dt` +FROM `db_name`.`table_name` +WHERE `xx10` >= '${DATA_RANGE_START}' AND `xx10` < '${DATA_RANGE_END}'; +``` + + + + diff --git a/website/docs/log-driven.md b/website/docs/log-driven.md new file mode 100644 index 0000000..3796f8b --- /dev/null +++ b/website/docs/log-driven.md @@ -0,0 +1,124 @@ +--- +title: "Log driven" +sidebar_position: 6 +toc: true +last_modified_at: 2022-02-23T18:25:57-04:00 +--- + +## 常规的任务调度 + +![Log Driven](/assets/images/logdriven-1.svg) + +对于一个daily的任务,理想情况下是每天都会成功,但是实际上肯定会遇到失败的场景,不同的调度引擎往往对于失败的case有不同的处理逻辑。 +这里以忽略过去失败的任务,继续开启下一个调度周期为例,对比实例,跳过了2022-02-02的任务,继续运行 2022-02-03的任务。当发现任务出问题之后,需要手动补数据,手动重新运行2022-02-02的任务,把数据补上去。(这里如果有报表使用了2022-02-02的数据,那么报表的数据肯定是不准确的) + +缺点:完全依赖于调度工具的任务历史记录,如果没有配置失败通知机制,需要一个个去看哪个任务挂掉了。如果允许失败任务之后的任务继续运行,可能会导致对顺序有要求的场景下出问题,比如 2月3日的数据在mysql做了upsert操作,2月2日的又做了一次(在修复失败之后),就会导致用旧的数据覆盖新的数据的问题。 + +**这里也不否认有些调度框架在适当的配置时也能解决上述问题,但是没有人能保证所有的调度框架都能解决上面的问题或者你的项目对于调度框架有自由选择的空间。** + +## 日志驱动 + +所谓的“日志驱动”,其实和“断点续传”这个概念很像,只不过没有应用在下载文件上,而是应用到了数仓。日志驱动有几个核心要点: + +* 自行记录任务运行历史,而不依赖与调度框架的功能。这样就做到了与不同调度框架解绑; +* 调度是有序的,上个周期任务失败了,不会跳过它运行下个周期的任务,每次调度还是会先执行之前失败的任务,直到它成功; + +日志驱动也带来了几点好处: + +* 可以解决重复调度的问题,当任务运行后发现有相同任务在运行或者已经运行过了,当前任务可以直接退出或者kill掉之前的任务 +* 补数据操作更加容易实现且灵活而不容易出错 +* 更加灵活的任务依赖配置(任务上下游不一定是同频率或者必须在一个dag里面) +* 更加灵活的调度起始设置,例如对于kafka offset和自增主键的支持 +* 更加统一且容易的运维操作(不同的项目、不同的调度引擎,都可以基于日志驱动(的表)来进行运维操作) +* 可以记录更加详细的任务状态,比如读到多少条数据,写了多少条数据等等(特指结构化记录,而不是普通的执行日志),方便做统计查看 +* 可以自行选择事务级别(单独一篇展开讲) +* 数据模型分层解耦的作用(单独一篇展开讲) + +![Log Driven](/assets/images/logdriven-2.svg) + +回到现实场景,任务失败的情况大致可以分为两种: + +* 重试就可以成功(网络闪崩,排队超时等) +* 代码、环境有问题需要人工介入的 + +对于重试就可以成功的情况,往往在下一次调度就可以自动补上之前失败的任务的数据;(如果不想等到下一个周期,可以马上调度一次) + +对于无法重试成功的情况,往往每次调度都会挂掉,但是只会尝试最开始的那天的任务,因为前置的任务没有成功,只是在每天重试 2022-02-02 的任务; +无法重试成功的任务,仍然需要人工介入,修复(环境、逻辑、上游数据等问题)之后,自动(按顺序)补上之前挂掉的任务的数据; + + +## 日志驱动的执行逻辑 + +![Log Driven](/assets/images/logdriven-3.svg) + +## 待执行队列的具体计算逻辑 + +* [time-based](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L148-L161) + + 包括 db的增量和全量、API的增量和全量、文件的增量和全量 等 + + `dataRangeStart`取 ‘开始的时间’ option `--default-start` 和 ‘上次成功任务的’ `dataRangeEnd` 的最大值, + 频率 取 option `--period`,根据这两个值计算`dataRangeEnd`,简易计算逻辑: + + 应该schedule的次数 = (‘当前时间’ - `dataRangeStart`) / `period` (取整) + + 对于一个没有运行过的任务,假设`--default-start`为 20220101000000,`--period`(单位:分钟)是 1440,就是说从2022-01-01 00:00:00开始每天运行一次任务,如果当前时间是2022-01-05 14:00:00,这时就会schedule 4个任务(20220101000000-20220102000000, 20220102000000-20220103000000, 20220103000000-20220104000000, 20220104000000-20220105000000)。 + + 对于一个运行过的任务,之前已经设定过`--default-start`为 20220101000000,但是已经运行过一段时间,假设当前任务对应的`dataRangeEnd`的最大值为20220107000000,当前时间为2022-01-08 14:00:00,那么会schedule 1个任务(20220107000000-20220108000000)。 + +* [auto-incremental primary key](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L126-L146) + + 数据库自增主键场景 + `dataRangeStart`取 ‘开始主键值’ option `--default-start`(默认:0) 和 ‘上次成功任务的’ `dataRangeEnd` 的最大值, + `dataRangeEnd`取值 `max(primary key)`, 任务运行结束后会更新这次任务的实际取到的最大主键值到`dataRangeEnd`中。 + +* [kafka topic](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L76-L123) + + 与自增主键类似, + `dataRangeStart`取 ‘开始主键值’ option `--default-start`(默认:`earlist`) 和 ‘上次成功任务的’ `dataRangeEnd` 的最大值, + `dataRangeEnd`取值 `latest`, 任务运行结束后会更新这次任务的实际取到的最大offset到`dataRangeEnd`中。 + + +## 日志驱动的表设计 + +日志驱动目前的实现主要有两张表 `job_log`, `step_log` + +```sql +create table job_log +( + job_id bigint auto_increment comment '任务id,主键' primary key, + job_name varchar(128) charset utf8 not null, + job_period int not null comment '周期', + job_schedule_id varchar(128) charset utf8 not null comment 'job_name + data_range_start 拼接的字符串', + data_range_start varchar(1024) charset utf8 null, + data_range_end varchar(1024) charset utf8 null, + job_start_time datetime null comment '任务开始时间', + job_end_time datetime null comment '任务结束时间', + status varchar(32) charset utf8 not null comment '任务结果: SUCCESS,FAILURE,RUNNING', + create_time datetime default CURRENT_TIMESTAMP not null comment '数据插入时间', + last_update_time datetime default CURRENT_TIMESTAMP not null comment '数据更新时间', + incremental_type varchar(16) null, + current_file varchar(1024) charset utf8 null comment '文件数据源会记录文件名', + application_id varchar(64) charset utf8 null comment '执行引擎的任务id,例如spark的applicationId', + project_name varchar(256) charset utf8 null +); + +create table step_log +( + job_id bigint not null, + step_id varchar(64) not null, + status varchar(32) not null, + start_time datetime not null, + end_time datetime not null, + duration int(11) unsigned not null, + output text not null comment 'info日志', + source_count bigint null, + target_count bigint null, + success_count bigint null comment '执行成功条数', + failure_count bigint null comment '执行失败条数', + error varchar(10000) null comment 'error日志', + source_type varchar(256) null comment '数据源类型', + target_type varchar(256) null comment '目标源类型', + primary key (job_id, step_id) +); +``` \ No newline at end of file diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md new file mode 100644 index 0000000..353d13d --- /dev/null +++ b/website/docs/quick-start-guide.md @@ -0,0 +1,310 @@ +--- +title: "Quick Start Guide" +sidebar_position: 2 +toc: true +last_modified_at: 2021-10-21T10:59:57-04:00 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This guide provides a quick peek to Sharp ETL's capabilities. +For a video guide, please check: + + + +## Setup + +Sharp ETL works well with Spark-2.3+ & Spark-3.2.+ versions. You can follow the instructions [here](https://github.com/SharpData/SharpETL/blob/master/.github/workflows/build.yml#L15-L19) for supported spark version. + + + + +Build from source for your spark version: + +```scala +//for spark 3.1 with scala 2.12 +./gradlew buildJars -PscalaVersion=2.12 -PsparkVersion=3.1.2 -PscalaCompt=2.12.15 + +//for spark 2.4 with scala 2.12 +./gradlew buildJars -PscalaVersion=2.12 -PsparkVersion=2.4.8 -PscalaCompt=2.12.15 + +//for spark 2.4 with scala 2.11 +./gradlew buildJars -PscalaVersion=2.11 -PsparkVersion=2.4.8 -PscalaCompt=2.11.12 +``` + + + + +:::note Please note the following + +::: + +Start a postgres instance + +```bash +docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres:12.0-alpine +``` + +Start a ETL db instance + +```bash +docker run --name mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=bigdata_etl mysql:8.0 +``` + +Suppose we have a table named `online_order` in postgres with schema `sales`: + + + + +```sql +-- This extension provides a function to generate a version 4 UUID, we must enable the extension first. +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; +create schema sales; +create table sales.online_order +( + order_no varchar(64) default gen_random_uuid() not null + primary key, + user_id varchar(32) not null, + user_name varchar(32) not null, + order_total_amount numeric, + actual_amount numeric, + post_amount numeric, + order_pay_amount numeric, + total_discount numeric, + pay_type varchar(32), + source_type varchar(32), + order_status varchar(32), + note varchar(32), + confirm_status varchar(32), + payment_time timestamp, + delivery_time timestamp, + receive_time timestamp, + comment_time timestamp, + delivery_company varchar(32), + delivery_code varchar(32), + business_date date default CURRENT_DATE, + return_flag varchar(32), + created_at timestamp default CURRENT_TIMESTAMP, + updated_at timestamp default CURRENT_TIMESTAMP, + deleted_at timestamp +); +``` + + + + +**We can download [this excel](https://docs.google.com/spreadsheets/d/1EwQLzKOjEbl8TDD4DFNav7zkIStjxMpBQjV_6jT9giw/edit?usp=sharing) to your `~/Desktop` for the quick start guide.** + +:::tip +You can also use the existing [excel template](https://docs.google.com/spreadsheets/d/193aR2HXvvIUNeI4W9sSxNbLhQ78mvVNnYp9pmItSpVU/edit) for your new cases. +::: + +## Generate sql files from excel config + + + + +```bash +./gradlew :spark:run --args="generate-sql -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --output ~/Desktop/" +``` + + + + + +And you can see a new file generated at `~/Desktop/sales.online_order.sql` + +```sql +-- step=1 +-- source=postgres +-- dbName=postgres +-- tableName=sales.online_order +-- target=postgres +-- dbName=postgres +-- tableName=ods.t_fact_online_order +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=append +-- incrementalType=incremental_append +SELECT "order_no" AS "order_no", + "user_id" AS "user_id", + "user_name" AS "user_name", + "order_total_amount" AS "order_total_amount", + "actual_amount" AS "actual_amount", + "post_amount" AS "post_amount", + "order_pay_amount" AS "order_pay_amount", + "total_discount" AS "total_discount", + "pay_type" AS "pay_type", + "source_type" AS "source_type", + "order_status" AS "order_status", + "note" AS "note", + "confirm_status" AS "confirm_status", + "payment_time" AS "payment_time", + "delivery_time" AS "delivery_time", + "receive_time" AS "receive_time", + "comment_time" AS "comment_time", + "delivery_company" AS "delivery_company", + "delivery_code" AS "delivery_code", + "business_date" AS "business_date", + "return_flag" AS "return_flag", + "created_at" AS "created_at", + "updated_at" AS "updated_at", + "deleted_at" AS "deleted_at", + ${JOB_ID} AS "job_id", + now() AS "job_time" +FROM "postgres"."sales"."online_order" +WHERE "business_date" >= '${DATA_RANGE_START}' AND "business_date" < '${DATA_RANGE_END}'; +``` + +## Create ODS table + + + + +```sql +create schema ods; +create table ods.t_fact_online_order +( + order_no varchar(64) not null, + user_id varchar(32) not null, + user_name varchar(32) not null, + order_total_amount numeric, + actual_amount numeric, + post_amount numeric, + order_pay_amount numeric, + total_discount numeric, + pay_type varchar(32), + source_type varchar(32), + order_status varchar(32), + note varchar(32), + confirm_status varchar(32), + payment_time timestamp, + delivery_time timestamp, + receive_time timestamp, + comment_time timestamp, + delivery_company varchar(32), + delivery_code varchar(32), + business_date date default CURRENT_DATE, + return_flag varchar(32), + created_at timestamp default CURRENT_TIMESTAMP, + updated_at timestamp default CURRENT_TIMESTAMP, + deleted_at timestamp, + job_id varchar(16), + job_time timestamp +); +``` + + + +## Insert data + + + + + +```sql +insert into sales.online_order(order_no, user_id, user_name, order_total_amount, actual_amount, post_amount, + order_pay_amount, + total_discount, pay_type, source_type, order_status, payment_time, business_date, + created_at, updated_at, deleted_at) +VALUES ('2021093000001', 1, '张三ð', 200.0, 100, 0, 99, 101.0, 'wechat', 'mini-program', 'paid', '2021-09-30 09:00:35', + '2021-09-30', + '2021-09-30 09:00:00', '2021-09-30 09:00:35', null), + ('2021093000002', 2, '李四o(╥﹏╥)o', 399.0, 200, 0, 200, 199.0, 'wechat', 'official-website', 'paid', + '2021-09-30 19:00:35', + '2021-09-30', + '2021-09-30 19:00:00', '2021-09-30 19:00:35', null); +``` + + + + +## Before run job + +The db connection infomation is specified in `application.properties` and Make sure your db connections are included in the file. For a quick start, we need to add followings: + +``` +postgres.postgres.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified +postgres.postgres.user=postgres +postgres.postgres.password=postgres +postgres.postgres.driver=org.postgresql.Driver +postgres.postgres.fetchsize=10 +``` + + +## Run the job + +Then we will run a sample job which reads data from `sales.online_order` table and write them into `ods.t_fact_online_order` + + + + +```bash +# run all job in batch by `spark-submit` +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time="2021-09-30 00:00:00" --local --once + +# run all job locally +./gradlew :spark:run --args="batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time='2021-09-30 00:00:00' --local --once" + +# run single job by `spark-submit` +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar single-job --name=sales.online_order --period=1440 --default-start-time="2021-09-30 00:00:00" --local --once + +# run single job locally +./gradlew :spark:run --args="single-job --name=sales.online_order --period=1440 --default-start-time='2021-09-30 00:00:00' --local --once" +``` +:::note +You need to put sql file under `spark/src/main/resources/tasks` or put it into HDFS/DBFS to run `single-job` +If you want to configure the sql file folder, please set `etl.workflow.path` in `application.properties` +::: + + + + +## Query job result + + + + +```sql +SELECT * FROM ods.t_fact_online_order; +``` + +| order_no | user_id | user_name | order_total_amount | actual_amount | post_amount | order_pay_amount | total_discount | pay_type | source_type | order_status | note | confirm_status | payment_time | delivery_time | receive_time | comment_time | delivery_company | delivery_code | business_date | return_flag | created_at | updated_at | deleted_at | job_id | job_time | +| :------------ | :------ | :----------- | :----------------- | :------------ | :---------- | :--------------- | :------------- | :------- | :--------------- | :----------- | :--- | :------------- | :------------------------- | :------------ | :----------- | :----------- | :--------------- | :------------ | :------------ | :---------- | :------------------------- | :------------------------- | :--------- | :----- | :------------------------- | +| 2021093000002 | 2 | 李四o(╥﹏╥)o | 399 | 200 | 0 | 200 | 199 | wechat | official-website | paid | | | 2021-09-30 19:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 19:00:00.000000 | 2021-09-30 19:00:35.000000 | | 1 | 2021-10-26 16:30:49.486856 | +| 2021093000001 | 1 | 张三ð | 200 | 100 | 0 | 99 | 101 | wechat | mini-program | paid | | | 2021-09-30 09:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 09:00:00.000000 | 2021-09-30 09:00:35.000000 | | 1 | 2021-10-26 16:30:49.486856 | +| | | | | | | | | | | | | | | | | | | | | | | | | | | + + diff --git a/website/docs/ranger-integrate.md b/website/docs/ranger-integrate.md new file mode 100644 index 0000000..43c6d30 --- /dev/null +++ b/website/docs/ranger-integrate.md @@ -0,0 +1,174 @@ +--- +title: "Ranger Integrate" +sidebar_position: 7 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +This guide provides quick setup for integrate with Ranger + +## Build Ranger Spark plugin from source + +For spark 2.4, ranger 2.1 and scala 2.11 + +```bash +git clone https://github.com/izhangzhihao/spark-security.git +cd spark-security +mvn clean package -Dmaven.javadoc.skip=true -DskipTests -pl :submarine-spark-security -Pspark-2.4 -Pranger-2.1 +``` + +You can found the jar file in `spark-security/target/submarine-spark-security-0.7.0-SNAPSHOT.jar` + +## Setup testing env + +### Settings for Ranger + +Create `ranger-spark-security.xml` in `$SPARK_HOME/conf` and add the following configurations +for pointing to the right Apache Ranger admin server. + + +```xml + + + + + ranger.plugin.spark.policy.rest.url + https://ranger.com:port + + + + ranger.plugin.spark.policy.rest.ssl.config.file + /etc/spark/conf/ranger-spark-policymgr-ssl.xml + + + + ranger.plugin.spark.service.name + cm_hive + + + + ranger.plugin.spark.policy.cache.dir + /tmp + + + + ranger.plugin.spark.policy.pollIntervalMs + 5000 + + + + ranger.plugin.spark.policy.source.impl + org.apache.ranger.admin.client.RangerAdminRESTClient + + + +``` + +Create `ranger-spark-audit.xml` in `$SPARK_HOME/conf` and add the following configurations +to enable/disable auditing. + +```xml + + + xasecure.audit.is.enabled + true + + +``` + +Create `ranger-spark-policymgr-ssl.xml` in `$SPARK_HOME/conf`. + +```xml + + + xasecure.policymgr.clientssl.truststore + /home/bigdatauser/cm-auto-global_truststore.jks + + + xasecure.policymgr.clientssl.truststore.credential.file + jceks://file/home/bigdatauser/ranger-truststore.jceks + + + xasecure.policymgr.clientssl.keystore + /home/bigdatauser/cm-auto-host_keystore.jks + + + xasecure.policymgr.clientssl.keystore.credential.file + jceks://file/home/bigdatauser/ranger-keystore.jceks + + + xasecure.policymgr.clientssl.keystore.type + jks + + + xasecure.policymgr.clientssl.truststore.type + jks + + +``` + +### Generate `jceks` file + +```bash +java -cp "/opt/cloudera/parcels/CDH/lib/ranger-hive-plugin/install/lib/*" org.apache.ranger.credentialapi.buildks create sslKeyStore -value 'yourpassword' -provider jceks://file/home/bigdatauser/ranger-keystore.jceks +java -cp "/opt/cloudera/parcels/CDH/lib/ranger-hive-plugin/install/lib/*" org.apache.ranger.credentialapi.buildks create sslTrustStore -value 'yourpassword' -provider jceks://file/home/bigdatauser/ranger-truststore.jceks +``` + +### Config Ranger + +skipped + +### Testsing using `spark-shell` or `spark-sql` + +```bash +spark-shell --master yarn --deploy-mode client --conf spark.sql.extensions=org.apache.submarine.spark.security.api.RangerSparkSQLExtension --jars=submarine-spark-security-0.7.0-SNAPSHOT.jar --driver-class-path=slib/* +``` + +```bash +spark-sql --master yarn --deploy-mode client --conf spark.sql.extensions=org.apache.submarine.spark.security.api.RangerSparkSQLExtension --jars=submarine-spark-security-0.7.0-SNAPSHOT.jar --driver-class-path=slib/* +``` + +### Testing using `spark-submit` + +```bash +spark-submit --master yarn --deploy-mode client --conf spark.sql.extensions=org.apache.submarine.spark.security.api.RangerSparkSQLExtension --jars=/opt/cloudera/parcels/CDH-7.1.6-1.cdh7.1.6.p0.10506313/jars/hive-common-3.1.3000.7.1.6.0-297.jar,/opt/cloudera/parcels/CDH-7.1.6-1.cdh7.1.6.p0.10506313/jars/hive-metastore-3.1.3000.7.1.6.0-297.jar,submarine-spark-security-0.7.0-SNAPSHOT.jar --driver-class-path=slib/* --class com.github.sharpdata.sharpetl.spark.Entrypoint hdfs:///user/admin/demo_workflow/spark-1.0.0-SNAPSHOT.jar single-job --name=test --period=10 --env=qa --once --skip-running=false --property=hdfs:///user/admin/etl-conf/etl.properties +``` + +Succeful logs: + +```log +21/12/23 10:10:12 INFO config.RangerConfiguration: addResourceIfReadable(ranger-spark-audit.xml): resource file is file:/etc/spark/conf.cloudera.spark_on_yarn/ranger-spark-audit.xml +21/12/23 10:10:12 INFO config.RangerConfiguration: addResourceIfReadable(ranger-spark-security.xml): resource file is file:/etc/spark/conf.cloudera.spark_on_yarn/ranger-spark-security.xml +21/12/23 10:10:12 INFO config.RangerConfiguration: addResourceIfReadable(ranger-spark-policymgr-ssl.xml): resource file is file:/etc/spark/conf.cloudera.spark_on_yarn/ranger-spark-policymgr-ssl.xml +21/12/23 10:10:12 ERROR config.RangerConfiguration: addResourceIfReadable(ranger-spark-cm_hive-audit.xml): couldn't find resource file location +21/12/23 10:10:12 ERROR config.RangerConfiguration: addResourceIfReadable(ranger-spark-cm_hive-security.xml): couldn't find resource file location +21/12/23 10:10:12 ERROR config.RangerConfiguration: addResourceIfReadable(ranger-spark-cm_hive-policymgr-ssl.xml): couldn't find resource file location +21/12/23 10:10:12 INFO config.RangerPluginConfig: PolicyEngineOptions: { evaluatorType: auto, evaluateDelegateAdminOnly: false, disableContextEnrichers: false, disableCustomConditions: false, disableTagPolicyEvaluation: false, enableTagEnricherWithLocalRefresher: false, disableTrieLookupPrefilter: false, optimizeTrieForRetrieval: false, cacheAuditResult: false } +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AuditProviderFactory: creating.. +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AuditProviderFactory: initializing.. +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.truststore=/home/bigdatauser/cm-auto-global_truststore.jks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.policy.source.impl=org.apache.ranger.admin.client.RangerAdminRESTClient +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.service.name=cm_hive +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.policy.cache.dir=/tmp +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.keystore.type=jks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.policy.rest.ssl.config.file=/etc/spark/conf/ranger-spark-policymgr-ssl.xml +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.policy.rest.url=https://ranger.com:port/ +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.keystore.credential.file=jceks://file/home/bigdatauser/ranger-keystore.jceks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.audit.is.enabled=true +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.spark.policy.pollIntervalMs=5000 +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.keystore=/home/bigdatauser/cm-auto-host_keystore.jks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.truststore.type=jks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: AUDIT PROPERTY: xasecure.policymgr.clientssl.truststore.credential.file=jceks://file/home/bigdatauser/ranger-truststore.jceks +21/12/23 10:10:12 INFO provider.AuditProviderFactory: No v3 audit configuration found. Trying v2 audit configurations +21/12/23 10:10:12 INFO provider.AuditProviderFactory: RangerAsyncAuditCleanup: Waiting to audit cleanup start signal +21/12/23 10:10:12 INFO service.RangerBasePlugin: Created PolicyRefresher Thread(PolicyRefresher(serviceName=cm_hive)-125) +21/12/23 10:10:13 INFO util.RangerRolesProvider: RangerRolesProvider(serviceName=cm_hive): found updated version. lastKnownRoleVersion=-1; newVersion=9 +21/12/23 10:10:13 INFO util.PolicyRefresher: PolicyRefresher(serviceName=cm_hive): found updated version. lastKnownVersion=-1; newVersion=189 +21/12/23 10:10:13 INFO policyengine.RangerPolicyRepository: This policy engine contains 23 policy evaluators +21/12/23 10:10:13 INFO conditionevaluator.RangerScriptConditionEvaluator: ScriptEngine for engineName=[JavaScript] is successfully created +21/12/23 10:10:13 INFO policyengine.RangerPolicyRepository: This policy engine contains 1 policy evaluators +21/12/23 10:10:13 INFO contextenricher.RangerTagEnricher: Created RangerTagRefresher Thread(RangerTagRefresher(serviceName=cm_hive)-130) +21/12/23 10:10:14 INFO contextenricher.RangerTagEnricher: There are no tagged resources for service cm_hive +21/12/23 10:10:14 INFO contextenricher.RangerTagEnricher$RangerTagRefresher: RangerTagRefresher(serviceName=cm_hive).populateTags() - Updated tags-cache to new version of tags, lastKnownVersion=-1; newVersion=1 +21/12/23 10:10:14 INFO security.RangerSparkPlugin$: Policy cache directory successfully set to /tmp +``` \ No newline at end of file diff --git a/website/docs/single-job-guide.md b/website/docs/single-job-guide.md new file mode 100644 index 0000000..4576c8a --- /dev/null +++ b/website/docs/single-job-guide.md @@ -0,0 +1,64 @@ + +This guide provides a quick guide for commandline `single-job` + +## Introduction + +Different from `batch-job`, the command `single-job` only run a single job each time and should be noted as one of arguments when running a job. For example, when running a sample job which reads data from source-table and write them into target-table, the command is as follows: + +```bash +# run single job by `spark-submit` +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar single-job --name=source-table --period=1440 --datasource=sales.online_order --default-start-time="2021-09-30 00:00:00" --local --once + +# run single job locally +./gradlew :spark:run --args="single-job --name=source-table --period=1440 --datasource=sales.online_order --default-start-time='2021-09-30 00:00:00' --local --once" +``` + +## Parameters + +### common command params + +1. `--local` + +Declare that the job is running in standalone mode. If `--local` not provided, the job will try running with Hive support enabled. + +2. `--release-resource` + +The function is to automatically close spark session after job completion. + +3. `--skip-running` + +When there is a flash crash, use `--skip-running` to set last job status(in running state) as failed and start a new one. + +4. `--default-start` / `--default-start-time` + +Specify the default start time(eg, 20210101000000)/incremental id of this job. If the command is running for the first time, the default time would be the time set by the argument. If not, the argument would not work. + +5. `--once` + +It means that the job only run one time(for testing usage). + +6. `--env` + +Specify the default env path: local/test/dev/qa/prod running the job. + +7. `--property` + +Using specific property file, eg `--property=hdfs:///user/admin/etl-conf/etl.properties` + +8. `--override` + +Overriding config in properties file, eg `--override=etl.workflow.path=hdfs:///user/hive/sharp-etl,a=b,c=d` + +### single-job params + +1. `--name` + +Specify the name of the job to run and the name is required. + +2. `--period` + +Specify the period of job execution. + +3. `-h` / `--help` + +Take an example of parameters and its default value is false. diff --git a/website/docs/sql-scripts-guide.md b/website/docs/sql-scripts-guide.md new file mode 100644 index 0000000..7070e70 --- /dev/null +++ b/website/docs/sql-scripts-guide.md @@ -0,0 +1,100 @@ +--- +title: "SQL script quick start" +sidebar_position: 9 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## sql脚本的使用 + +ETL通过sql文件来定义,ETL的流程通过sql脚本中的step来划分,每个step都包含输入(`sourceConfig`)输出(`targetConfig`)的配置。source、target通过`dataSourceType`支持一系列数据源。同时还支持通过`transformer`等方式来ETL扩展自定义逻辑。 + +### 原生sql的结构如下: + +```sql +-- step=1 +-- source=temp +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +select from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy') as `YEAR`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'MM') as `MONTH`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'dd') as `DAY`; + +-- stepId=2 +-- source=hive +-- dbName=sql_demo_db +-- tableName=sql_demo +-- target=yellowbrick +-- dbName=sql_demo_yb +-- tableName=sql_demo +-- checkPoint=false +-- dateRangeInterval=0 +-- writeMode=overwrite +select * from sql_demo_db.sql_demo where year = '${YEAR}' and month = '${MONTH}' and day = '${DAY}'; +``` + +- step1中`DATA_RANGE_START`为执行etl job时传入的内置参数,除`DATA_RANGE_START`外还包括`DATA_RANGE_END`以及`job_id`等参数,这些参数可以在sql脚本中直接进行调用 +- step1将`DATA_RANGE_START`参数的年月日分别提取出来,并赋值给变量`YEAR`, `MONTH`, `DAY`,这三个变量可以在后面的step中以`'${变量名}'`的形式进行调用 +- step2则从`hive`中`sql_demo_db`的`sql_demo`表中读取出满足where子句的数据,并将其写入`yellowbrick`中的`sql_demo`表中 + +![image-sql-structure](/assets/images/sql-scripts.png) + + + + + + +各个参数的含义及使用: + +- `sourceConfig`: 源系统相关信息,读取数据 + - `dataSourceType`: 无默认值,支持`hive`, `temp`, `jdbc类型`, `batch_kafka`, `transformation`等 + - `hive`: 通过 SparkSession (需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作 + - `temp`: 直接通过 SparkSession (不需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作 + - `jdbc类数据库`: 源数据库类型,需要配置基本连接信息,格式为`${dbName}.${dataSourceType}.*`, + - `batch_kafka`: 支持从kafka topic读取数据,需要配置`kafka bootstrop server`信息,和`topics`参数, `schemaDDL`参数结合使用,前者表示kafka topic名称,后者为对应topic中的数据结构(`columnName columnType`) + - `transformation`: 支持自定义transformer接入多种数据源,一般为`sourceConfig`中参数,且需要和`className`, `methodName`, `transfermerType`结合使用,不同transformer有自定义参数,需要结合使用 + - `dbName`: 无默认值,源数据库库名 + - `tableName`:无默认值,源表表名 + + + +- `targetConfig`: 目标数据库相关信息,写出数据 + + - `dataSourceType`: 无默认值,支持`hive`,` jdbc类型`, `variables`, `console`, `temp`,`do_nothing`等 + + - `hive`: 该 step 的计算结果将写入到目标 hive 表,默认采用动态分区的方式。 + - `Jdbc`类数据库: 目标数据库类型,需要配置基本连接信息,格式为`${dbName}.${dataSourceType}.*`, + + - `variables`:将执行结果为只有一行(可以为多列)数据的 DataFrame中每个字段都设置为全局变量,可以在后续 step 的 sql 中直接引用 + + - `console`: 将该step中的执行结果进行输出 + - `temp`: 该 step 的计算结果将注册为当前 SparkSession 生命周期内可用的内存临时表,可在后续 `targetConfig/dataSourceConfig` 类型为 `hive` 或 `temp` 的 step 中直接在 sql 中调用 + - `do_nothing`: 该step将不对读取出的数据做任何操作,通常用于执行`delete`,`update`等无返回值的sql语句 + + + +- `WriteMode`:数据写入方式,指从源系统向目标系统写入时的方式 + + - `upsert`: update+insert,需要和`primaryKey`参数结合使用 + - `append`: 追加写入 + - `overwrite`: 覆盖写入 + +- `incrementalType`: 日志驱动所依赖的增量类型,默认为`timeBased`,即`step_log`和`job_log`中`dataRangeStart`和`dataRageEnd`为时间 + + - `incremental_kafka_offset`: 指从`kafka topic`中读取数据,此时在表中记录和维护的是`kafka topic`内的`offset`值 + - `incremental_auto_inc_id`: 并非`timebased`,记录和维护一个`int`值 + + + +PS: +- 由于不同类型的数据库在sql语法上会有所区别,故每个step中的sql语句语法是取决于`sourceConfig`中的数据库类 + + + + + + + + + diff --git a/website/docs/sql-syntax.md b/website/docs/sql-syntax.md new file mode 100644 index 0000000..ebf8a98 --- /dev/null +++ b/website/docs/sql-syntax.md @@ -0,0 +1,33 @@ +--- +title: "SQL syntax" +sidebar_position: 9 +toc: true +last_modified_at: 2022-06-14T09:25:57+08:00 +--- + + +## About + +Sharp-ETL is not a new sql language, but re-using existing,familiar SQL(like PostgresSQL, MSSQL, and any other sql you want!). + + +## Hello World + +Let's start by creating a very simple workflow to do the "hello world" using Spark temp table: + +```sql +-- workflow=hello_world +-- loadType=incremental +-- logDrivenType=timewindow + +-- step=print SUCCESS to console +-- source=temp +-- target=console + +SELECT 'SUCCESS' AS `RESULT`; +``` + +## Parameters + +Let's look at a slightly more complex workflow spec with parameters. + diff --git a/website/docs/transformer-guide.md b/website/docs/transformer-guide.md new file mode 100644 index 0000000..98c14c7 --- /dev/null +++ b/website/docs/transformer-guide.md @@ -0,0 +1,282 @@ +--- +title: "transformer guide" +sidebar_position: 10 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## transformer的定义和使用 + +`transformer`是用于满足用户对于特定场景下通过代码逻辑实现的扩展诉求,通过反射加载jar或者文本文件中的scala代码。`transformer`允许在job step中执行一段代码块,通过java class path或者文件名来区分不同的`transformer`,不同的`transformer`会有不同的自定义参数,如: + +```sql +-- step=1 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.HttpTransformer +-- methodName=transform +-- transformerType=object +-- url=https:xxxx +-- connectionName=connection_demo +-- fieldName=centerIds +-- jsonPath=$.centers[*].id +-- splitBy=, +-- target=variables +-- checkPoint=false +-- dateRangeInterval=0 +``` + +以HttpTransformer为例,该transformer是将从api获得的json类型数据进行解析和落表,还支持url中的动态传参,可以采用variables定义具体参数并调用。在所有使用transformer的step中,`dataSourceType=transformation, methodName=transform, transformerType=object`,className则为定义transformer的类名,除此之外的`url, connectionName, fieldName, jsonPath, splitBy`则为httpTransformer的自定义参数。 + + + +### 自定义transformer的使用 + +- `JdbcResultSetTransformer`: 该transformer主要用于对source数据库中的表执行`insert`,`update`,`delete`等无返回值的操作 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.JdbcResultSetTransformer + -- dbType=yellowbrick + -- dbName=bigdata + -- methodName=transform + -- target=do_nothing + -- checkPoint=false + -- dateRangeInterval=0 + delete from demo_table where to_char("HIST_DT", 'yyyyMMdd') = '${TODAY}'; + ``` + + - `dataSourceType`, `className`和`methodName`与前文保持一致 + - `dbType`和`dbName`用于构建jdbc连接参数,`dbType`为`jdbc transformer`的自定义参数 + - 该step表示从`demo_table`中删除当天的数据 + +- `DDLTransformer`: 该transformer主要用于通过建表语句在`hive`或者`yellobrick`建表,需要传入建表语句的路径 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.DDLTransformer + -- methodName=transform + -- transformerType=object + -- dbName=bigdata + -- dbType=yellowbrick + -- ddlPath=/demo_ddl + -- target=do_nothing + ``` + + - `dbType`&`dbName`: 用于构建jdbc连接,目前只支持通过ddl在hive和yb建表 + - `ddlPath`: 默认值为`/user/hive/sharp-etl/ddl`,为存放ddl的具体路径 + +- `JobDependencyCheckTransformer`: 该transformer主要用于对job运行时上游依赖job是否运行结束的检测,需要输入`decencies`和`jobName`,检查该jobName是否有依赖job未运行完成 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.JobDependencyCheckTransformer + -- methodName=transform + -- transformerType=object + -- dependencies=job1,job2,job3 + -- jobName=test_dependency_demo + -- target=do_nothing + ``` + + - `dependencies`: 上游依赖job的名称,`jobName`即为需要检测的job名 + +- `HttpTransformer`: 该transformer是将从api获得的json类型数据进行解析和落表,还支持url中的动态传参,可以采用`variables`定义具体参数并调用 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.HttpTransformer + -- methodName=transform + -- transformerType=object + -- url=https:xxxx + -- connectionName=connection_demo + -- fieldName=centerIds + -- jsonPath=$.centers[*].id + -- splitBy=, + -- target=variables + -- checkPoint=false + -- dateRangeInterval=0 + ``` + + - `url`: 具体的API连接,其中可以包含动态传入的参数,与`variables`结合使用,如`https://${DAY}` + - `connectionName`: 部分url可能需要代理访问,该参数配置访问的代理参数,需要进行配置,格式为`http.{connectionName}.proxy.host`, `http.{connectionName}.proxy.port`, `http.{connectionName}.header.Authorization`,若api无需代理或鉴权则无需配置 + - `fieldName`: api返回的json字符串一级名称,和`splitBy`参数一起对json字符串进行解析 + - `splitBy`: json字符串中分隔符 + +- `FileCleanTransformer`: 该transformer将删除目标路径下固定格式的文件,需要输入`filePath`和`fileNamePattern`,后者支持正则表达式 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.FileCleanTransformer + -- methodName=transform + -- transformerType=object + -- filePath=test_fileClean + -- fileNamePattern=((\w*_test_fileClean.txt)) + -- target=do_nothing + ``` + + - `filePath`: 文件存储路径 + - `fileNamePattern`: 文件名,也可传入正则表达式 + +- `DropExternalTableTransformer`: 该transformer将删除hive和hdfs中以`tableNamePrefix`开头的在`databaseName`数据库中相应`partition`的表和文件, `partition`支持动态传参,可以与`variables`结合使用 + + ```sql + -- stepId=2 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.DropExternalTableTransformer + -- methodName=transform + -- transformerType=object + -- databaseName=testDB + -- tableNamePrefix=pre_ods__ + -- partition=year=${YEAR},month=${MONTH},day=${7_DAYS_BEFORE} + -- target=do_nothing + ``` + + - `partition`: 需要删除的分区,会删除`day=${7_DAYS_BEFORE}`即7天前的分区文件 + - `tableNamePrefix`: 需要删除的表前缀 + +- `DailyJobsSummaryReportTransformer`: 该transformer主要用于发送附件为`dailyReportSummary`的csv邮件,包含当日所有的job,粒度为step,对于失败job,还会汇总具体的失败信息和具体step,主要依赖于`step_log`和`job_log`两张表,需要在配置文件中配置`projectName`和`jobName`(如果不配置,则`dailyReport`的csv文件中没有具体的`projectName`) + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.DailyJobsSummaryReportTransformer + -- methodName=transform + -- transformerType=object + -- datasource=hive,yellowbrick + -- target=do_nothing + -- checkPoint=false + -- dateRangeInterval=0 + ``` + + - `datasource`: 写入的数据库类型,用于汇总具体的`errorMessage` + +- `G2ApiTransformer`: 该transformer主要解析api来的json数据并将其存入`kafka topic`,随后写入到hdfs再进行后续dataflow + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.G2ApiTransformer + -- methodName=launch + -- transformerType=object + -- url=https://xxxx + -- checkPoint=/checkpoint + -- totalOpenCount=${TOTAL_OPEN_COUNT} + -- totalClosedCount=${TOTAL_CLOSED_COUNT} + -- openDDL=`demo1` STRING, `demo2` STRING + -- openSelectExpr=demo1, demo2 + -- closedDDL=`demo1` STRING, `demo2` STRING, `demotimestamp` STRING + -- closedSelectExpr=demo1, demo2, demotimestamp + -- closedTimestampColumns=demotimestamp + -- openHdfsDest=hdfs:///open_ratings_demo.csv + -- closedHdfsDest=hdfs:///closed_ratings_demo.csv + -- dbName=bigdata + -- openTableName=quantumdbuser.open_ratings_demo + -- closedTableName=quantumdbuser.closed_ratings_demo + -- target=do_nothing + -- checkPoint=false + -- dateRangeInterval=0 + ``` + + - 该段step大部分参数均为定制化参数,主要适用于本项目的业务场景,也是唯一的流失数据处理场景 + - `url`: api的具体信息 + - `openDDL`&`closedDDL`: 具体的数据结构信息,可以自定义参数名称,open和closed为业务场景需要 + - `openSelectExpr`&`closedSelectExpr`: 落表时的具体字段名,用于拼接sql写入数据 + - `openHdfsDest`&`closedHdfsDest`: 写入到hdfs的文件路径及文件名 + - `openTableName`&`closedTableName`: 在yb落表时表名 + +- `CheckAllConnectorStatusTransformer`: 该transformer集成了`kafka restapi`,通过调用接口返回各个`connector`的运行状态,若有`connector`状态为`failed`或`pause`,则会及时预警 + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.CheckAllConnectorStatusTransformer + -- methodName=transform + -- transformerType=object + -- uri=https://xxx.com:28085 + -- target=do_nothing + ``` + + - `uri`: 为具体的`kafka restapi`端口信息,会在代码中拼接真正需要访问的uri信息 + +- `CheckConnectorStatusTransformer`: 该transformer与`CheckAllConnectorStatusTransformer`一致,均用做monitor,需要指定具体`connector`的名字,与`connectorName`参数联合使用,可以一次输入一个或多个`connector`,通常用在kafka下游任务中的step1,即首先判断`connector`是否正常工作,若`connector`报错则下游任务不会执行,需要在配置文件中配置`kafka.restapi`参数,用于构建具体api + + ```sql + -- step=1 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.CheckConnectorStatusTransformer + -- methodName=transform + -- transformerType=object + -- connectorName=connector1, connector2 + -- target=do_nothing + ``` + + - `connectorName`: 需要monitor的`connector`名字,通常为接入表时的`source connector`和`sink connector` + +- `EnsureSinkConnectorFinished`: 该transformer用于确认`sink connector`即`consumer`端是否消费完数据,是否将数据全部写入hive/hdfs,一般接在`CheckConnectorStatusTransformer`后,为step2,若`consumer`还未写入完成,会等待5分钟,若5分钟后还未完成,则下游任务不会执行 + + ```sql + -- stepId=2 + -- source=transformation + -- className=com.github.sharpdata.sharpetl.spark.transformation.EnsureSinkConnectorFinished + -- methodName=transform + -- transformerType=object + -- group=consumer-group1 + -- kafkaTopic=topic1 + -- target=do_nothing + ``` + + - `group`: 为`kafka consumer group`名称,通常一个`group`对应一个`topic`,若一个`consumer group`包含多个`topic`,需要指定`kafkaTopic`名称 + - `kafkaTopic`: `topic`名称,若不指定,则默认为检查`group`里全部`topic`中的`message`是否全被消费 + + + +### 如何自定义transformer + +可以在`com.github.sharpdata.sharpetl.spark.transformation`包中定制`transformer`,通过`override transform`方法实现具体逻辑,而`transformer`的调用则主要通过反射进行,只需在sql脚本中指定具体的`transformer`名称和相应参数即可。 + +### 加载外部transformer + +框架还支持动态加载scala脚本文件,一个示例如下: + +```scala +import com.fasterxml.jackson.annotation.JsonInclude.Include +import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper} +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper +import com.jayway.jsonpath.{JsonPath, PathNotFoundException} +import com.github.sharpdata.sharpetl.core.util.ETLLogger +import com.github.sharpdata.sharpetl.spark.common.ETLSparkSession +import com.github.sharpdata.sharpetl.spark.transformation._ +import com.github.sharpdata.sharpetl.spark.utils.HttpStatusUtils +import net.minidev.json.JSONArray +import org.apache.http.impl.client._ +import org.apache.http.util.EntityUtils +import org.apache.spark.sql.DataFrame +import org.apache.spark.sql.functions._ +import org.apache.spark.sql.types.{StringType, StructField, StructType} + +object LoopHttpTransformer extends Transformer { + + val mapper = new ObjectMapper with ScalaObjectMapper + mapper.setSerializationInclusion(Include.NON_ABSENT) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.registerModule(DefaultScalaModule) + + override def transform(args: scala.collection.mutable.Map[String, String]): DataFrame = { + ??? + } +} +``` + +编写scala脚本实现的transformer,需要注意几个要点: + +* 文件开头不可带有package信息,在sql中调用时,会根据package.fileName中的fileName找到scala脚本 +* sql在引用scala脚本时需要设置`transformerType=dynamic_object`,除此之外使用方式与jar中的transformer相同 +* 部分package需使用全名例如 `scala.collection.mutable.Map[String, String]`, 而不是 `mutable.Map[String, String]` +* 如果你遇到了类似于`illegal cyclic reference involving object InterfaceAudience`的错误,你需要spark-submit option `--conf "spark.executor.userClassPathFirst=true" --conf "spark.driver.userClassPathFirst=true"` +* 如果你遇到了错误`object x is not a member of package x`,你需要使用全引用例如 `scala.collection.mutable.Map[String, String]` + diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 0000000..5022c5c --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,121 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Sharp ETL website', + tagline: 'Write ETL using your favorite SQL dialects', + url: 'https://sharpdata.github.io/SharpETL/', + baseUrl: '/', + onBrokenLinks: 'ignore', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.ico', + + organizationName: 'SharpData', + projectName: 'SharpETL', + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve('./sidebars.js'), + editUrl: + 'https://github.com/SharpData/SharpETL/tree/pages/website', + }, + blog: { + showReadingTime: true, + editUrl: + 'https://github.com/SharpData/SharpETL/tree/pages/website', + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: 'Sharp ETL', + logo: { + alt: 'Sharp ETL Logo', + src: 'img/logo.svg', + }, + items: [ + { + type: 'doc', + docId: 'quick-start-guide', + position: 'left', + label: 'Docs', + }, + { to: 'blog', label: 'Blog', position: 'left' }, + // { to: 'concept', label: 'Concept', position: 'left' }, + { + href: 'https://github.com/SharpData/SharpETL', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Learn', + items: [ + { + label: 'Style Guide', + to: 'docs/', + }, + { + label: 'Documents', + to: 'docs/', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: 'blog', + }, + { + label: 'GitHub', + href: 'https://github.com/SharpData/SharpETL', + }, + ], + }, + ], + logo: { + alt: 'Sharp ETL Logo', + src: '/img/meta_opensource_logo_negative.svg', + href: 'https://github.com/SharpData/SharpETL', + }, + copyright: `Copyright © ${new Date().getFullYear()} Sharp Data, Built with Docusaurus.`, + }, + prism: { + theme: require('prism-react-renderer/themes/dracula'), + additionalLanguages: ['java', 'scala', 'sql'], + }, + announcementBar: { + id: 'announcementBar', + content: + '⭐️ If you like Sharp ETL, give it a star on GitHub! ⭐', + }, + }), +}; + +module.exports = config; diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..beccf8e --- /dev/null +++ b/website/package.json @@ -0,0 +1,57 @@ +{ + "name": "sharp-etl-site", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "ci": "yarn lint && yarn format:diff", + "lint": "eslint --cache \"**/*.js\" && stylelint \"**/*.css\"", + "format": "prettier --config .prettierrc --write \"**/*.{js,jsx,ts,tsx,md,mdx}\"", + "format:diff": "prettier --config .prettierrc --list-different \"**/*.{js,jsx,ts,tsx,md,mdx}\"" + }, + "dependencies": { + "@docusaurus/core": "2.0.0-rc.1", + "@docusaurus/preset-classic": "2.0.0-rc.1", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "prism-react-renderer": "^1.2.1" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.18.2", + "eslint": "^8.19.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "prettier": "^2.7.1", + "stylelint": "^14.9.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=16.14" + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 0000000..39c21f5 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,65 @@ + + +module.exports = { + // concept: [{ type: 'autogenerated', dirName: '.' }], + docs: [ + { + type: 'category', + label: 'Quick Start', + collapsed: false, + items: [ + 'quick-start-guide', + 'docker-setup', + 'end-to-end-showcase', + 'end-to-end-showcase-postgres' + ], + }, { + type: 'category', + label: 'Concept', + collapsed: false, + items: [ + 'log-driven', + ], + }, { + type: 'category', + label: 'Configuration', + collapsed: false, + items: [ + 'encrypt-in-properties-file', + 'sql-scripts-guide', + 'datasource', + ], + }, { + type: 'category', + label: 'Excel Template', + collapsed: false, + items: [ + 'excel-template-ods', + 'excel-template-dwd', + ], + }, { + type: 'category', + label: 'Command', + collapsed: false, + items: [ + 'single-job-guide', + 'batch-job-guide', + ], + }, { + type: 'category', + label: 'Extension', + collapsed: false, + items: [ + 'transformer-guide', + ], + }, { + type: 'category', + label: 'Security', + collapsed: false, + items: [ + 'ranger-integrate', + ], + } + ], +}; + diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 0000000..2396bcc --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,37 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 0000000..4272434 --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,100 @@ + +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import styles from './styles.module.css'; + +const features = [ + { + title: 'Easy to Use', + imageUrl: 'img/undraw_docusaurus_mountain.svg', + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + imageUrl: 'img/undraw_docusaurus_tree.svg', + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by SQL', + imageUrl: 'img/undraw_docusaurus_react.svg', + description: ( + <> + Write ETL using your favorite SQL dialects, no custom SQL syntax at all. + + ), + }, +]; + +function Feature({imageUrl, title, description}) { + const imgUrl = useBaseUrl(imageUrl); + return ( +
+ {imgUrl && ( +
+ {title} +
+ )} +

{title}

+

{description}

+
+ ); +} + +export default function Home() { + const context = useDocusaurusContext(); + const {siteConfig = {}} = context; + return ( + +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Get Started + +
+
+
+
+ {features && features.length > 0 && ( +
+
+
+ {features.map(({title, imageUrl, description}) => ( + + ))} +
+
+
+ )} +
+
+ ); +} diff --git a/website/src/pages/markdown-page.md b/website/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/website/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/website/src/pages/styles.module.css b/website/src/pages/styles.module.css new file mode 100644 index 0000000..0d48549 --- /dev/null +++ b/website/src/pages/styles.module.css @@ -0,0 +1,36 @@ + +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureImage { + height: 200px; + width: 200px; +} diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/static/assets/images/github.png b/website/static/assets/images/github.png new file mode 100644 index 0000000000000000000000000000000000000000..db85527f64bbb9c5d3399ef4d3f6664825d04ec8 GIT binary patch literal 1104 zcmV-W1h4yvP)yb&i!+K=iYnXeFu2kjEWKad_JoX;;EFffthOofSD6S6epsWTU%So{|X)$7KDxX2{YT68O)5=U~QzBd5ws^4u`|P{wMI@;Gq5L>S_+aXUr^g5Hqkgq?Ga-RaK{V zc6L%lgZumY+llB0W^OPEejivHaU%LO5{c}a#TRByzu(_3g!mCa!+ksQfPEmP-0tq~ zZhIr}@bGYrl=6E3?=myoZa17xCsb8^kfiC|Znx&D6hge{=;(0dYpwZ?>+9=z03T|B zCMPG+-rkObg99usF5>+B9QF0}sHms_0Ho7t#N%<;?RHE|OrWi;4LdtKn3|f>Le`g* zlzau?nVxg!jE9DXK2j9rl~zcKqF{M>8P(O*53W{kr>Ca~1Ogx;eZh4_qtREI=FV0t ziZY$=OQi}HW2#v1sw&?-==1q< zN1FqemzO^UP@}ywGe$>8%>q1VHk%D&V`I5b?zPpV)9Ee)n27FtI#NpX^z;-B)y(Vl z=7S-G$T9Tb_slYXtku@m8ogv(p%gf9B0)r4D=g?R1S)K^-c>K}e zqoX4OSW1~RfQjgLy@-eq3WXjG-q_eMfC2nr0B16pD1eM!wYj;8?d|QNq2X}YkTenf z1K?-v-J(65oSev}rX~-7C(I0+&4z3?i*PuM>+5SYHa4QHtn6N3CX>O^(h}z8<_vSp z{9QB}UCkw;pY;3voy`2wVzJQ7%nVYg6z1pWaeI3UB7(=`K_C!7UtiyyprKF*tE;Qn z-`|I-s%F1PmQr>WyfW9;)?xs@RTKrYv$JryTo@l82Qx!TiM_o&w6wGsR^#z_u)Dhp zDW&O75Yclz6fpTaG4nJ4pQ0$Pg@pyo&d$Q=bmH*v5Dtd}PN&llxUQ}am6er9r_*N8 zKW}euzs&br@*T&=$Cu5`%^_wUOC%ESTwGkBx3?EwuNN+t3s$QkR{+4u$_ldCZ2ltt zR#o-mSS)s8NXRq_a;?t`DWzLGH@n@A<>h5l{m94&5{ZQVT>m1X!AK+8v2F!)Re(FI`1EwgS-lsI!}!o8KG`$4^A`#tr@3Xa52| W6C3B@Dra8+0000 + +
Success
Success
Success
Success
Success
Success
Success
Success
Success
Success
理想情况
理想情况
Success
Success
Success
Success
Success
Success
Success
Success
现实情况
现实情况
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23

Success
(2022 0202)

Success...
补数据
补数据
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23
Text is not SVG - cannot display
\ No newline at end of file diff --git a/website/static/assets/images/logdriven-2.svg b/website/static/assets/images/logdriven-2.svg new file mode 100644 index 0000000..2ec2566 --- /dev/null +++ b/website/static/assets/images/logdriven-2.svg @@ -0,0 +1,3 @@ + + +
Success
Success
Success
Success
Success
Success
日志驱动
(如果重试可成功)
日志驱动 (如果重试可成功)
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23

Success
(2022 0202)

Success...

Success
(2022 0203)

Success...
Success
Success
日志驱动
(如果重试不成功)
日志驱动 (如果重试不成功)
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23
2022 02 02
2022 02 02
2022 02 02
2022 02 02
2022 02 02
2022 02 02
2022 02 02
2022 02 02
Success
Success
日志驱动
(人工介入修复后)
日志驱动 (人工介入修复后)
2022 02 01
2022 02 01
2022 02 02
2022 02 02
2022 02 03
2022 02 03
2022 02 22
2022 02 22
2022 02 23
2022 02 23
2022 02 02
2022 02 02
2022 02 02
2022 02 02
Success
Success

Success
(2022 02 02)

Success...

Success
(2022 02 22)

Success...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/website/static/assets/images/logdriven-3.svg b/website/static/assets/images/logdriven-3.svg new file mode 100644 index 0000000..ce51fe2 --- /dev/null +++ b/website/static/assets/images/logdriven-3.svg @@ -0,0 +1,3 @@ + + +
Job 开始
Job 开始
确定dataRangeStart
确定dataRangeStart
有曾经成功的任务
有曾经成功的任务
取--default-start
取--default-start
取最大dataRangeEnd
取最大dataRangeEnd
dataRangeStart
dataRangeStart
计算待执行任务队列(以time-based为例)
计算待执行任务队列(以time-based为例)
schedule的次数 = (‘当前时间’ - `dataRangeStart`) / `period` (取整)
schedule的次数 = (‘当前时间’ - `dataRangeStart`) / `p...
> 0
> 0
执行任务
执行任务
写入job_log, 任务状态运行中
写入job_log, 任务状态运行中
根据SQL的step依次执行
根据SQL的step依次执行
更新step_log
更新step_log
更新job_log状态,成功或失败
更新job_log状态,成功或失败
执行待执行队列中的下一个任务
执行待执行队列中的下一个任务
Text is not SVG - cannot display
\ No newline at end of file diff --git a/website/static/assets/images/logdriven.png b/website/static/assets/images/logdriven.png new file mode 100644 index 0000000000000000000000000000000000000000..bb247b444b1ac72af5047685a1b1af53e8b23da1 GIT binary patch literal 25362 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 literal 0 HcmV?d00001 diff --git a/website/static/assets/images/roadmap.png b/website/static/assets/images/roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..b46bc49398038032659a69ccc6f325ab22f69486 GIT binary patch literal 146918 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

Eg+N#HPrieO{Xqto<8kIMy@sb97$&Axa_Q| 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

Eg+N#HPrieO{Xqto<8kIMy@sb97$&Axa_Q| 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

MY`}U}+p#iMc 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 z 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 F{||4IS=s;q diff --git a/website/static/assets/images/workflowarrow.png b/website/static/assets/images/workflowarrow.png deleted file mode 100644 index 91a3e816183d8ec1c986cd042623e34845bef599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3595 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 Date: Fri, 12 Aug 2022 16:14:42 +0800 Subject: [PATCH 27/34] Add algolia search --- website/docusaurus.config.js | 37 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 558e15c..1c1630a 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,11 +1,3 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion @@ -18,7 +10,6 @@ const config = { onBrokenLinks: 'ignore', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', - //themes: ['@docusaurus/theme-search-algolia'], organizationName: 'SharpData', projectName: 'SharpETL', @@ -118,26 +109,26 @@ const config = { content: '⭐️ If you like Sharp ETL, give it a star on GitHub! ⭐', }, - // algolia: { - // // The application ID provided by Algolia - // appId: 'YOUR_APP_ID', + algolia: { + // The application ID provided by Algolia + appId: 'LC78S7LHSQ', - // // Public API key: it is safe to commit it - // apiKey: 'YOUR_SEARCH_API_KEY', + // Public API key: it is safe to commit it + apiKey: '0ebe9ea80f7f9aac056d184401394f79', - // indexName: 'YOUR_INDEX_NAME', + indexName: 'sharpetl', - // // Optional: see doc section below - // contextualSearch: true, + // Optional: see doc section below + contextualSearch: true, - // // Optional: Algolia search parameters - // searchParameters: {}, + // Optional: Algolia search parameters + searchParameters: {}, - // // Optional: path for search page that enabled by default (`false` to disable it) - // searchPagePath: 'search', + // Optional: path for search page that enabled by default (`false` to disable it) + searchPagePath: 'search', - // //... other Algolia params - // }, + //... other Algolia params + }, }, }; From ba4944135a987e24b281e88e4042db06d13be9c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 12 Aug 2022 17:36:27 +0800 Subject: [PATCH 28/34] Add new doc: properties-file-config --- ...p-etl-introduce-05-workflow-in-a-glance.md | 8 +- website/docs/properties-file-config.md | 125 ++++++++++++++++++ website/sidebars.js | 1 + 3 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 website/docs/properties-file-config.md diff --git a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md index ddfde82..ec7ad78 100644 --- a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md +++ b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md @@ -76,7 +76,7 @@ select * from temp_table; ## 数据源 -每个step都有source和target两个配置,具体配置使用可以参考 [datasource](/docs/datasource) 这一节来使用。同一个workflow里面datasource之间可以任意组合使用,没有严格限制,用户也可以很方便的自定义新的数据源。 +每个step都有source和target两个配置,具体配置使用可以参考 [Datasource](/docs/datasource) 这一节来使用。同一个workflow里面datasource之间可以任意组合使用,没有严格限制,用户也可以很方便的自定义新的数据源。 ## 扩展 @@ -125,4 +125,8 @@ Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-gui ### 自定义数据源 -自定义数据源的相关详细使用可以参考 [Transformer](/docs/custom-datasource-guide) \ No newline at end of file +自定义数据源的相关详细使用可以参考 [Transformer](/docs/custom-datasource-guide) + +### 配置项 + +Sharp ETL配置项、Spark conf配置、系统连接信息配置等可以参考 [Properties file config](/docs/properties-file-config) \ No newline at end of file diff --git a/website/docs/properties-file-config.md b/website/docs/properties-file-config.md new file mode 100644 index 0000000..244f612 --- /dev/null +++ b/website/docs/properties-file-config.md @@ -0,0 +1,125 @@ +--- +title: "Properties file config" +sidebar_position: 8 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## Sharp ETL config + +### `etl.workflow.path` + +从哪里查找workflow文件,默认从classpath中的`tasks`目录查找,可以指定外部路径,目前仅支持HDFS路径。 + +classpath例子: + +```properties +etl.workflow.path=tasks +``` + +HDFS例子: + +```properties +etl.workflow.path=HDFS:///etl/workflows +``` + +## Spark config + +在properties中内置的默认配置如下: + +```properties +spark.default.spark.sql.adaptive.enabled=true +spark.default.spark.sql.adaptive.logLevel=info +spark.default.spark.sql.adaptive.advisoryPartitionSizeInBytes=128m +spark.default.spark.sql.adaptive.coalescePartitions.enabled=true +spark.default.spark.sql.adaptive.coalescePartitions.minPartitionNum=1 +spark.default.spark.sql.adaptive.fetchShuffleBlocksInBatch=true +spark.default.spark.sql.adaptive.localShuffleReader.enabled=true +spark.default.spark.sql.adaptive.skewJoin.enabled=true +spark.default.spark.sql.adaptive.skewJoin.skewedPartitionFactor=5 +spark.default.spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes=400m +spark.default.spark.sql.adaptive.nonEmptyPartitionRatioForBroadcastJoin=0.2 +spark.default.spark.sql.autoBroadcastJoinThreshold=-1 +spark.default.spark.sql.adaptive.shuffle.targetPostShuffleInputSize=134217728 +spark.default.hive.exec.dynamic.partition=true +spark.default.hive.exec.dynamic.partition.mode=nonstrict +spark.default.spark.sql.sources.partitionOverwriteMode=dynamic +spark.default.spark.serializer=org.apache.spark.serializer.KryoSerializer +spark.default.spark.kryoserializer.buffer.max=128m +spark.default.spark.sql.crossJoin.enabled=true +spark.default.spark.driver.cores=1 +spark.default.spark.driver.memory=1g +spark.default.spark.driver.memoryOverhead=1g +spark.default.spark.driver.maxResultSize=0 +spark.default.spark.executor.cores=2 +spark.default.spark.executor.memory=4g +spark.default.spark.executor.memoryOverhead=2g +spark.default.spark.dynamicAllocation.enabled=true +spark.default.spark.shuffle.service.enabled=true +spark.default.spark.dynamicAllocation.minExecutors=1 +spark.default.spark.dynamicAllocation.maxExecutors=4 +spark.default.spark.streaming.stopGracefullOnShutdown=true +spark.default.spark.streaming.backpressure.enable=true +spark.default.spark.streaming.kafka.maxRatePerPartition=100000 +``` + +:::tip +内置的spark config对所有任务起效,可以通过`spark.your workflow name.spark.config=xxx`的方式来覆盖全局默认配置。 +::: + +:::tip +在workflow内可以针对某一个step配置spark config: + +```sql +-- step=set config in conf +-- source=temp +-- target=temp +-- tableName=do_nothing_table +-- conf +-- spark.sql.shuffle.partitions=1 +SELECT 'result'; +``` + +或者直接使用spark sql: + +```sql +-- step=3 +-- source=temp +-- target=temp +-- tableName=do_nothing_table +SET spark.sql.hive.version=0.12.1; +``` + +::: + +## Connection + +针对不同的系统可以配置对应的connection,配置方式请参考对应的[Datasource](/docs/datasource)中的配置示例来使用。 +配置结构为: `connection name.source/target type.config=value` + + +## Using external properties file + +可以使用外部properties文件,当需要在不同环境运行任务,且可能properties配置中可能含有敏感信息时推荐使用。在启动任务时加入参数: + +``` +--property=hdfs:///etl/conf/prod.properties +``` + + +## Override properties in command-line + +针对需要调试或临时修改的任务,可以在运行任务时选择覆盖properties文件中的内容。在启动任务时加入参数,多个参数请使用逗号分隔: + +``` +--override=mysql.password=XXXX,foo=bar +``` + + +## Properties config priority + +在多个地方配置properties之后的优先级为(以spark conf为例): + + +Workflow SQL `SET` syntax > Workflow `conf` > Command-line override > properties override > class path `application.properties` file + diff --git a/website/sidebars.js b/website/sidebars.js index 11c29a4..eb4bfe4 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -19,6 +19,7 @@ module.exports = { label: 'Configuration', collapsed: false, items: [ + 'properties-file-config', 'encrypt-in-properties-file', 'datasource', ], From 53dfb33d18f527fb9e706d00844eee231a84b6f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 12 Aug 2022 17:38:09 +0800 Subject: [PATCH 29/34] Fix typo --- website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md index ec7ad78..46b21f6 100644 --- a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md +++ b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md @@ -121,12 +121,12 @@ select test_udf('input') as `result`; ### Transformer -Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-guide) +Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-guide)。 ### 自定义数据源 -自定义数据源的相关详细使用可以参考 [Transformer](/docs/custom-datasource-guide) +自定义数据源的相关详细使用可以参考 [自定义数据源](/docs/custom-datasource-guide)。 ### 配置项 -Sharp ETL配置项、Spark conf配置、系统连接信息配置等可以参考 [Properties file config](/docs/properties-file-config) \ No newline at end of file +Sharp ETL配置项、Spark conf配置、系统连接信息配置等可以参考 [Properties file config](/docs/properties-file-config)。 \ No newline at end of file From 3496cbc8cdc9c7eaae3e264bb9675ead8e56be3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Mon, 15 Aug 2022 14:27:12 +0800 Subject: [PATCH 30/34] Add GA --- website/docusaurus.config.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 1c1630a..b1b6756 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -32,6 +32,9 @@ const config = { theme: { customCss: require.resolve('./src/css/custom.css'), }, + googleAnalytics: { + trackingID: 'G-59696D1TKP' + }, }), ], ], From f66b5e705a1571ee79acf7a8d2219ead06bc9c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Mon, 15 Aug 2022 16:05:50 +0800 Subject: [PATCH 31/34] Update why-we-need-sharp-etl --- .../blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md | 7 +++++-- website/docusaurus.config.js | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md index 0c58e4f..4616f70 100644 --- a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md +++ b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md @@ -28,7 +28,7 @@ pros: cons: * 但是代码就是代码,大多数代码都是命令式逻辑,并不容易维护和理解。 - +* 缺乏足够的元数据支撑,不知道这个任务访问了哪几张表。当要修改表结构的时候,可能导致意料之外的任务失败。 * 代码形式编写ETL会使得任务开发流程更加重量级,因为一旦修改实现逻辑,就需要重新部署jar包。考虑到安全因素,在一些企业内部的多租户平台上,上传新的jar包是需要审核的,整个流程就会在审核这里显著慢了下来。即使不需要审核,也需要手动部署到环境上,也有可能因为增加了新的逻辑影响了其他正常运行的任务。 2. **托拉拽** @@ -64,8 +64,9 @@ cons: * 通过事实表和维度表的关联来检查数据一致性、完整性 * 通过特殊值来记录表与表关联过程中的未知值(关联不上)和不适用值(不合理值) -* 根据数据质量检查规则在日志中分级分类记录数据质量问题 +* 根据基于业务定义的数据质量检查规则在日志中分级分类记录数据质量问题,确保数据的完整性和准确性 * 通过记录调度日志来与特定调度服务解耦合,增强调度的鲁棒性,同时也能够结构化的记录任务运行过程中的信息,方便排错 +* 可以及时主动识别上游系统的变更(主要是表结构等),并及时做出相应调整 而无论是代码编写、托拉拽还是纯SQL脚本都因为过多人工操作使得这些数据工程实践难以统一,常常有以下问题: @@ -75,6 +76,8 @@ cons: * 任务调度过度依赖于已有调度服务,缺乏防呆设计,难以解决重复调度的问题(假如调度服务出现异常,任务被重复调度了,结果就是重复计算) * 错误排查过度依赖于任务执行日志,排查错误多依赖于不停的推断、加日志和尝试。如果是纯SQL脚本,则经常遇到几千行的SQL任务失败,然后不知道从哪里开始debug的窘境。 +而Sharp ETL已经为我们沉淀封装了在ETL处理中可能需要考虑的工程实践,这些工程实践往往会被人忽略而导致后续的数据问题。这些工程实践包括如显式强调的增量/全量、渐变/非渐变、切割批次的逻辑(日志驱动逻辑)、数据依赖等工程实践,从而确保ETL的高质量和低运维。 + ## 理想中的ETL应该什么样子? 近些年来最火热的莫过于流处理、流式ETL这些概念。虽然这篇文章与流或者批处理没有直接关系,还是要指出,无论是流式处理还是批处理,最基本的数据工程实践都需要具备,这些数据工程实践都是实际实践中不可或缺的一部分。以下讨论且抛开流式或批处理不谈。 diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index b1b6756..a38e884 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -32,8 +32,9 @@ const config = { theme: { customCss: require.resolve('./src/css/custom.css'), }, - googleAnalytics: { - trackingID: 'G-59696D1TKP' + gtag: { + trackingID: 'G-59696D1TKP', + anonymizeIP: false }, }), ], From 11c20733e04e7f6bb196adecac4e205774eb91d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Mon, 15 Aug 2022 16:16:30 +0800 Subject: [PATCH 32/34] Update why-we-need-sharp-etl --- .../blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md index 4616f70..68f6b74 100644 --- a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md +++ b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md @@ -67,6 +67,8 @@ cons: * 根据基于业务定义的数据质量检查规则在日志中分级分类记录数据质量问题,确保数据的完整性和准确性 * 通过记录调度日志来与特定调度服务解耦合,增强调度的鲁棒性,同时也能够结构化的记录任务运行过程中的信息,方便排错 * 可以及时主动识别上游系统的变更(主要是表结构等),并及时做出相应调整 +* 显式强调增量/全量、渐变/非渐变,作为任务的元数据 +* 任务依赖检查,只有当任务依赖满足时才执行任务 而无论是代码编写、托拉拽还是纯SQL脚本都因为过多人工操作使得这些数据工程实践难以统一,常常有以下问题: @@ -76,7 +78,7 @@ cons: * 任务调度过度依赖于已有调度服务,缺乏防呆设计,难以解决重复调度的问题(假如调度服务出现异常,任务被重复调度了,结果就是重复计算) * 错误排查过度依赖于任务执行日志,排查错误多依赖于不停的推断、加日志和尝试。如果是纯SQL脚本,则经常遇到几千行的SQL任务失败,然后不知道从哪里开始debug的窘境。 -而Sharp ETL已经为我们沉淀封装了在ETL处理中可能需要考虑的工程实践,这些工程实践往往会被人忽略而导致后续的数据问题。这些工程实践包括如显式强调的增量/全量、渐变/非渐变、切割批次的逻辑(日志驱动逻辑)、数据依赖等工程实践,从而确保ETL的高质量和低运维。 +这些工程实践往往会被人忽略而导致后续的数据问题,所以我们需要一个为我们封装好了上述工程实践的框架,从而确保ETL的高质量和低运维。 ## 理想中的ETL应该什么样子? @@ -94,6 +96,7 @@ cons: * 记录表与表关联过程中的未知值和不适用值 * 数据质量问题分级分类记录 * 通过调度日志解耦合调度系统 + * ... ... ### Sharp ETL workflow示意 @@ -233,7 +236,7 @@ ${DWD_UPDATED_PARTITION}; -- writeMode=overwrite ``` -## One more thing! +### One more thing! 其实上一段SQL是通过代码生成的,并非人工手写!在实际操作中,只需要填写我们的excel [ods模板](https://docs.google.com/spreadsheets/d/1Zn_Q-QUTf6us4RwdgUgBosXL09-D-TowmgwWlDskvlA) 或 [dwd模板](https://docs.google.com/spreadsheets/d/1CetkqBsXj_E8oZBsws9iGdaJB1QJUajnwqH4FoKhXKA)即可生成代码,可以成倍的提高开发效率。 From 5713f23dc3caea7e9d50bf9f47299288c968b8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 23 Nov 2022 17:52:27 +0800 Subject: [PATCH 33/34] Add new page --- website/docs/ods-config-template.md | 69 +++++++++++++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 70 insertions(+) create mode 100644 website/docs/ods-config-template.md diff --git a/website/docs/ods-config-template.md b/website/docs/ods-config-template.md new file mode 100644 index 0000000..15b21b2 --- /dev/null +++ b/website/docs/ods-config-template.md @@ -0,0 +1,69 @@ +--- +title: "ODS config template" +sidebar_position: 3 +toc: true +last_modified_at: 2022-11-23T17:59:57-04:00 +--- + +本片文档主要介绍ODS配置模板的参数和使用方式。 + +配置模板example可以参考quick start的[配置文件](https://docs.google.com/spreadsheets/d/1eRgSHWKDaRufvPJLp9QhcnWiVKzRegQ6PeZocvAgHEo/edit#gid=0)。 + +## 数据源配置:ods_etl_config + +`source_connection`: 配置在application.properties中的connection + +`source_table`: 从哪张表获取数据 + +`source_db`: 从哪个数据库获取数据 + +`source_type`: 数据库类型,例如:mysql + +`target_connection`: 目标连接,配置在application.properties中的connection。例如:hive + +`target_table`: ods表名 + +`target_db`: ods数据库库名 + +`target_type`: 目标数据库类型,例如:hive + +`row_filter_expression`: 是否可空:是。例如:location = 'shanghai',表示只取上海地区的数据。会作为where表达式拼接在查询源数据表的sql中 + +`load_type`: 增量全量,可选值:incremental,full + +`log_driven_type`: 日志驱动类型,可选值:timewindow/upstream/kafka_offset/auto_inc_id/diff + +`upstream`: 依赖于哪一个上游任务,对于ods任务而言,一般为空 + +`depends_on`: 依赖于哪一个任务,对于ods任务而言,一般为空 + +`default_start`: timewindow模式下的开始时间 + +`partition_format`: 分区格式,可选值:空字符串或者year/month/day + +`time_format`: 时间格式,默认值:YYYY-MM-DD hh:mm:ss + +`period`: 多少分钟运行一次任务,对于daily的任务应为1440 + + +## 表配置:ods_config + +`source_table`: 从哪张表获取数据 + +`source_column`: 源表列名称 + +`column_type`: 源表列类型 + +`column_description`: 源表列描述 + +`is_PK`: 源表是否主键 + +`is_nullable`: 源表是否可空 + +`incremental_column`: 增量列,一般为业务时间字段 + +`target_table`: 目标表名 + +`target_column`: 目标表列 + +`extra_column_expression`: 扩展列表达式,可以在源表多个列的基础上做sql表达式计算,例如 md5(concat_ws('', user_name, .. , user_address)),结果作为新列插入目标列,这时对应的源列为空值。 \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index eb4bfe4..f9ef414 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -28,6 +28,7 @@ module.exports = { label: 'Excel Template', collapsed: false, items: [ + 'ods-config-template', 'excel-template-ods', 'excel-template-dwd', ], From 5f0b907e71a31d27bf05af48a5c40ac3f96c8a3d Mon Sep 17 00:00:00 2001 From: Xiaoqiang Ma Date: Fri, 25 Nov 2022 11:41:31 +0800 Subject: [PATCH 34/34] [xiaoqiang] add dwd config template dict --- website/docs/dwd-config-template.md | 89 +++++++++++++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 90 insertions(+) create mode 100644 website/docs/dwd-config-template.md diff --git a/website/docs/dwd-config-template.md b/website/docs/dwd-config-template.md new file mode 100644 index 0000000..91b0496 --- /dev/null +++ b/website/docs/dwd-config-template.md @@ -0,0 +1,89 @@ +--- +title: "DWD config template" +sidebar_position: 3 +toc: true +last_modified_at: 2022-11-25T14:26:32-04:00 +--- + +本片文档主要介绍DWD配置模板的参数和使用方式。 + +配置模板example可以参考quick start的[配置文件](https://docs.google.com/spreadsheets/d/1CetkqBsXj_E8oZBsws9iGdaJB1QJUajnwqH4FoKhXKA/edit#gid=1485376124)。 + +## 数据源配置:dwd_etl_config + +`source_connection`: 配置在application.properties中的connection + +`source_type`: 数据库类型,例如:hive + +`source_db`: 从哪个数据库获取数据 + +`source_table`: 从哪张表获取数据 + +`target_connection`: 目标连接,配置在application.properties中的connection。例如:hive + +`target_type`: 目标数据库类型,例如:hive + +`target_db`: dwd数据库库名 + +`target_table`: dwd表名 + +`fact_or_dim`: 标识当前表是维度表还是事实表。当配置为dim(维度表)时,如果`slow_changing`未配置,默认`slow_changing`的值为TRUE;当配置为fact(事实表)时,如果`slow_changing`未配置,默认`slow_changing`的值为FALSE;【枚举值:fact/dim】 + +`slow_changing`: 标识当前表是否渐变。【枚举值:TRUE/FALSE】 + +`row_filter_expression`: 是否可空:是。例如:location = 'shanghai',表示只取上海地区的数据。会作为where表达式拼接在查询源数据表的sql中 + +`load_type`: 标识增量全量【枚举值:incremental/full】 + +`log_driven_type`: 日志驱动类型,【枚举值:timewindow/upstream/kafka_offset/auto_inc_id/diff】其中,timewindow为基于时间窗口;upstream为基于上一层ETL依赖;kafka_offset为基于消息队列offset;auto_inc_id为基于自增id(该id必须代表数据的唯一性);diff为基于文件对比 + +`upstream`: 日志驱动类型为upstream模式下的相关配置,标识依赖于哪一个ETL job + +`depends_on`: 调度服务依赖。 + +`default_start`: timewindow模式下的开始时间 + + +## 表配置:dwd_config + +`source_table`: 从哪张表获取数据 + +`target_table`: 当前ETL的目标表名称 + +`source_column`: 源表列名称 + +`source_column_description`: 列描述 + +`target_column`: 目标表需要保留的列名 + +`extra_column_expression`: 对于`source_column`不存在,但是`target_column`存在的列的逻辑表达式描述。其中**zip_id_flag**值为特殊标识,代表该`target_column`为关联主数据后获取的主数据zip_id + +`partition_column`: 标识哪些列作为分区列。用TRUE标识 + +`logic_primary_column`: 标识逻辑主键。用TRUE标识 + +`join_db_connection`: 标识需要关联的维度表所在数据库的连接,配置在application.properties中的connection + +`join_db_type`: 标识需要关联的维度表所在数据库的类型 + +`join_db`: 标识需要关联的维度表所在数据库的名称 + +`join_table`: 标识需要关联的维度表名 + +`join_on`: 标识和需要关联的维度表的哪个列进行关联 + +`create_dim_mode`: 标识当前表中的维度信息是否要插入到维度表的标识。【枚举值:never/once/always】解释如下。 + +* never:当关联不上维度中的维度时,当前表的该列标识为关联不上维度信息,默认为-1 + +* once:当关联不上维度中的维度时,会从当前表中往维度表中插入缺失的维度信息,通常为迟到维的处理方法 + +* always:从当前表中往维度表中插入维度信息,即,当前表会作为维度表的一个数据源头 + +`join_table_column`: 标识需要关联的维度表的列名。通常用作`create_dim_mode`为once和always的场景,即当前表的哪些列需要插入到所关联的维度表中 + +`business_create_time`: 标识当前表的业务时间 + +`business_update_time`: 标识当前表的更新时间 + +`ignore_changing_column`: 标识当前表的哪些列不用作为拉链表的渐变列。用TRUE标识。该列为拉链表的标识列 \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index f9ef414..cdfc3da 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -30,6 +30,7 @@ module.exports = { items: [ 'ods-config-template', 'excel-template-ods', + 'dwd-config-template', 'excel-template-dwd', ], }, {

MY`}U}+p#iMc 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 z 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 F{||4IS=s;q literal 0 HcmV?d00001 diff --git a/website/static/assets/images/workflowarrow.png b/website/static/assets/images/workflowarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..91a3e816183d8ec1c986cd042623e34845bef599 GIT binary patch literal 3595 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 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c01d54bcd39a5f853428f3cd5aa0f383d963c484 GIT binary patch literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000..94b5cf0 --- /dev/null +++ b/website/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000..d9161d3 --- /dev/null +++ b/website/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 0000000..5f65367 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,8674 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.7.1": + version "1.7.1" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz#025538b8a9564a9f3dd5bcf8a236d6951c76c7d1" + integrity sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg== + dependencies: + "@algolia/autocomplete-shared" "1.7.1" + +"@algolia/autocomplete-preset-algolia@1.7.1": + version "1.7.1" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz#7dadc5607097766478014ae2e9e1c9c4b3f957c8" + integrity sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg== + dependencies: + "@algolia/autocomplete-shared" "1.7.1" + +"@algolia/autocomplete-shared@1.7.1": + version "1.7.1" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz#95c3a0b4b78858fed730cf9c755b7d1cd0c82c74" + integrity sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg== + +"@algolia/cache-browser-local-storage@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.1.tgz#a0b85a6c3fe3d5c49fca01b16f00b41bf38a918c" + integrity sha512-BBdibsPn3hLBajc/NRAtHEeoXsw+ziSGR/3bqRNB5puUuwKPQZSE2MaMVWSADnlc3KV3bEj4xsfKOVLJyfJSPQ== + dependencies: + "@algolia/cache-common" "4.14.1" + +"@algolia/cache-common@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.1.tgz#11d44a6442f83deb3629a04c20df8408088f6449" + integrity sha512-XhAzm0Sm3D3DuOWUyDoVSXZ/RjYMvI1rbki+QH4ODAVaHDWVhMhg3IJPv3gIbBQnEQdtPdBhsf2hyPxAu28E5w== + +"@algolia/cache-in-memory@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.1.tgz#68ede8520f054bc65938209b59962056ae5b56c7" + integrity sha512-fVUu7N1hYb/zZYfV9Krlij70NwS+8bQm5vmDJyfp0+9FjSjz2V7wj1CUxvaY8ZcgoBPj9ehQ8sRuqSM2m5OPww== + dependencies: + "@algolia/cache-common" "4.14.1" + +"@algolia/client-account@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.1.tgz#b92e091f698630c49ec7df48816ae75af3cbac40" + integrity sha512-Zm4+PN3bsBPhv1dKKwzBaRGzf0G1JcjjSTpE231L7Z7LsEDcFDW4E6L5ctwMz3SliSBeL/j1ghmaunJrZlkRIg== + dependencies: + "@algolia/client-common" "4.14.1" + "@algolia/client-search" "4.14.1" + "@algolia/transporter" "4.14.1" + +"@algolia/client-analytics@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.1.tgz#aca3436775f608a6141cc81899e1d75ef030efa2" + integrity sha512-EhZLR0ezBZx7ZGkwzj7OTvnI8j2Alyv1ByC0Mx48qh3KqRhVwMFm/Uf34zAv4Dum2PTFin41Y4smAvAypth9nQ== + dependencies: + "@algolia/client-common" "4.14.1" + "@algolia/client-search" "4.14.1" + "@algolia/requester-common" "4.14.1" + "@algolia/transporter" "4.14.1" + +"@algolia/client-common@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.1.tgz#2709bddf934a3545cd9feecc0591e9285fbed7c2" + integrity sha512-WDwziD7Rt1yCRDfONmeLOfh1Lt8uOy6Vn7dma171KOH9NN3q8yDQpOhPqdFOCz1j3GC1FfIZxaC0YEOIobZ2lg== + dependencies: + "@algolia/requester-common" "4.14.1" + "@algolia/transporter" "4.14.1" + +"@algolia/client-personalization@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.1.tgz#58f0b85b8f6d531e13877a099f54513ac2bec154" + integrity sha512-D4eeW7bTi769PWcEYZO+QiKuUXFOC5zK5Iy83Ey6FHqS7m5TXws5MP1rmETE018lTXeYq2NSHWp/F07fRRg0RA== + dependencies: + "@algolia/client-common" "4.14.1" + "@algolia/requester-common" "4.14.1" + "@algolia/transporter" "4.14.1" + +"@algolia/client-search@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.1.tgz#44bfc65b3e6939b725f8f97aad725593f2a4ad7f" + integrity sha512-K6XrdIIQq8a3o+kCedj5slUVzA1aKttae4mLzwnY0bS7tYduv1IQggi9Sz8gOG6/MMyKMB4IwYqr47t/0z4Vxw== + dependencies: + "@algolia/client-common" "4.14.1" + "@algolia/requester-common" "4.14.1" + "@algolia/transporter" "4.14.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.1.tgz#acbd36b66e3b408f99cacfb581ad3bd28defcc28" + integrity sha512-58CK87wTjUWI1QNXc3nFDQ7EXBi28NoLufXE9sMjng2fAL1wPdyO+KFD8KTBoXOZnJWflPj5F7p6jLyGAfgvcQ== + +"@algolia/logger-console@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.1.tgz#7e7d7486d71ccfe38e63234626931083592149d2" + integrity sha512-not+VwH1Dx2B/BaN+4+4+YnGRBJ9lduNz2qbMCTxZ4yFHb+84j4ewHRPBTtEmibn7caVCPybdTKfHLQhimSBLQ== + dependencies: + "@algolia/logger-common" "4.14.1" + +"@algolia/requester-browser-xhr@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.1.tgz#9e683dc0916afae221bf946255a998b06830be78" + integrity sha512-mpH6QsFBbXjTy9+iU86Rcdt9LxS7GA/tWhGMr0+Ap8+4Za5+ELToz0PC7euVeVOcclgGGi7gbjOAmf6k8b10iA== + dependencies: + "@algolia/requester-common" "4.14.1" + +"@algolia/requester-common@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.1.tgz#b07ffa00ae0cf61442dcda71a3209051fed130d8" + integrity sha512-EbXBKrfYcX5/JJfaw7IZxhWlbUtjd5Chs+Alrfc4tutgRQn4dmImWS07n3iffwJcYdOWY1eRrnfBK5BwopuN5A== + +"@algolia/requester-node-http@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.1.tgz#5e5f4ff55deb5aa0e92f3105d77299de744b1471" + integrity sha512-/sbRqL9P8aVuYUG50BgpCbdJyyCS7fia+sQIx9d1DiGPO7hunwLaEyR4H7JDHc/PLKdVEPygJx3rnbJWix4Btg== + dependencies: + "@algolia/requester-common" "4.14.1" + +"@algolia/transporter@4.14.1": + version "4.14.1" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.1.tgz#7eca8568ff710d9d1a7bbd3c1dafbbf44a6143f5" + integrity sha512-xbmoIqszFDOCCZqizBQ2TNHcGtjZX7EkJCzABsrokA0WqtfZzClFmtc+tZYgtEiyAfIF70alTegG19poQGdkvg== + dependencies: + "@algolia/cache-common" "4.14.1" + "@algolia/logger-common" "4.14.1" + "@algolia/requester-common" "4.14.1" + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.18.5", "@babel/core@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/eslint-parser@^7.18.2": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031" + integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ== + dependencies: + eslint-scope "^5.1.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" + integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== + dependencies: + "@babel/types" "^7.18.9" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.6", "@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-remap-async-to-generator@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646" + integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== + dependencies: + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.8", "@babel/parser@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" + integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + +"@babel/plugin-proposal-async-generator-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" + integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== + dependencies: + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.18.8" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" + integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-identifier" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-constant-elements@^7.17.12": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz#ff6aeedd38f57ba6b41dcf824fcc8bcedb3e783f" + integrity sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff" + integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" + integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz#303feb7a920e650f2213ef37b36bbf327e6fa5a0" + integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-typescript" "^7.18.6" + +"@babel/plugin-transform-unicode-escapes@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" + integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.18.2", "@babel/preset-env@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" + integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.18.6" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.18.9" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.6" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.17.12", "@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.17.12", "@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz#7bacecd1cb2dd694eacd32a91fcf7021c20770ae" + integrity sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.8.4": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.8", "@babel/traverse@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" + integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.9" + "@babel/types" "^7.18.9" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.7", "@babel/types@^7.18.4", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" + integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@csstools/selector-specificity@^2.0.1": + version "2.0.2" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" + integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + +"@docsearch/css@3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.1.1.tgz#e0976bf995e383f8ee8657306311b9cb95016330" + integrity sha512-utLgg7E1agqQeqCJn05DWC7XXMk4tMUUnL7MZupcknRu2OzGN13qwey2qA/0NAKkVBGugiWtON0+rlU0QIPojg== + +"@docsearch/react@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.1.1.tgz#3dffb5db8cf9eb95d6e732cf038264bfc10191ed" + integrity sha512-cfoql4qvtsVRqBMYxhlGNpvyy/KlCoPqjIsJSZYqYf9AplZncKjLBTcwBu6RXFMVCe30cIFljniI4OjqAU67pQ== + dependencies: + "@algolia/autocomplete-core" "1.7.1" + "@algolia/autocomplete-preset-algolia" "1.7.1" + "@docsearch/css" "3.1.1" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-rc.1.tgz#828d93d241171565d8947a9ab404091e04759141" + integrity sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ== + dependencies: + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-common" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.7" + babel-loader "^8.2.5" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^1.12.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.3" + react-router-config "^5.1.1" + react-router-dom "^5.3.3" + rtl-detect "^1.0.4" + semver "^7.3.7" + serve-handler "^6.1.3" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.3" + tslib "^2.4.0" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.1" + webpack "^5.73.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.9.3" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-rc.1.tgz#76bbd7f6912779a0667f8f2fd8fc1a05618a6148" + integrity sha512-9/KmQvF+eTlMqUqG6UcXbRgxbGed/8bQInXuKEs+95/jI6jO/3xSzuRwuHHHP0naUvSVWjnNI9jngPrQerXE5w== + dependencies: + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" + postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" + +"@docusaurus/logger@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-rc.1.tgz#db95e9b15bc243695830a5b791c0eff705ef1b54" + integrity sha512-daa3g+SXuO9K60PVMiSUmDEK9Vro+Ed7i7uF8CH6QQJLcNZy/zJc0Xz62eH7ip1x77fmeb6Rg4Us1TqTFc9AbQ== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-rc.1.tgz#e78d7d416aacc289f2427c5ccdb9145820acb0cb" + integrity sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg== + dependencies: + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@mdx-js/mdx" "^1.6.22" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" + stringify-object "^3.3.0" + tslib "^2.4.0" + unified "^9.2.2" + unist-util-visit "^2.0.3" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@docusaurus/module-type-aliases@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-rc.1.tgz#c7839ac15b7712a8d86353a3253918f63ffbea09" + integrity sha512-la7D8ggFP8I5nOp/Epl6NqTeDWcbofPVMOaVisRxQbx5iuF9Al+AITbaDgm4CXpFLJACsqhsXD5W4BnKX8ZxfA== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.0.0-rc.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-rc.1.tgz#8ae5d5ec2da08c583a057bf2754a5b9278b3eb08" + integrity sha512-BVVrAGZujpjS/0rarY2o24rlylRRh2NZuM65kg0JNkkViF79SeEHsepog7IuHyoqGWPm1N/I7LpEp7k+gowZzQ== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-common" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-rc.1.tgz#2dda88166bf21b0eeb3821ef748059b20c8c49f7" + integrity sha512-Yk5Hu6uaw3tRplzJnbDygwRhmZ3PCzEXD4SJpBA6cPC73ylfqOEh6qhiU+BWhMTtDXNhY+athk5Kycfk3DW1aQ== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/module-type-aliases" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + "@types/react-router-config" "^5.0.6" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + webpack "^5.73.0" + +"@docusaurus/plugin-content-pages@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-rc.1.tgz#2be82f53d6c77e6aa66787726c30dc60b210e6f8" + integrity sha512-FdO79WC5hfWDQu3/CTFLRQzTNc0e5n+HNzavm2MNkSzGV08BFJ6RAkbPbtra5CWef+6iXZav6D/tzv2jDPvLzA== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + fs-extra "^10.1.0" + tslib "^2.4.0" + webpack "^5.73.0" + +"@docusaurus/plugin-debug@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-rc.1.tgz#73c06ad08d66810941e456d50b07be008f5235cb" + integrity sha512-aOsyYrPMbnsyqHwsVZ+0frrMRtnYqm4eaJpG4sC/6LYAJ07IDRQ9j3GOku2dKr5GsFK1Vx7VlE6ZLwe0MaGstg== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-rc.1.tgz#0136cc7534573ca56e023178ec2bda5c1e89ce71" + integrity sha512-f+G8z5OJWfg5QqWDLIdcN2SDoK5J5Gg8HMrqCI6Pfl+rxPb5I1niA+/UkAM+kMCpnekvhSt5AWz2fgkRenkPLA== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-rc.1.tgz#61698fdc41a4ace912fb8f6c834efd288edad3c0" + integrity sha512-yE1Et9hhhX9qMRnMJzpNq0854qIYiSEc2dZaXNk537HN7Q0rKkr/YONUHz2iqNYwPX2hGOY4LdpTxlMP88uVhA== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.1.tgz#0b638e774b253d90e9f2d11663e961250f557bc4" + integrity sha512-5JmbNpssUF03odFM4ArvIsrO9bv7HnAJ0VtefXhh0WBpaFs8NgI3rTkCTFimvtRQjDR9U2bh23fXz2vjQQz6oA== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-common" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-rc.1.tgz#5e5b1cf80b3dd4e2c3f824c78a111f105858d853" + integrity sha512-5jjTVZkhArjyoNHwCI9x4PSG0zPmBJILjZLVrxPcHpm/K0ltkYcp6J3GxYpf5EbMuOh5+yCWM63cSshGcNOo3Q== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/plugin-content-blog" "2.0.0-rc.1" + "@docusaurus/plugin-content-docs" "2.0.0-rc.1" + "@docusaurus/plugin-content-pages" "2.0.0-rc.1" + "@docusaurus/plugin-debug" "2.0.0-rc.1" + "@docusaurus/plugin-google-analytics" "2.0.0-rc.1" + "@docusaurus/plugin-google-gtag" "2.0.0-rc.1" + "@docusaurus/plugin-sitemap" "2.0.0-rc.1" + "@docusaurus/theme-classic" "2.0.0-rc.1" + "@docusaurus/theme-common" "2.0.0-rc.1" + "@docusaurus/theme-search-algolia" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-rc.1.tgz#4ab30745e6b03b0f277837debae786a0a83aee6a" + integrity sha512-qNiz7ieeq3AC+V8TbW6S63pWLJph1CbzWDDPTqxDLHgA8VQaNaSmJM8S92pH+yKALRb9u14ogjjYYc75Nj2JmQ== + dependencies: + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/module-type-aliases" "2.0.0-rc.1" + "@docusaurus/plugin-content-blog" "2.0.0-rc.1" + "@docusaurus/plugin-content-docs" "2.0.0-rc.1" + "@docusaurus/plugin-content-pages" "2.0.0-rc.1" + "@docusaurus/theme-common" "2.0.0-rc.1" + "@docusaurus/theme-translations" "2.0.0-rc.1" + "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-common" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + "@mdx-js/react" "^1.6.22" + clsx "^1.2.1" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.42" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" + prismjs "^1.28.0" + react-router-dom "^5.3.3" + rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-rc.1.tgz#ea5d9732a16b03b488555e50107161bfa2abad98" + integrity sha512-1r9ZLKD9SeoCYVzWzcdR79Dia4ANlrlRjNl6uzETOEybjK6FF7yEa9Yra8EJcOCbi3coyYz5xFh/r1YHFTFHug== + dependencies: + "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/module-type-aliases" "2.0.0-rc.1" + "@docusaurus/plugin-content-blog" "2.0.0-rc.1" + "@docusaurus/plugin-content-docs" "2.0.0-rc.1" + "@docusaurus/plugin-content-pages" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.5" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-rc.1.tgz#e78c0aeaea6a3717ae3a6ecd75a8652bd7c8e974" + integrity sha512-H5yq6V/B4qo6GZrDKMbeSpk3T9e9K2MliDzLonRu0w3QHW9orVGe0c/lZvRbGlDZjnsOo7XGddhXXIDWGwnpaA== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/plugin-content-docs" "2.0.0-rc.1" + "@docusaurus/theme-common" "2.0.0-rc.1" + "@docusaurus/theme-translations" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/utils-validation" "2.0.0-rc.1" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" + eta "^1.12.3" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-rc.1.tgz#bd647f78c741ee7f6c6d2cbbd3e3f282ef2f89ad" + integrity sha512-JLhNdlnbQhxVQzOnLyiCaTzKFa1lpVrM3nCrkGQKscoG2rY6ARGYMgMN2DkoH6hm7TflQ8+PE1S5MzzASeLs4Q== + dependencies: + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-rc.1.tgz#032f8afde6b4878e37f984b9949a96b150103c21" + integrity sha512-wX25FOZa/aKnCGA5ljWPaDpMW3TuTbs0BtjQ8WTC557p8zDvuz4r+g2/FPHsgWE0TKwUMf4usQU1m3XpJLPN+g== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.73.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-rc.1.tgz#3e233a28794325d5d9d3af3f7b1c22b59aa8b847" + integrity sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-rc.1.tgz#dded12f036cda8a54a19e01694b35859fe0cf1d5" + integrity sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw== + dependencies: + "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.0-rc.1" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.0.0-rc.1": + version "2.0.0-rc.1" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-rc.1.tgz#53584b800df9e13864d5ef1a76aa7655a90ec86e" + integrity sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg== + dependencies: + "@docusaurus/logger" "2.0.0-rc.1" + "@svgr/webpack" "^6.2.1" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.73.0" + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@svgr/babel-plugin-add-jsx-attribute@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.0.tgz#eae9f3255da5e6f5d1ec115e4ddcca65709a8611" + integrity sha512-3XzJy0dCVEOE2o2Wn8tF9SdQ2na1Q7jJNzIs3+27RHPpEiuqlClBNhIOhPFKr95+bUGtL6nZIgqY8xBhMw0p6g== + +"@svgr/babel-plugin-remove-jsx-attribute@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.0.tgz#b4910cb52a1499f59ab65c6b1483424913e87768" + integrity sha512-zD0sTwXpL78pWaxWxCyqimfukPcJfToKuwW1Po00pUeOYT6KuMQrPnG6XIZpLadydOo+fght8SoxwRb5O9TtWA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.0.tgz#0f8b0969f36096be9f64f2ed052ade314779a3f4" + integrity sha512-COsMIL1BRU/ZxFTvd59NFzJPIdvBkV19Jrn7w1NwFmglOUrpchPRSzfW6FzWUh2C8nzJrnjDn6V7i7klVhHZEA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.0.tgz#185b2ff136a703f32a84e16e5bb533ca4d5f42fa" + integrity sha512-mKk2uqn1/7dk2I82fYaiLTw12eqmZZ2ZzH3WVhzzLvMXrLIxc9xYFJBNRMrV+77ZDHd791933HWSNChtGeJLQg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.0.tgz#e06db7f06eb6be5bd9300a0d964521ef9eee589b" + integrity sha512-jdQJa8DZHfo2POTmgl8ZmDEcpTEz4n6RsANle1DbbC8CGq+1k/RV4MkRL1ceqIJCSOW3ypk23gpG5Q4xlSiY7Q== + +"@svgr/babel-plugin-svg-em-dimensions@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.0.tgz#1369f2c7c5c725b532224a7a00e500d267a728aa" + integrity sha512-yPogu5hLcF5FXCU3a3sCtsP+lloLBkIxM+xplumKwIdQNN28qb+HmFxVLUkT0+MD3y+77DjTtukJzkEBqL/BsA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.0.tgz#72cafb778198af1f9f0be6bfaf369f2cd7746ac5" + integrity sha512-Eso0uWFLN8kpR/MB+mD6j0WOTSUPWpyXpEkYt6sg4GItEMvScWgZV8H986CU09oXceaG8AovgPvYdygiJuRsRA== + +"@svgr/babel-plugin-transform-svg-component@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.0.tgz#95d91c49127211d790fa08517cb0bf0b3f363565" + integrity sha512-e9tSsPAHibGyZDPqQ8a5OIDuuON2YY6+XeCr6WqxVLwj+nIqbUOmNNZpekNsUv/gZ6UbtzEpGfZMiZavpavqDg== + +"@svgr/babel-preset@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.3.0.tgz#b09393095b61cb889f103264d326bd177dc310dc" + integrity sha512-N1UWDZy/kxGW9G4q4jRD+Jyn0N+LmKw0yb9HwAWBZdFBu4ckKtc7lJLHvIFou51r11r/BsZWiJPje3fDLnTMtA== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.3.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.3.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.3.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.3.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.3.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.3.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.3.0" + "@svgr/babel-plugin-transform-svg-component" "^6.3.0" + +"@svgr/core@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.3.0.tgz#4d8f086c8e5121d490fe06523dad8305b159d20f" + integrity sha512-olON7KzAQR4oBbnRmSgJkQrpqPbHd6wURAfTR+HN+6GpcJxknEEDC+l+bpEE/jz2K4lcHex91A2cRUlsGMCazg== + dependencies: + "@svgr/plugin-jsx" "^6.3.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.0.tgz#594a2503044ff5b66a692a55217aedd99d6b341e" + integrity sha512-dlIzHVpWhjMlcTrYUSovfr4MOzm+1I8e9yIAF5eiZU5XNHs8hYDS5xL2QDakt5wd1/2MEtJie97GsCOotlstpA== + dependencies: + "@babel/types" "^7.18.4" + entities "^4.3.0" + +"@svgr/plugin-jsx@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.3.0.tgz#df353e0c1618c7a212ce5da63876208fea62e303" + integrity sha512-1yr719Dx7c43rgqUaWaYF195bCZ/kZyPk5nWjdRwNaKqfARCfH0tTquD0a9nWkOTFnLSTGytjGdBqLNRw4X0Yw== + dependencies: + "@babel/core" "^7.18.5" + "@svgr/babel-preset" "^6.3.0" + "@svgr/hast-util-to-babel-ast" "^6.3.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.3.0.tgz#4d42573330407c2ec92854e172d569516052750b" + integrity sha512-HFbuewy6Gm8jZu1xqbdOB7zKipgf5DgcRG421uVfqgGredBIl1eLt2B0Qr3pFXQE8OTmRqJsZbjKpfrOu1BwkA== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.2.1": + version "6.3.0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.3.0.tgz#62d3681e6999c170f67edf7f77dcb95c63bafe42" + integrity sha512-mtIQaV492zUu2Fq1BZRlrFf3PO1ONzfHZCki7h7ZDHWPuPi6hx32X4lNhN+tT4phPw/Sb8xPj7JNHn5Eobm/WQ== + dependencies: + "@babel/core" "^7.18.5" + "@babel/plugin-transform-react-constant-elements" "^7.17.12" + "@babel/preset-env" "^7.18.2" + "@babel/preset-react" "^7.17.12" + "@babel/preset-typescript" "^7.17.12" + "@svgr/core" "^6.3.0" + "@svgr/plugin-jsx" "^6.3.0" + "@svgr/plugin-svgo" "^6.3.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.5" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" + integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.29" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" + integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/node@*": + version "18.0.6" + resolved "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7" + integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": + version "5.0.6" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" + integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.18" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" + integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.0.15" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" + integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" + integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.13.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +address@^1.0.1, address@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.10.0.tgz#59a0f645dd3c7e55cf01faa568d1af50c49d36f6" + integrity sha512-4E4od8qWWDMVvQ3jaRX6Oks/k35ywD011wAA4LbYMMjOtaZV6VWaTjRr4iN2bdaXP2o1BP7SLFMBf3wvnHmd8Q== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.0.0, algoliasearch@^4.13.1: + version "4.14.1" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.1.tgz#7f24cabd264f8294b461d108e1603e673571e806" + integrity sha512-ZWqnbsGUgU03/IyG995pMCc+EmNVDA/4c9ntr8B0dWQwFqazOQ4ErvKZxarbgSNmyPo/eZcVsTb0bNplJMttGQ== + dependencies: + "@algolia/cache-browser-local-storage" "4.14.1" + "@algolia/cache-common" "4.14.1" + "@algolia/cache-in-memory" "4.14.1" + "@algolia/client-account" "4.14.1" + "@algolia/client-analytics" "4.14.1" + "@algolia/client-common" "4.14.1" + "@algolia/client-personalization" "4.14.1" + "@algolia/client-search" "4.14.1" + "@algolia/logger-common" "4.14.1" + "@algolia/logger-console" "4.14.1" + "@algolia/requester-browser-xhr" "4.14.1" + "@algolia/requester-common" "4.14.1" + "@algolia/requester-node-http" "4.14.1" + "@algolia/transporter" "4.14.1" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.3.7, autoprefixer@^10.4.7: + version "10.4.7" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + dependencies: + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axe-core@^4.4.2: + version "4.4.3" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-loader@^8.2.5: + version "8.2.5" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.13" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz#4ac003dc1626023252d58adf2946f57e5da450c1" + integrity sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.2: + version "4.21.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" + integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== + dependencies: + caniuse-lite "^1.0.30001366" + electron-to-chromium "^1.4.188" + node-releases "^2.0.6" + update-browserslist-db "^1.0.4" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001366: + version "1.0.30001367" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a" + integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.1" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1, colord@^2.9.2: + version "2.9.2" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colorette@^2.0.10: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.23.5" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b" + integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg== + dependencies: + browserslist "^4.21.2" + semver "7.0.0" + +core-js-pure@^3.20.2: + version "3.23.5" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.5.tgz#23daaa9af9230e50f10b0fa4b8e6b87402be4c33" + integrity sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw== + +core-js@^3.23.3: + version "3.23.5" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.23.5.tgz#1f82b0de5eece800827a2f59d597509c67650475" + integrity sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-declaration-sorter@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz#72ebd995c8f4532ff0036631f7365cce9759df14" + integrity sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og== + +css-functions-list@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b" + integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== + +css-loader@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz#e11800388c19c2b7442c39cc78ac8ae3675c9605" + integrity sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA== + dependencies: + cssnano "^5.1.8" + jest-worker "^27.5.1" + postcss "^8.4.13" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.8: + version "5.3.8" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz#027b1d05ef896d908178c483f0ec4190cb50ef9a" + integrity sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg== + dependencies: + autoprefixer "^10.3.7" + cssnano-preset-default "^5.2.12" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.12: + version "5.2.12" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97" + integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew== + dependencies: + css-declaration-sorter "^6.3.0" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.2" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.6" + postcss-merge-rules "^5.1.2" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.12, cssnano@^5.1.8: + version "5.1.12" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz#bcd0b64d6be8692de79332c501daa7ece969816c" + integrity sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ== + dependencies: + cssnano-preset-default "^5.2.12" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@2.6.9, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.188: + version "1.4.196" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.196.tgz#e18cdc5c1c2c2ebf78da237d0c374cc3b244d4cb" + integrity sha512-uxMa/Dt7PQsLBVXwH+t6JvpHJnrsYBaxWKi/J6HE+/nBtoHENhwBoNkgkm226/Kfxeg0z1eMQLBRPPKcDH8xWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.9.3: + version "5.10.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.3.0: + version "4.3.1" + resolved "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" + integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb@^19.0.4: + version "19.0.4" + resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" + integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== + dependencies: + eslint-config-airbnb-base "^15.0.0" + object.assign "^4.1.2" + object.entries "^1.1.5" + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-header@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz#6ce512432d57675265fac47292b50d1eff11acd6" + integrity sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg== + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsx-a11y@^6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz#2c5ac12e013eb98337b9aa261c3b355275cc6415" + integrity sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw== + dependencies: + "@babel/runtime" "^7.18.3" + aria-query "^4.2.2" + array-includes "^3.1.5" + ast-types-flow "^0.0.7" + axe-core "^4.4.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.1" + language-tags "^1.0.5" + minimatch "^3.1.2" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.30.1: + version "7.30.1" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" + integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.19.0: + version "8.20.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz#048ac56aa18529967da8354a478be4ec0a2bc81b" + integrity sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^1.12.3: + version "1.12.3" + resolved "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" + integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + +express@^4.17.3: + version "4.18.1" + resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastest-levenshtein@^1.0.12: + version "1.0.14" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859" + integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.6" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + +flux@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +github-slugger@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.16.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" + integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.1.2" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-size@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + dependencies: + queue "6.0.2" + +immer@^9.0.7: + version "9.0.15" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" + integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.42: + version "0.2.0-alpha.42" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" + integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" + integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.2" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +known-css-properties@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776" + integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.7" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" + integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== + dependencies: + fs-monkey "^1.0.3" + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" + integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz#51f74a5257f5fcc536389e8c2d0b3802e1bfa91a" + integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== + dependencies: + entities "^4.3.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" + integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== + dependencies: + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz#4c883cc0a1b2bfe2074377b7a74c1cd805684395" + integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.7" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce" + integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" + integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz#a99bae69ef1098ee3b64a5fa94d258ec240d0355" + integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== + dependencies: + sort-css-media-queries "2.0.4" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.3.11, postcss@^8.4.13, postcss@^8.4.14, postcss@^8.4.7: + version "8.4.14" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.2.1, prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +prismjs@^1.28.0: + version "1.28.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet-async@*, react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz#8779fc28e6691d07afcaf98406d3812fe6f11199" + integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.3" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.3, react-router@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz#8e3841f4089e728cf82a429d92cdcaa5e4a3a288" + integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-textarea-autosize@^8.3.2: + version "8.3.4" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" + integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.4: + version "7.5.6" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" + integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.3" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" + integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.1.1" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz#1f19c4d3f6278c52efd08a94574a2a8d32b7d092" + integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +stylelint@^14.9.1: + version "14.9.1" + resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.9.1.tgz#6494ed38f148b1e75b402d678a3b6a8aae86dfda" + integrity sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA== + dependencies: + "@csstools/selector-specificity" "^2.0.1" + balanced-match "^2.0.0" + colord "^2.9.2" + cosmiconfig "^7.0.1" + css-functions-list "^3.1.0" + debug "^4.3.4" + execall "^2.0.0" + fast-glob "^3.2.11" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.2.0" + ignore "^5.2.0" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.25.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.14" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^2.2.0" + svg-tags "^1.0.0" + table "^6.8.0" + v8-compile-cache "^2.3.0" + write-file-atomic "^4.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +table@^6.8.0: + version "6.8.0" + resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.14.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.2.0" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^2.5.0: + version "2.17.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.17.0.tgz#c677030ce61e5be0c90c077d52571eb73c506ea9" + integrity sha512-U+g3/JVXnOki1kLSc+xZGPRll3Ah9u2VIG6Sn9iH9YX6UkPERmt6O/0fIyTgsd2/whV0+gAaHAg8fz6sG1QzMA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.3: + version "4.9.3" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz#2360a5d6d532acb5410a668417ad549ee3b8a3c9" + integrity sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.73.0: + version "5.73.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3" + integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.4.2: + version "8.8.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From c8afd37e35a8cab5dae70dbb7a4d8d2c1f73b0af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Thu, 21 Jul 2022 12:35:09 +0800 Subject: [PATCH 02/34] Fix base url --- website/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 5022c5c..67d91e2 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -14,7 +14,7 @@ const config = { title: 'Sharp ETL website', tagline: 'Write ETL using your favorite SQL dialects', url: 'https://sharpdata.github.io/SharpETL/', - baseUrl: '/', + baseUrl: '/SharpETL/', onBrokenLinks: 'ignore', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', From b10b6697788ab7c092cd0341bb3022efd533524b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Thu, 21 Jul 2022 13:37:50 +0800 Subject: [PATCH 03/34] Add developer setup --- website/docs/developer-setup.md | 73 +++++++++++++++++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 74 insertions(+) create mode 100644 website/docs/developer-setup.md diff --git a/website/docs/developer-setup.md b/website/docs/developer-setup.md new file mode 100644 index 0000000..fc9cc16 --- /dev/null +++ b/website/docs/developer-setup.md @@ -0,0 +1,73 @@ +--- +title: Developer Setup +sidebar_position: 4 +keywords: [ide, developer, setup] +toc: true +last_modified_at: 2019-12-30T15:59:57-04:00 +--- + +## Pre-requisites + +To contribute code, you need + + - a GitHub account + - a Linux (or) macOS development environment with Java JDK 8 installed + - [Docker](https://www.docker.com/) installed for running demo, integ tests or building website + - docker compose + + +## IDE Setup + +To contribute, you would need to do the following + +- IntelliJ +- Scala plugin + +### Contributing Code + + - Once you finalize on a project/task, please open a new GitHub issue or assign an existing one to yourself. + - Almost all PRs should be linked to a GitHub issue. It's always good to have a GitHub issue upfront to avoid duplicating efforts. + - But, you may be asked to file a GitHub issue, if reviewer deems it necessary + - Before you begin work, + - Claim the GitHub issue using the process above and assign the GitHub issue to yourself. + - Click "Start Progress" on the GitHub issue, which tells everyone that you are working on the issue actively. + - Make your code change + - Get existing tests to pass using `./gradlew test` + - Add adequate tests for your new functionality + - For involved changes, it's best to test the changes in real production environments and report the results in the PR. + - For website changes, please build the site locally & test navigation, formatting & links thoroughly + - If your code change changes some aspect of documentation (e.g new config, default value change), + please ensure there is another PR to [update the docs](https://github.com/SharpData/SharpETL/tree/pages/README.md) as well. + - Sending a Pull Request + - Please ensure your commit message body is descriptive of the change. Bulleted summary would be appreciated. + - Address code review comments & keep pushing changes to your fork/branch, which automatically updates the PR + - Before your change can be merged, it should be squashed into a single commit for cleaner commit history. + - Finally, once your pull request is merged, make sure to close issue. + +### Coding guidelines + +Our code can benefit from contributors speaking the same "language" when authoring code. After all, it gets read a lot more than it gets +written. So optimizing for "reads" is a good goal. The list below is a set of guidelines, that contributors strive to upkeep and reflective +of how we want to evolve our code in the future. + +## Code & Project Structure + + * `common` : most common case classes + * `core` : core mudules, like `WorkflowInterpreter`, `WorkflowParser` etc. + * `datasource` : Generic datasource API + * `docker` : Docker containers used by demo and integration tests. Brings up a mini data ecosystem locally + * `flink` : Implementation for the Flink engine + * `spark` : Implementation for the Spark engine + +## Code WalkThrough + +[This Quick start](/docs/quick-start-guide) will give you a start. + +## Docker Setup + +We encourage you to test your code on docker, please follow this for [docker setup](/docs/docker-setup). + +## Website + +[Sharp ETL site](/) is hosted on a special `pages` branch. Please follow the `README` file under `pages` on that branch for +instructions on making changes to the website. diff --git a/website/sidebars.js b/website/sidebars.js index 39c21f5..82cfd4c 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -10,6 +10,7 @@ module.exports = { items: [ 'quick-start-guide', 'docker-setup', + 'developer-setup', 'end-to-end-showcase', 'end-to-end-showcase-postgres' ], From f39fa4a27c86fcaf248176befbb219724db2b0d6 Mon Sep 17 00:00:00 2001 From: li chen Date: Tue, 2 Aug 2022 11:53:24 +0800 Subject: [PATCH 04/34] update quick-start-guide.md --- website/docs/quick-start-guide.md | 84 +++++++++++++++---------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md index 353d13d..c7089c1 100644 --- a/website/docs/quick-start-guide.md +++ b/website/docs/quick-start-guide.md @@ -56,7 +56,7 @@ docker run --name postgres -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgre Start a ETL db instance ```bash -docker run --name mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=bigdata_etl mysql:8.0 +docker run --name mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=sharp_etl mysql:8.0 ``` Suppose we have a table named `online_order` in postgres with schema `sales`: @@ -105,10 +105,10 @@ create table sales.online_order -**We can download [this excel](https://docs.google.com/spreadsheets/d/1EwQLzKOjEbl8TDD4DFNav7zkIStjxMpBQjV_6jT9giw/edit?usp=sharing) to your `~/Desktop` for the quick start guide.** +**We can download [this excel](https://docs.google.com/spreadsheets/d/1k4U2QgZyknJLfpJvVxASsiOcX2nIHX0tx_rUKAINLTY/edit#gid=0) to your `~/Desktop` for the quick start guide.** :::tip -You can also use the existing [excel template](https://docs.google.com/spreadsheets/d/193aR2HXvvIUNeI4W9sSxNbLhQ78mvVNnYp9pmItSpVU/edit) for your new cases. +You can also use the existing [excel template](https://docs.google.com/spreadsheets/d/1eRgSHWKDaRufvPJLp9QhcnWiVKzRegQ6PeZocvAgHEo/edit#gid=0) for your new cases. ::: ## Generate sql files from excel config @@ -121,7 +121,7 @@ values={[ ```bash -./gradlew :spark:run --args="generate-sql -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --output ~/Desktop/" +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --output ~/Desktop/" ``` @@ -135,39 +135,38 @@ And you can see a new file generated at `~/Desktop/sales.online_order.sql` -- source=postgres -- dbName=postgres -- tableName=sales.online_order --- target=postgres --- dbName=postgres --- tableName=ods.t_fact_online_order --- checkPoint=false --- dateRangeInterval=0 +-- target=hive +-- dbName=ods +-- tableName=t_fact_online_order -- writeMode=append --- incrementalType=incremental_append -SELECT "order_no" AS "order_no", - "user_id" AS "user_id", - "user_name" AS "user_name", - "order_total_amount" AS "order_total_amount", - "actual_amount" AS "actual_amount", - "post_amount" AS "post_amount", - "order_pay_amount" AS "order_pay_amount", - "total_discount" AS "total_discount", - "pay_type" AS "pay_type", - "source_type" AS "source_type", - "order_status" AS "order_status", - "note" AS "note", - "confirm_status" AS "confirm_status", - "payment_time" AS "payment_time", - "delivery_time" AS "delivery_time", - "receive_time" AS "receive_time", - "comment_time" AS "comment_time", - "delivery_company" AS "delivery_company", - "delivery_code" AS "delivery_code", - "business_date" AS "business_date", - "return_flag" AS "return_flag", - "created_at" AS "created_at", - "updated_at" AS "updated_at", - "deleted_at" AS "deleted_at", - ${JOB_ID} AS "job_id", - now() AS "job_time" +SELECT "order_no" AS "order_no", + "user_id" AS "user_id", + "user_name" AS "user_name", + "order_total_amount" AS "order_total_amount", + "actual_amount" AS "actual_amount", + "post_amount" AS "post_amount", + "order_pay_amount" AS "order_pay_amount", + "total_discount" AS "total_discount", + "pay_type" AS "pay_type", + "source_type" AS "source_type", + "order_status" AS "order_status", + "note" AS "note", + "confirm_status" AS "confirm_status", + "payment_time" AS "payment_time", + "delivery_time" AS "delivery_time", + "receive_time" AS "receive_time", + "comment_time" AS "comment_time", + "delivery_company" AS "delivery_company", + "delivery_code" AS "delivery_code", + "business_date" AS "business_date", + "return_flag" AS "return_flag", + "created_at" AS "created_at", + "updated_at" AS "updated_at", + "deleted_at" AS "deleted_at", + ${JOB_ID} AS "job_id", + to_char("business_date", 'yyyy') as "year", + to_char("business_date", 'MM') as "month", + to_char("business_date", 'DD') as "day" FROM "postgres"."sales"."online_order" WHERE "business_date" >= '${DATA_RANGE_START}' AND "business_date" < '${DATA_RANGE_END}'; ``` @@ -209,8 +208,7 @@ create table ods.t_fact_online_order created_at timestamp default CURRENT_TIMESTAMP, updated_at timestamp default CURRENT_TIMESTAMP, deleted_at timestamp, - job_id varchar(16), - job_time timestamp + job_id varchar(16) ); ``` @@ -301,10 +299,10 @@ values={[ SELECT * FROM ods.t_fact_online_order; ``` -| order_no | user_id | user_name | order_total_amount | actual_amount | post_amount | order_pay_amount | total_discount | pay_type | source_type | order_status | note | confirm_status | payment_time | delivery_time | receive_time | comment_time | delivery_company | delivery_code | business_date | return_flag | created_at | updated_at | deleted_at | job_id | job_time | -| :------------ | :------ | :----------- | :----------------- | :------------ | :---------- | :--------------- | :------------- | :------- | :--------------- | :----------- | :--- | :------------- | :------------------------- | :------------ | :----------- | :----------- | :--------------- | :------------ | :------------ | :---------- | :------------------------- | :------------------------- | :--------- | :----- | :------------------------- | -| 2021093000002 | 2 | 李四o(╥﹏╥)o | 399 | 200 | 0 | 200 | 199 | wechat | official-website | paid | | | 2021-09-30 19:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 19:00:00.000000 | 2021-09-30 19:00:35.000000 | | 1 | 2021-10-26 16:30:49.486856 | -| 2021093000001 | 1 | 张三ð | 200 | 100 | 0 | 99 | 101 | wechat | mini-program | paid | | | 2021-09-30 09:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 09:00:00.000000 | 2021-09-30 09:00:35.000000 | | 1 | 2021-10-26 16:30:49.486856 | -| | | | | | | | | | | | | | | | | | | | | | | | | | | +| order_no | user_id | user_name | order_total_amount | actual_amount | post_amount | order_pay_amount | total_discount | pay_type | source_type | order_status | note | confirm_status | payment_time | delivery_time | receive_time | comment_time | delivery_company | delivery_code | business_date | return_flag | created_at | updated_at | deleted_at | job_id | +| :------------ | :------ | :----------- | :----------------- | :------------ | :---------- | :--------------- | :------------- | :------- | :--------------- | :----------- | :--- | :------------- | :------------------------- | :------------ | :----------- | :----------- | :--------------- | :------------ | :------------ | :---------- | :------------------------- | :------------------------- | :--------- |:-------| +| 2021093000002 | 2 | 李四o(╥﹏╥)o | 399 | 200 | 0 | 200 | 199 | wechat | official-website | paid | | | 2021-09-30 19:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 19:00:00.000000 | 2021-09-30 19:00:35.000000 | | 2 | +| 2021093000001 | 1 | 张三ð | 200 | 100 | 0 | 99 | 101 | wechat | mini-program | paid | | | 2021-09-30 09:00:35.000000 | | | | | | 2021-09-30 | | 2021-09-30 09:00:00.000000 | 2021-09-30 09:00:35.000000 | | 2 | +| | | | | | | | | | | | | | | | | | | | | | | | | | From 68b5f224b0c2c2ea569c89f143a01d7604186537 Mon Sep 17 00:00:00 2001 From: li chen Date: Tue, 2 Aug 2022 13:44:43 +0800 Subject: [PATCH 05/34] update quick-start-guide.md --- website/docs/quick-start-guide.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md index c7089c1..d8d5104 100644 --- a/website/docs/quick-start-guide.md +++ b/website/docs/quick-start-guide.md @@ -131,6 +131,11 @@ values={[ And you can see a new file generated at `~/Desktop/sales.online_order.sql` ```sql +-- workflow=ods__t_fact_online_order +-- period=1440 +-- loadType=incremental +-- logDrivenType=timewindow + -- step=1 -- source=postgres -- dbName=postgres From 799250b330fd1db8af39b237451b10afcd1ea529 Mon Sep 17 00:00:00 2001 From: li chen Date: Tue, 2 Aug 2022 14:32:28 +0800 Subject: [PATCH 06/34] deleted bash code --- website/docs/quick-start-guide.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md index d8d5104..48715e7 100644 --- a/website/docs/quick-start-guide.md +++ b/website/docs/quick-start-guide.md @@ -271,12 +271,6 @@ values={[ ```bash -# run all job in batch by `spark-submit` -spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time="2021-09-30 00:00:00" --local --once - -# run all job locally -./gradlew :spark:run --args="batch-job -f ~/Desktop/sharp-etl-Quick-Start-Guide.xlsx --default-start-time='2021-09-30 00:00:00' --local --once" - # run single job by `spark-submit` spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar single-job --name=sales.online_order --period=1440 --default-start-time="2021-09-30 00:00:00" --local --once From a12de1b1ca3fa502134d15954d2ea560158ec104 Mon Sep 17 00:00:00 2001 From: li chen Date: Tue, 2 Aug 2022 14:33:01 +0800 Subject: [PATCH 07/34] deleted bash code --- website/docs/quick-start-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md index 48715e7..a9ba322 100644 --- a/website/docs/quick-start-guide.md +++ b/website/docs/quick-start-guide.md @@ -266,7 +266,7 @@ Then we will run a sample job which reads data from `sales.online_order` table a From ec20ae013b1721d2aba9489e2fe05cf0d35258c7 Mon Sep 17 00:00:00 2001 From: li chen Date: Tue, 2 Aug 2022 14:39:13 +0800 Subject: [PATCH 08/34] fixed: delete unuse --- website/docs/quick-start-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/quick-start-guide.md b/website/docs/quick-start-guide.md index a9ba322..48715e7 100644 --- a/website/docs/quick-start-guide.md +++ b/website/docs/quick-start-guide.md @@ -266,7 +266,7 @@ Then we will run a sample job which reads data from `sales.online_order` table a From 168bcfb323c6688597d69c54d24429c9cb003487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Tue, 2 Aug 2022 18:39:41 +0800 Subject: [PATCH 09/34] Add sharp etl logo --- website/docusaurus.config.js | 18 ++++++++++-------- website/static/img/docusaurus.png | Bin 5142 -> 0 bytes website/static/img/favicon.ico | Bin 3626 -> 175339 bytes website/static/img/sharp_etl.png | Bin 0 -> 27999 bytes 4 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 website/static/img/docusaurus.png create mode 100644 website/static/img/sharp_etl.png diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 67d91e2..142d922 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -51,7 +51,7 @@ const config = { title: 'Sharp ETL', logo: { alt: 'Sharp ETL Logo', - src: 'img/logo.svg', + src: 'img/sharp_etl.png', }, items: [ { @@ -99,19 +99,21 @@ const config = { ], }, ], - logo: { - alt: 'Sharp ETL Logo', - src: '/img/meta_opensource_logo_negative.svg', - href: 'https://github.com/SharpData/SharpETL', - }, - copyright: `Copyright © ${new Date().getFullYear()} Sharp Data, Built with Docusaurus.`, + // logo: { + // alt: 'Sharp ETL Logo', + // src: '/img/sharp_etl.png', + // href: 'https://github.com/SharpData/SharpETL', + // width: 128, + // height: 128, + // }, + copyright: `Copyright © ${new Date().getFullYear()} Sharp Data`, }, prism: { theme: require('prism-react-renderer/themes/dracula'), additionalLanguages: ['java', 'scala', 'sql'], }, announcementBar: { - id: 'announcementBar', + id: 'announcementBar-2', content: '⭐️ If you like Sharp ETL, give it a star on GitHub! ⭐', }, diff --git a/website/static/img/docusaurus.png b/website/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 zcma)=cTf{R(}xj7f`AaDml%oxrAm_`5IRVc-jPtHML-0kDIiip57LWD@4bW~(nB|) z34|^sbOZqj<;8ct`Tl-)=Jw`pZtiw=e$UR_Mn2b8rM$y@hlq%XQe90+?|Mf68-Ux_ zzTBiDn~3P%oVt>{f$z+YC7A)8ak`PktoIXDkpXod+*gQW4fxTWh!EyR9`L|fi4YlH z{IyM;2-~t3s~J-KF~r-Z)FWquQCfG*TQy6w*9#k2zUWV-+tCNvjrtl9(o}V>-)N!) ziZgEgV>EG+b(j@ex!dx5@@nGZim*UfFe<+e;(xL|j-Pxg(PCsTL~f^br)4{n5?OU@ z*pjt{4tG{qBcDSa3;yKlopENd6Yth=+h9)*lkjQ0NwgOOP+5Xf?SEh$x6@l@ZoHoYGc5~d2>pO43s3R|*yZw9yX^kEyUV2Zw1%J4o`X!BX>CwJ zI8rh1-NLH^x1LnaPGki_t#4PEz$ad+hO^$MZ2 ziwt&AR}7_yq-9Pfn}k3`k~dKCbOsHjvWjnLsP1{)rzE8ERxayy?~{Qz zHneZ2gWT3P|H)fmp>vA78a{0&2kk3H1j|n59y{z@$?jmk9yptqCO%* zD2!3GHNEgPX=&Ibw?oU1>RSxw3;hhbOV77-BiL%qQb1(4J|k=Y{dani#g>=Mr?Uyd z)1v~ZXO_LT-*RcG%;i|Wy)MvnBrshlQoPxoO*82pKnFSGNKWrb?$S$4x+24tUdpb= zr$c3K25wQNUku5VG@A=`$K7%?N*K+NUJ(%%)m0Vhwis*iokN#atyu(BbK?+J+=H z!kaHkFGk+qz`uVgAc600d#i}WSs|mtlkuwPvFp) z1{Z%nt|NwDEKj1(dhQ}GRvIj4W?ipD76jZI!PGjd&~AXwLK*98QMwN&+dQN1ML(6< z@+{1`=aIc z9Buqm97vy3RML|NsM@A>Nw2=sY_3Ckk|s;tdn>rf-@Ke1m!%F(9(3>V%L?w#O&>yn z(*VIm;%bgezYB;xRq4?rY})aTRm>+RL&*%2-B%m; zLtxLTBS=G!bC$q;FQ|K3{nrj1fUp`43Qs&V!b%rTVfxlDGsIt3}n4p;1%Llj5ePpI^R} zl$Jhx@E}aetLO!;q+JH@hmelqg-f}8U=XnQ+~$9RHGUDOoR*fR{io*)KtYig%OR|08ygwX%UqtW81b@z0*`csGluzh_lBP=ls#1bwW4^BTl)hd|IIfa zhg|*M%$yt@AP{JD8y!7kCtTmu{`YWw7T1}Xlr;YJTU1mOdaAMD172T8Mw#UaJa1>V zQ6CD0wy9NEwUsor-+y)yc|Vv|H^WENyoa^fWWX zwJz@xTHtfdhF5>*T70(VFGX#8DU<^Z4Gez7vn&4E<1=rdNb_pj@0?Qz?}k;I6qz@| zYdWfcA4tmI@bL5JcXuoOWp?ROVe*&o-T!><4Ie9@ypDc!^X&41u(dFc$K$;Tv$c*o zT1#8mGWI8xj|Hq+)#h5JToW#jXJ73cpG-UE^tsRf4gKw>&%Z9A>q8eFGC zG@Iv(?40^HFuC_-%@u`HLx@*ReU5KC9NZ)bkS|ZWVy|_{BOnlK)(Gc+eYiFpMX>!# zG08xle)tntYZ9b!J8|4H&jaV3oO(-iFqB=d}hGKk0 z%j)johTZhTBE|B-xdinS&8MD=XE2ktMUX8z#eaqyU?jL~PXEKv!^) zeJ~h#R{@O93#A4KC`8@k8N$T3H8EV^E2 z+FWxb6opZnX-av5ojt@`l3TvSZtYLQqjps{v;ig5fDo^}{VP=L0|uiRB@4ww$Eh!CC;75L%7|4}xN+E)3K&^qwJizphcnn=#f<&Np$`Ny%S)1*YJ`#@b_n4q zi%3iZw8(I)Dzp0yY}&?<-`CzYM5Rp+@AZg?cn00DGhf=4|dBF8BO~2`M_My>pGtJwNt4OuQm+dkEVP4 z_f*)ZaG6@t4-!}fViGNd%E|2%ylnzr#x@C!CrZSitkHQ}?_;BKAIk|uW4Zv?_npjk z*f)ztC$Cj6O<_{K=dPwO)Z{I=o9z*lp?~wmeTTP^DMP*=<-CS z2FjPA5KC!wh2A)UzD-^v95}^^tT<4DG17#wa^C^Q`@f@=jLL_c3y8@>vXDJd6~KP( zurtqU1^(rnc=f5s($#IxlkpnU=ATr0jW`)TBlF5$sEwHLR_5VPTGiO?rSW9*ND`bYN*OX&?=>!@61{Z4)@E;VI9 zvz%NmR*tl>p-`xSPx$}4YcdRc{_9k)>4Jh&*TSISYu+Y!so!0JaFENVY3l1n*Fe3_ zRyPJ(CaQ-cNP^!3u-X6j&W5|vC1KU!-*8qCcT_rQN^&yqJ{C(T*`(!A=))=n%*-zp_ewRvYQoJBS7b~ zQlpFPqZXKCXUY3RT{%UFB`I-nJcW0M>1^*+v)AxD13~5#kfSkpWys^#*hu)tcd|VW zEbVTi`dbaM&U485c)8QG#2I#E#h)4Dz8zy8CLaq^W#kXdo0LH=ALhK{m_8N@Bj=Um zTmQOO*ID(;Xm}0kk`5nCInvbW9rs0pEw>zlO`ZzIGkB7e1Afs9<0Z(uS2g*BUMhp> z?XdMh^k}k<72>}p`Gxal3y7-QX&L{&Gf6-TKsE35Pv%1 z;bJcxPO+A9rPGsUs=rX(9^vydg2q`rU~otOJ37zb{Z{|)bAS!v3PQ5?l$+LkpGNJq zzXDLcS$vMy|9sIidXq$NE6A-^v@)Gs_x_3wYxF%y*_e{B6FvN-enGst&nq0z8Hl0< z*p6ZXC*su`M{y|Fv(Vih_F|83=)A6ay-v_&ph1Fqqcro{oeu99Y0*FVvRFmbFa@gs zJ*g%Gik{Sb+_zNNf?Qy7PTf@S*dTGt#O%a9WN1KVNj`q$1Qoiwd|y&_v?}bR#>fdP zSlMy2#KzRq4%?ywXh1w;U&=gKH%L~*m-l%D4Cl?*riF2~r*}ic9_{JYMAwcczTE`!Z z^KfriRf|_YcQ4b8NKi?9N7<4;PvvQQ}*4YxemKK3U-7i}ap8{T7=7`e>PN7BG-Ej;Uti2$o=4T#VPb zm1kISgGzj*b?Q^MSiLxj26ypcLY#RmTPp+1>9zDth7O?w9)onA%xqpXoKA-`Jh8cZ zGE(7763S3qHTKNOtXAUA$H;uhGv75UuBkyyD;eZxzIn6;Ye7JpRQ{-6>)ioiXj4Mr zUzfB1KxvI{ZsNj&UA`+|)~n}96q%_xKV~rs?k=#*r*7%Xs^Hm*0~x>VhuOJh<2tcb zKbO9e-w3zbekha5!N@JhQm7;_X+J!|P?WhssrMv5fnQh$v*986uWGGtS}^szWaJ*W z6fLVt?OpPMD+-_(3x8Ra^sX~PT1t5S6bfk@Jb~f-V)jHRul#Hqu;0(+ER7Z(Z4MTR z+iG>bu+BW2SNh|RAGR2-mN5D1sTcb-rLTha*@1@>P~u;|#2N{^AC1hxMQ|(sp3gTa zDO-E8Yn@S7u=a?iZ!&&Qf2KKKk7IT`HjO`U*j1~Df9Uxz$~@otSCK;)lbLSmBuIj% zPl&YEoRwsk$8~Az>>djrdtp`PX z`Pu#IITS7lw07vx>YE<4pQ!&Z^7L?{Uox`CJnGjYLh1XN^tt#zY*0}tA*a=V)rf=&-kLgD|;t1D|ORVY}8 F{0H{b<4^zq diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico index c01d54bcd39a5f853428f3cd5aa0f383d963c484..d3d25208464e15e6435035aac6328e5392acb3f6 100644 GIT binary patch literal 175339 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 Q+-KyZ?iro@V|F+H3GkrhAOHXW literal 0 HcmV?d00001 From bfa10ccbeb51ce5c96124ae7e791b6758cb9edf0 Mon Sep 17 00:00:00 2001 From: li chen Date: Wed, 3 Aug 2022 10:05:04 +0800 Subject: [PATCH 10/34] update end-to-end-showcase.md --- website/docs/end-to-end-showcase.md | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/website/docs/end-to-end-showcase.md b/website/docs/end-to-end-showcase.md index ff157ca..c863099 100644 --- a/website/docs/end-to-end-showcase.md +++ b/website/docs/end-to-end-showcase.md @@ -277,15 +277,15 @@ values ('AAA', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利 3. 通过这个命令生成任务脚本 ```bash -./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/ods.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks" +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/ods.xlsx --output ~/Downloads/SharpETL/spark/src/main/resources/tasks" ``` 4. 你看到如下日志表示任务脚本已经生成好了 ```log -2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.order__t_order.sql -2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.user__t_user.sql -2022/04/09 15:00:32 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.product__t_product.sql +2022/08/02 17:23:51 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/ods__t_order.sql +2022/08/02 17:23:51 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/ods__t_user.sql +2022/08/02 17:23:51 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/ods__t_product.sql ``` 5. 准备连接信息 @@ -301,7 +301,7 @@ sales.postgres.fetchsize=10 6. 通过脚本启动任务 ```bash -./gradlew :spark:run --args="batch-job --names=sales.order__t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --once" +./gradlew :spark:run --args="batch-job --names=ods__t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --once" ``` 运行结果: @@ -309,7 +309,7 @@ sales.postgres.fetchsize=10 ```log Total jobs: 1, success: 1, failed: 0, skipped: 0 Details: -job name: sales.order__t_order SUCCESS x 1 +job name: ods__t_order SUCCESS x 1 ``` ### 运行从ods到dwd的任务 @@ -319,15 +319,15 @@ job name: sales.order__t_order SUCCESS x 1 2. 通过这个命令生成任务脚本 ```bash -./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/dwd.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks" +./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/dwd.xlsx --output ~/Downloads/SharpETL/spark/src/main/resources/tasks" ``` 3. 你看到如下日志表示任务脚本已经生成好了 ```log -2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_order_t_fact_order.sql -2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_user_t_dim_user.sql -2022/04/09 16:14:50 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/sharp-etl/spark/src/main/resources/tasks/t_product_t_dim_product.sql +2022/08/03 09:02:26 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/t_order_t_fact_order.sql +2022/08/03 09:02:26 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/t_user_t_dim_user.sql +2022/08/03 09:02:26 INFO [ETLLogger] - Write sql file to /Users/izhangzhihao/Downloads/SharpETL/spark/src/main/resources/tasks/t_product_t_dim_product.sql ``` 4. 通过脚本启动任务 @@ -349,6 +349,11 @@ job name: t_order_t_fact_order SUCCESS x 1 1. 手动创建两个step,分别代表两个report的需求, 华为mate40-v2真实的销量表,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_actual_hive.sql` ```sql +-- workflow=report__t_fact_order_report_actual +-- period=1440 +-- loadType=incremental +-- logDrivenType=timewindow + -- step=1 -- source=hive -- dbName=dwd @@ -378,6 +383,10 @@ from dwd.t_fact_order fact 2. 手动创建两个step,分别代表两个report的需求, 华为mate40-v2算上v1的销量,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_latest_hive.sql` ```sql +-- workflow=report__t_fact_order_report_latest +-- period=1440 +-- loadType=incremental +-- logDrivenType=timewindow -- step=1 -- source=hive @@ -403,6 +412,7 @@ from dwd.t_fact_order fact inner join dim.t_dim_product dim on fact.product_id = dim.product_id and fact.is_latest = '1' inner join (select * from dim.t_dim_product dim_latest where is_latest = '1') dim2 on dim.mid = dim2.mid and fact.is_latest = '1'; +mid = dim2.mid and fact.is_latest = '1'; ``` 2. 通过脚本启动任务 From 1cf56c1bb2b1ae746786d3367bb0cf79a10f665d Mon Sep 17 00:00:00 2001 From: li chen Date: Wed, 3 Aug 2022 10:08:32 +0800 Subject: [PATCH 11/34] delete unused sql --- website/docs/end-to-end-showcase.md | 1 - 1 file changed, 1 deletion(-) diff --git a/website/docs/end-to-end-showcase.md b/website/docs/end-to-end-showcase.md index c863099..15c52c9 100644 --- a/website/docs/end-to-end-showcase.md +++ b/website/docs/end-to-end-showcase.md @@ -412,7 +412,6 @@ from dwd.t_fact_order fact inner join dim.t_dim_product dim on fact.product_id = dim.product_id and fact.is_latest = '1' inner join (select * from dim.t_dim_product dim_latest where is_latest = '1') dim2 on dim.mid = dim2.mid and fact.is_latest = '1'; -mid = dim2.mid and fact.is_latest = '1'; ``` 2. 通过脚本启动任务 From 2731dd2b75e0c99e107f9bc02c54afac66d731d2 Mon Sep 17 00:00:00 2001 From: li chen Date: Wed, 3 Aug 2022 11:05:56 +0800 Subject: [PATCH 12/34] update end-to-end-showcase-postgres.md --- website/docs/end-to-end-showcase-postgres.md | 34 +++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/website/docs/end-to-end-showcase-postgres.md b/website/docs/end-to-end-showcase-postgres.md index a630283..7d63e92 100644 --- a/website/docs/end-to-end-showcase-postgres.md +++ b/website/docs/end-to-end-showcase-postgres.md @@ -288,15 +288,15 @@ values ('AAA', 'p1', '华为', 'mate40', '上架', 'u1', '张三', 12, '胜利 2. 通过这个命令生成任务脚本 ```bash -./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/postgres-ods.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks/" +./gradlew :spark:run --args="generate-ods-sql -f ~/Desktop/postgres-ods.xlsx --output ~/Downloads/SharpETL/spark/src/main/resources/tasks/" ``` 3. 你看到如下日志表示任务脚本已经生成好了 ```log -2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.order__ods.t_order.sql -2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.user__ods.t_user.sql -2022/04/10 14:24:41 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks/sales.product__ods.t_product.sql +2022/08/03 10:54:49 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/SharpETL/spark/src/main/resources/tasks/ods__ods.t_order.sql +2022/08/03 10:54:49 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/SharpETL/spark/src/main/resources/tasks/ods__ods.t_user.sql +2022/08/03 10:54:49 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/SharpETL/spark/src/main/resources/tasks/ods__ods.t_product.sql ``` 4. 创建ods表 @@ -315,7 +315,7 @@ sales.postgres.fetchsize=10 6. 通过脚本启动任务 ```bash -./gradlew :spark:run --args="single-job --name=sales.order__ods.t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --local --once" +./gradlew :spark:run --args="single-job --name=ods__ods.t_order --period=1440 --default-start-time='2022-04-08 00:00:00' --local --once" ``` @@ -327,13 +327,13 @@ sales.postgres.fetchsize=10 2. 通过这个命令生成任务脚本 ```bash -./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/postgres-dwd.xlsx --output ~/Downloads/sharp-etl/spark/src/main/resources/tasks/" +./gradlew :spark:run --args="generate-dwd-sql -f ~/Desktop/postgres-dwd.xlsx --output ~/Downloads/SharpETL/spark/src/main/resources/tasks/" ``` 3. 你看到如下日志表示任务脚本已经生成好了 ```log -2022/04/10 14:27:42 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/sharp-etl/spark/src/main/resources/tasks//ods.t_order_dwd.t_fact_order.sql +2022/08/03 10:58:10 INFO [ETLLogger] - Write sql file to /Users/xiaoqiangma/Downloads/SharpETL/spark/src/main/resources/tasks/ods.t_order_dwd.t_fact_order.sql ``` 4. 创建dwd/dim表 @@ -341,7 +341,7 @@ sales.postgres.fetchsize=10 6. 通过脚本启动任务 ```bash -./gradlew :spark:run --args="single-job --name=ods.t_order_dwd.t_fact_order --period=1440 --upstream_job_name=sales.order__ods.t_order --local" +./gradlew :spark:run --args="single-job --name=ods.t_order_dwd.t_fact_order --period=1440 --local" ``` @@ -349,9 +349,14 @@ sales.postgres.fetchsize=10 ### 运行从dwd到report的任务 1. 手动创建两个step,分别代表两个report的需求: - 1. report层 华为mate40-v2真实的销量表,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_actual.sql` + 1. report层 华为mate40-v2真实的销量表,并将其放在`~/Downloads/SharpETL/spark/src/main/resources/tasks/`路径下,命名为`order_report_actual.sql` ```sql + -- workflow=order_report_actual + -- period=1440 + -- loadType=incremental + -- logDrivenType=timewindow + -- step=1 -- sourceConfig -- dataSourceType=postgres @@ -381,9 +386,14 @@ sales.postgres.fetchsize=10 on fact.product_id = dim.product_id; ``` - 2. report层 华为mate40-v2算上v1的销量,并将其放在`~/Downloads/sharp-etl/spark/src/main/resources/tasks/`路径下,命名为`order_report_latest.sql` + 2. report层 华为mate40-v2算上v1的销量,并将其放在`~/Downloads/SharpETL/spark/src/main/resources/tasks/`路径下,命名为`order_report_latest.sql` ```sql + -- workflow=order_report_latest + -- period=1440 + -- loadType=incremental + -- logDrivenType=timewindow + -- step=1 -- sourceConfig -- dataSourceType=postgres @@ -416,10 +426,10 @@ sales.postgres.fetchsize=10 2. 通过脚本启动任务 ```bash -./gradlew :spark:run --args="single-job --name=order_report_actual --period=1440 --upstream_job_name=ods.t_order_dwd.t_fact_order --local" +./gradlew :spark:run --args="single-job --name=order_report_actual --period=1440 --local" ``` ```bash -./gradlew :spark:run --args="single-job --name=order_report_latest --period=1440 --upstream_job_name=ods.t_order_dwd.t_fact_order --local" +./gradlew :spark:run --args="single-job --name=order_report_latest --period=1440 --local" ``` From ae79e1e767fd4c32f3376e62cf048df392617e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 3 Aug 2022 15:38:30 +0800 Subject: [PATCH 13/34] Update docker setup doc --- website/docs/docker-setup.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/website/docs/docker-setup.md b/website/docs/docker-setup.md index bca9fe0..565eddb 100644 --- a/website/docs/docker-setup.md +++ b/website/docs/docker-setup.md @@ -24,8 +24,15 @@ To access local hive instance you need in `spark/build.gradle` ```diff --compile(project(":datasource:hive3")) -+compile(project(":datasource:hive2")) +-compileOnly(project(":datasource:hive3")) ++compileOnly(project(":datasource:hive2")) ++implementation "org.apache.spark:spark-hive_$scalaVersion:$sparkVersion" +``` + +in `datasource/hive2/build.gradle` + +```diff ++api 'org.apache.hive:hive-metastore:2.1.0' ``` add `hive-site.xml` in `spark/src/main/resources/hive-site.xml` From b8ee45d663f12863bf4b2719cab49fc6d95988ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 5 Aug 2022 11:10:38 +0800 Subject: [PATCH 14/34] Add new blog: why we need sharp etl --- website/blog/hello-blog.mdx | 19 -- website/blog/why-we-need-sharp-etl.md | 236 +++++++++++++++++ website/package.json | 4 +- website/yarn.lock | 348 +++++++++++++------------- 4 files changed, 412 insertions(+), 195 deletions(-) delete mode 100644 website/blog/hello-blog.mdx create mode 100644 website/blog/why-we-need-sharp-etl.md diff --git a/website/blog/hello-blog.mdx b/website/blog/hello-blog.mdx deleted file mode 100644 index 7fcffd2..0000000 --- a/website/blog/hello-blog.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -slug: hello sharp etl blog -title: hello sharp etl blog -tags: [sharp etl] ---- - -Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). - -:::tip - -Use the power of React to create interactive blog posts. - -```js - -``` - - - -::: diff --git a/website/blog/why-we-need-sharp-etl.md b/website/blog/why-we-need-sharp-etl.md new file mode 100644 index 0000000..0e62523 --- /dev/null +++ b/website/blog/why-we-need-sharp-etl.md @@ -0,0 +1,236 @@ +--- +slug: 为什么我们需要Sharp ETL +title: 为什么我们需要Sharp ETL +tags: [sharp etl] +--- + +## 导言 + +本文结合目前的数据工程实践,尝试展开数据工程实践中ETL的原则,并对Sharp ETL做简要介绍。 + +ETL或ELT是进行数据处理的常见手段之一,随着数据平台渡过蛮荒时代开始精细化治理,原始的编码方式和无组织的SQL脚本已经不能满足需求。 + +## 之前的ETL有什么问题 + +常见的ETL形式有几种,这几种方式各有优劣,我们分别从几个维度展开一下: + +1. **代码方式** + +代码方式是非常常见的ETL编写方式,广泛适用于各种场景。 + +pros: + +* 代码编写的ETL更容易随意扩展、增加自定义逻辑和复用代码逻辑。 + +cons: + +* 但是代码就是代码,大多数代码都是命令式逻辑,并不容易维护和理解。 + +* 代码形式编写ETL会使得任务开发流程更加重量级,因为一旦修改实现逻辑,就需要重新部署jar包。考虑到安全因素,在一些企业内部的多租户平台上,上传新的jar包是需要审核的,整个流程就会在审核这里显著慢了下来。即使不需要审核,也需要手动部署到环境上,也有可能因为增加了新的逻辑影响了其他正常运行的任务。 + +2. **托拉拽** + +托拉拽在新兴云平台和企业自建平台上非常常见,几乎是所有平台的标配。 + +pros: + +* DAG形式也很容易理解,开发门槛低,只需要填入参数,轻松实现数据接入、数据去重等等逻辑。 +* 增加、修改逻辑都相当轻量级,甚至大多数平台也实现了版本管理,可以像管理代码一样管理任务,可以轻松做到回退版本、解决冲突等类似git的操作。 +* 部分平台可以通过小的组件组织成为更大的组件来复用ETL的逻辑。 + +cons: + +* 自定义逻辑较困难,甚至在一些封闭性较高的平台上增加新的数据源都是问题。 +* 界面操作难以自动化,当需要批量针对若干任务进行某项操作时,图形化界面就不方便了。有时我们会遇到某个业务系统内需要的ETL的逻辑都很类似,但是任务数量很多,手动托拉拽很费事也容易出错。 + +3. **纯SQL脚本** + +pros: + +* 经过合适拆分的SQL逻辑更容易理解(单条SQL的行数需要有限制),声明式实现更加表意,基本上人人都会SQL,门槛很低。 + +cons: + +* 逻辑难以复用,经常需要复制另外一段SQL的逻辑。 +* 缺乏系统性编排,纯SQL脚本往往比较散乱。 +* 扩展受限,虽然各种SQL方言基本上都是支持UDF(User Defined Function)的,但是扩展能力仍然比不上代码(比如需要和某个HTTP API交互)。 + +### 数据工程实践缺失 + +我们认为,在ETL开发中需要包括这些工程实践: + +* 通过事实表和维度表的关联来检查数据一致性、完整性 +* 通过特殊值来记录表与表关联过程中的未知值(关联不上)和不适用值(不合理值) +* 根据数据质量检查规则在日志中分级分类记录数据质量问题 +* 通过记录调度日志来与特定调度服务解耦合,增强调度的鲁棒性,同时也能够结构化的记录任务运行过程中的信息,方便排错 + +而无论是代码编写、托拉拽还是纯SQL脚本都因为过多人工操作使得这些数据工程实践难以统一,常常有以下问题: + +* 只做关联而并不记录数据一致性、完整性问题。甚至缺乏最基本的关联。 +* 由于时间紧张、实现复杂等因素,数据质量检查操作缺失,导致进入数仓的数据缺乏最基本的质量保证。 +* 数据运维难以自动化,任务失败后多需要人工介入后才可以使任务恢复正常。 +* 任务调度过度依赖于已有调度服务,缺乏防呆设计,难以解决重复调度的问题(假如调度服务出现异常,任务被重复调度了,结果就是重复计算) +* 错误排查过度依赖于任务执行日志,排查错误多依赖于不停的推断、加日志和尝试。如果是纯SQL脚本,则经常遇到几千行的SQL任务失败,然后不知道从哪里开始debug的窘境。 + +## 理想中的ETL应该什么样子? + +近些年来最火热的莫过于流处理、流式ETL这些概念。虽然这篇文章与流或者批处理没有直接关系,还是要指出,无论是流式处理还是批处理,最基本的数据工程实践都需要具备,这些数据工程实践都是实际实践中不可或缺的一部分。以下讨论且抛开流式或批处理不谈。 + +理想中的ETL应该能结合以上集中实现方式的优点,摒弃缺点,我们可以来构思一下: + +* 拥有SQL的语义化表达能力 +* 支持通过自定义代码逻辑扩展 +* 支持代码优先、版本管理 +* 在代码优先的基础上能够支持可视化工具构建 +* 能够对过长的SQL进行拆解,降低理解难度 +* 内置统一且标准的数据工程实践 + * 事实表和维度表的关联检查 + * 记录表与表关联过程中的未知值和不适用值 + * 数据质量问题分级分类记录 + * 通过调度日志解耦合调度系统 + + +### Sharp ETL workflow示意 + +下面示意一下Sharp ETL的一个workflow,我会分别对于这些step做出解释。 + +workflow一开始是一个header,描述workflow本身的属性,包括workflow名称、增量还是全量、日志驱动方式、通知方式等等。然后是一系列step,每个step都有自己的输入输出。 + +第一个step表示从hive中取数据出来写到temp表以便后续使用,这个SQL中也用到了Sharp ETL内置的变量功能,`${YEAR}` `${MONTH}` `${DAY}` 这些变量都会在运行时被替换为真实的值,真实值通过我们内置的调度日志来计算得出。这里请注意在source的options中有配置数据质量检查,这里只需要引用不同的数据质量检查规则,即可对相应字段进行数据质量检查,并根据规则定义的级别进行分级分类管理 + +第二个step是进行事实表和维度表的关联,并通过`-1`来记录未关联上的数据。 + +第三个step是对temp的数据做预处理。 + +第四个step是对hive数据更新的特殊处理,在hive上如果要更新数据就需要把数据对应的分区全部更新掉,所以这里是在计算本次数据涉及到更新哪些分区,以方便后续将这些分区的数据取出来做更新。 + +第五个step用到了上一个step拼接的查询条件参数,将此次更新设计到的数据分区都取出来。 + +第六个step是通过Transformer功能调用一段代码来实现拉链表,其实这段代码也是通过拼接SQL实现的,只不过拼接过程较为灵活,才以一个transformer来封装。实际上transformer中可以执行任意代码。transformer本身也有输出,这里我们将输出覆盖到对应的分区,完成任务。 + + +```sql +-- workflow=fact_device +-- loadType=incremental +-- logDrivenType=timewindow + +-- step=1 +-- source=hive +-- dbName=ods +-- tableName=t_device +-- options +-- idColumn=order_id +-- column.device_id.qualityCheckRules=power null check(error) +-- column.status.qualityCheckRules=empty check(warn) +-- target=temp +-- tableName=t_device__extracted +-- writeMode=overwrite +select + `device_id` as `device_id`, + `manufacturer` as `manufacturer`, + `status` as `status`, + `online` as `online`, + `create_time` as `create_time`, + `update_time` as `update_time`, + `year` as `year`, + `month` as `month`, + `day` as `day` +from `ods`.`t_device` +where `year` = '${YEAR}' + and `month` = '${MONTH}' + and `day` = '${DAY}'; + +-- step=2 +-- source=temp +-- tableName=t_device__extracted +-- target=temp +-- tableName=t_device__joined +-- writeMode=append +select + `t_device__extracted`.*, + case when `t_dim_user`.`user_code` is null then '-1' + else `t_dim_user`.`user_code` + end as `user_id` +from `t_device__extracted` +left join `dim`.`t_dim_user` `t_dim_user` + on `t_device__extracted`.`user_id` = `t_dim_user`.`user_code` + and `t_device__extracted`.`create_time` >= `t_dim_user`.`start_time` + and (`t_device__extracted`.`create_time` < `t_dim_user`.`end_time` + or `t_dim_user`.`end_time` is null); + +-- step=3 +-- source=temp +-- tableName=t_device__joined +-- target=temp +-- tableName=t_device__target_selected +-- writeMode=overwrite +select + `device_id`, + `manufacturer`, + `user_id`, + `status`, + `online`, + `create_time`, + `update_time`, + `year`, + `month`, + `day` +from `t_device__joined`; + +-- step=4 +-- source=hive +-- dbName=dwd +-- tableName=t_fact_device +-- target=variables +select concat('where (', + ifEmpty( + concat_ws(')\n or (', collect_set(concat_ws(' and ', concat('`year` = ', `year`), concat('`month` = ', `month`), concat('`day` = ', `day`)))), + '1 = 1'), + ')') as `DWD_UPDATED_PARTITION` +from ( + select + dwd.* + from `dwd`.`t_fact_device` dwd + left join `t_device__target_selected` incremental_data on dwd.device_id = incremental_data.device_id + where incremental_data.device_id is not null + and dwd.is_latest = 1 +); + +-- step=5 +-- source=hive +-- dbName=dwd +-- tableName=t_fact_device +-- target=temp +-- tableName=t_fact_device__changed_partition_view +select * +from `dwd`.`t_fact_device` +${DWD_UPDATED_PARTITION}; + +-- step=6 +-- source=transformation +-- className=com.github.sharpdata.sharpetl.spark.transformation.SCDTransformer +-- methodName=transform +-- createTimeField=create_time +-- dwUpdateType=incremental +-- dwViewName=t_fact_device__changed_partition_view +-- odsViewName=t_device__target_selected +-- partitionField=create_time +-- partitionFormat=year/month/day +-- primaryFields=device_id +-- surrogateField= +-- timeFormat=yyyy-MM-dd HH:mm:ss +-- updateTimeField=update_time +-- transformerType=object +-- target=hive +-- dbName=dwd +-- tableName=t_fact_device +-- writeMode=overwrite +``` + +## One more thing! + +其实上一段SQL是通过代码生成的,并非人工手写!在实际操作中,只需要填写我们的excel [ods模板](https://docs.google.com/spreadsheets/d/1Zn_Q-QUTf6us4RwdgUgBosXL09-D-TowmgwWlDskvlA) 或 [dwd模板](https://docs.google.com/spreadsheets/d/1CetkqBsXj_E8oZBsws9iGdaJB1QJUajnwqH4FoKhXKA)即可生成代码,可以成倍的提高开发效率。 + +后续文章还将对内置的数据工程实践(包括但不限于“日志驱动”、“数据质量分级分类”等)和 Sharp ETL的实现等等进行介绍 + + diff --git a/website/package.json b/website/package.json index beccf8e..9df658d 100644 --- a/website/package.json +++ b/website/package.json @@ -18,8 +18,8 @@ "format:diff": "prettier --config .prettierrc --list-different \"**/*.{js,jsx,ts,tsx,md,mdx}\"" }, "dependencies": { - "@docusaurus/core": "2.0.0-rc.1", - "@docusaurus/preset-classic": "2.0.0-rc.1", + "@docusaurus/core": "2.0.1", + "@docusaurus/preset-classic": "2.0.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "react": "^17.0.2", diff --git a/website/yarn.lock b/website/yarn.lock index 5f65367..8960980 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1207,10 +1207,10 @@ "@docsearch/css" "3.1.1" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-rc.1.tgz#828d93d241171565d8947a9ab404091e04759141" - integrity sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ== +"@docusaurus/core@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.1.tgz#a2b0d653e8f18eacddda4778a46b638dd1f0f45c" + integrity sha512-Prd46TtZdiixlTl8a+h9bI5HegkfREjSNkrX2rVEwJZeziSz4ya+l7QDnbnCB2XbxEG8cveFo/F9q5lixolDtQ== dependencies: "@babel/core" "^7.18.6" "@babel/generator" "^7.18.7" @@ -1222,13 +1222,13 @@ "@babel/runtime" "^7.18.6" "@babel/runtime-corejs3" "^7.18.6" "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" + "@docusaurus/cssnano-preset" "2.0.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/mdx-loader" "2.0.1" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-common" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" autoprefixer "^10.4.7" @@ -1284,33 +1284,33 @@ webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-rc.1.tgz#76bbd7f6912779a0667f8f2fd8fc1a05618a6148" - integrity sha512-9/KmQvF+eTlMqUqG6UcXbRgxbGed/8bQInXuKEs+95/jI6jO/3xSzuRwuHHHP0naUvSVWjnNI9jngPrQerXE5w== +"@docusaurus/cssnano-preset@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.1.tgz#4d0c49338cf3aa88c5bd7cffbf77654db8e1e3b2" + integrity sha512-MCJ6rRmlqLmlCsZIoIxOxDb0rYzIPEm9PYpsBW+CGNnbk+x8xK+11hnrxzvXHqDRNpxrq3Kq2jYUmg/DkqE6vg== dependencies: cssnano-preset-advanced "^5.3.8" postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" tslib "^2.4.0" -"@docusaurus/logger@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-rc.1.tgz#db95e9b15bc243695830a5b791c0eff705ef1b54" - integrity sha512-daa3g+SXuO9K60PVMiSUmDEK9Vro+Ed7i7uF8CH6QQJLcNZy/zJc0Xz62eH7ip1x77fmeb6Rg4Us1TqTFc9AbQ== +"@docusaurus/logger@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.1.tgz#78a940a333d2f654fd9dea24db2c962034d4b1ff" + integrity sha512-wIWseCKko1w/WARcDjO3N/XoJ0q/VE42AthP0eNAfEazDjJ94NXbaI6wuUsuY/bMg6hTKGVIpphjj2LoX3g6dA== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-rc.1.tgz#e78d7d416aacc289f2427c5ccdb9145820acb0cb" - integrity sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg== +"@docusaurus/mdx-loader@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.1.tgz#cc73690ca5d356687d9e75740560b4159cd5cdb5" + integrity sha512-tdNeljdilXCmhbaEND3SAgsqaw/oh7v9onT5yrIrL26OSk2AFwd+MIi4R8jt8vq33M0R4rz2wpknm0fQIkDdvQ== dependencies: "@babel/parser" "^7.18.8" "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/utils" "2.0.1" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -1325,13 +1325,13 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-rc.1.tgz#c7839ac15b7712a8d86353a3253918f63ffbea09" - integrity sha512-la7D8ggFP8I5nOp/Epl6NqTeDWcbofPVMOaVisRxQbx5iuF9Al+AITbaDgm4CXpFLJACsqhsXD5W4BnKX8ZxfA== +"@docusaurus/module-type-aliases@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.1.tgz#44d7132297bedae0890695b0e7ebbe14a73e26d1" + integrity sha512-f888ylnxHAM/3T8p1lx08+lTc6/g7AweSRfRuZvrVhHXj3Tz/nTTxaP6gPTGkJK7WLqTagpar/IGP6/74IBbkg== dependencies: "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.0.0-rc.1" + "@docusaurus/types" "2.0.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1339,18 +1339,18 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-rc.1.tgz#8ae5d5ec2da08c583a057bf2754a5b9278b3eb08" - integrity sha512-BVVrAGZujpjS/0rarY2o24rlylRRh2NZuM65kg0JNkkViF79SeEHsepog7IuHyoqGWPm1N/I7LpEp7k+gowZzQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-content-blog@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.1.tgz#a37065e18ffd26e022ffb16a21ff28199140729e" + integrity sha512-/4ua3iFYcpwgpeYgHnhVGROB/ybnauLH2+rICb4vz/+Gn1hjAmGXVYq1fk8g49zGs3uxx5nc0H5bL9P0g977IQ== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/mdx-loader" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-common" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" @@ -1361,18 +1361,18 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-docs@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-rc.1.tgz#2dda88166bf21b0eeb3821ef748059b20c8c49f7" - integrity sha512-Yk5Hu6uaw3tRplzJnbDygwRhmZ3PCzEXD4SJpBA6cPC73ylfqOEh6qhiU+BWhMTtDXNhY+athk5Kycfk3DW1aQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-content-docs@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.1.tgz#4059591b4bff617e744e856ca680674b27c0b98a" + integrity sha512-2qeBWRy1EjgnXdwAO6/csDIS1UVNmhmtk/bQ2s9jqjpwM8YVgZ8QVdkxFAMWXgZWDQdwWwdP1rnmoEelE4HknQ== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/mdx-loader" "2.0.1" + "@docusaurus/module-type-aliases" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" @@ -1383,84 +1383,84 @@ utility-types "^3.10.0" webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-rc.1.tgz#2be82f53d6c77e6aa66787726c30dc60b210e6f8" - integrity sha512-FdO79WC5hfWDQu3/CTFLRQzTNc0e5n+HNzavm2MNkSzGV08BFJ6RAkbPbtra5CWef+6iXZav6D/tzv2jDPvLzA== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-content-pages@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.1.tgz#013f2e66f80d19b5c95a2d941d67c7cdb67b7191" + integrity sha512-6apSVeJENnNecAH5cm5VnRqR103M6qSI6IuiP7tVfD5H4AWrfDNkvJQV2+R2PIq3bGrwmX4fcXl1x4g0oo7iwA== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/mdx-loader" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" fs-extra "^10.1.0" tslib "^2.4.0" webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-rc.1.tgz#73c06ad08d66810941e456d50b07be008f5235cb" - integrity sha512-aOsyYrPMbnsyqHwsVZ+0frrMRtnYqm4eaJpG4sC/6LYAJ07IDRQ9j3GOku2dKr5GsFK1Vx7VlE6ZLwe0MaGstg== +"@docusaurus/plugin-debug@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.1.tgz#2b2a473f8e01fd356e32236f753665b48209bcd4" + integrity sha512-jpZBT5HK7SWx1LRQyv9d14i44vSsKXGZsSPA2ndth5HykHJsiAj9Fwl1AtzmtGYuBmI+iXQyOd4MAMHd4ZZ1tg== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/core" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-rc.1.tgz#0136cc7534573ca56e023178ec2bda5c1e89ce71" - integrity sha512-f+G8z5OJWfg5QqWDLIdcN2SDoK5J5Gg8HMrqCI6Pfl+rxPb5I1niA+/UkAM+kMCpnekvhSt5AWz2fgkRenkPLA== +"@docusaurus/plugin-google-analytics@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.1.tgz#e3b84237aad2e94dcd1cf1810c1c9bc3d94f186d" + integrity sha512-d5qb+ZeQcg1Czoxc+RacETjLdp2sN/TAd7PGN/GrvtijCdgNmvVAtZ9QgajBTG0YbJFVPTeZ39ad2bpoOexX0w== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-rc.1.tgz#61698fdc41a4ace912fb8f6c834efd288edad3c0" - integrity sha512-yE1Et9hhhX9qMRnMJzpNq0854qIYiSEc2dZaXNk537HN7Q0rKkr/YONUHz2iqNYwPX2hGOY4LdpTxlMP88uVhA== +"@docusaurus/plugin-google-gtag@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.1.tgz#4cbcf9d520f7ec8124679fbe00867f2299a2f6bb" + integrity sha512-qiRufJe2FvIyzICbkjm4VbVCI1hyEju/CebfDKkKh2ZtV4q6DM1WZG7D6VoQSXL8MrMFB895gipOM4BwdM8VsQ== dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.1.tgz#0b638e774b253d90e9f2d11663e961250f557bc4" - integrity sha512-5JmbNpssUF03odFM4ArvIsrO9bv7HnAJ0VtefXhh0WBpaFs8NgI3rTkCTFimvtRQjDR9U2bh23fXz2vjQQz6oA== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/plugin-sitemap@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.1.tgz#6f8edb82b745b040d6b1495e2798396f63e50289" + integrity sha512-KcYuIUIp2JPzUf+Xa7W2BSsjLgN1/0h+VAz7D/C3RYjAgC5ApPX8wO+TECmGfunl/m7WKGUmLabfOon/as64kQ== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-common" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-rc.1.tgz#5e5b1cf80b3dd4e2c3f824c78a111f105858d853" - integrity sha512-5jjTVZkhArjyoNHwCI9x4PSG0zPmBJILjZLVrxPcHpm/K0ltkYcp6J3GxYpf5EbMuOh5+yCWM63cSshGcNOo3Q== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/plugin-debug" "2.0.0-rc.1" - "@docusaurus/plugin-google-analytics" "2.0.0-rc.1" - "@docusaurus/plugin-google-gtag" "2.0.0-rc.1" - "@docusaurus/plugin-sitemap" "2.0.0-rc.1" - "@docusaurus/theme-classic" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-search-algolia" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" +"@docusaurus/preset-classic@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.1.tgz#21a806e16b61026d2a0efa6ca97e17397065d894" + integrity sha512-nOoniTg46My1qdDlLWeFs55uEmxOJ+9WMF8KKG8KMCu5LAvpemMi7rQd4x8Tw+xiPHZ/sQzH9JmPTMPRE4QGPw== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/plugin-content-blog" "2.0.1" + "@docusaurus/plugin-content-docs" "2.0.1" + "@docusaurus/plugin-content-pages" "2.0.1" + "@docusaurus/plugin-debug" "2.0.1" + "@docusaurus/plugin-google-analytics" "2.0.1" + "@docusaurus/plugin-google-gtag" "2.0.1" + "@docusaurus/plugin-sitemap" "2.0.1" + "@docusaurus/theme-classic" "2.0.1" + "@docusaurus/theme-common" "2.0.1" + "@docusaurus/theme-search-algolia" "2.0.1" + "@docusaurus/types" "2.0.1" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1470,23 +1470,23 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-rc.1.tgz#4ab30745e6b03b0f277837debae786a0a83aee6a" - integrity sha512-qNiz7ieeq3AC+V8TbW6S63pWLJph1CbzWDDPTqxDLHgA8VQaNaSmJM8S92pH+yKALRb9u14ogjjYYc75Nj2JmQ== - dependencies: - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/types" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-common" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" +"@docusaurus/theme-classic@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.1.tgz#043b6fcd2ecb2aecd134419b198c9f519029d5e7" + integrity sha512-0jfigiqkUwIuKOw7Me5tqUM9BBvoQX7qqeevx7v4tkYQexPhk3VYSZo7aRuoJ9oyW5makCTPX551PMJzmq7+sw== + dependencies: + "@docusaurus/core" "2.0.1" + "@docusaurus/mdx-loader" "2.0.1" + "@docusaurus/module-type-aliases" "2.0.1" + "@docusaurus/plugin-content-blog" "2.0.1" + "@docusaurus/plugin-content-docs" "2.0.1" + "@docusaurus/plugin-content-pages" "2.0.1" + "@docusaurus/theme-common" "2.0.1" + "@docusaurus/theme-translations" "2.0.1" + "@docusaurus/types" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-common" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" "@mdx-js/react" "^1.6.22" clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" @@ -1501,17 +1501,17 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-rc.1.tgz#ea5d9732a16b03b488555e50107161bfa2abad98" - integrity sha512-1r9ZLKD9SeoCYVzWzcdR79Dia4ANlrlRjNl6uzETOEybjK6FF7yEa9Yra8EJcOCbi3coyYz5xFh/r1YHFTFHug== - dependencies: - "@docusaurus/mdx-loader" "2.0.0-rc.1" - "@docusaurus/module-type-aliases" "2.0.0-rc.1" - "@docusaurus/plugin-content-blog" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/plugin-content-pages" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" +"@docusaurus/theme-common@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.1.tgz#9594d58fbef11fe480967b5ce4cdbb3cd78d9ca3" + integrity sha512-I3b6e/ryiTQMsbES40cP0DRGnfr0E2qghVq+XecyMKjBPejISoSFEDn0MsnbW8Q26k1Dh/0qDH8QKDqaZZgLhA== + dependencies: + "@docusaurus/mdx-loader" "2.0.1" + "@docusaurus/module-type-aliases" "2.0.1" + "@docusaurus/plugin-content-blog" "2.0.1" + "@docusaurus/plugin-content-docs" "2.0.1" + "@docusaurus/plugin-content-pages" "2.0.1" + "@docusaurus/utils" "2.0.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1521,19 +1521,19 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-rc.1.tgz#e78c0aeaea6a3717ae3a6ecd75a8652bd7c8e974" - integrity sha512-H5yq6V/B4qo6GZrDKMbeSpk3T9e9K2MliDzLonRu0w3QHW9orVGe0c/lZvRbGlDZjnsOo7XGddhXXIDWGwnpaA== +"@docusaurus/theme-search-algolia@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz#0aab8407b2163f67eb4c48f1de33944e1695fa74" + integrity sha512-cw3NaOSKbYlsY6uNj4PgO+5mwyQ3aEWre5RlmvjStaz2cbD15Nr69VG8Rd/F6Q5VsCT8BvSdkPDdDG5d/ACexg== dependencies: "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.0.0-rc.1" - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/plugin-content-docs" "2.0.0-rc.1" - "@docusaurus/theme-common" "2.0.0-rc.1" - "@docusaurus/theme-translations" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" - "@docusaurus/utils-validation" "2.0.0-rc.1" + "@docusaurus/core" "2.0.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/plugin-content-docs" "2.0.1" + "@docusaurus/theme-common" "2.0.1" + "@docusaurus/theme-translations" "2.0.1" + "@docusaurus/utils" "2.0.1" + "@docusaurus/utils-validation" "2.0.1" algoliasearch "^4.13.1" algoliasearch-helper "^3.10.0" clsx "^1.2.1" @@ -1543,18 +1543,18 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-rc.1.tgz#bd647f78c741ee7f6c6d2cbbd3e3f282ef2f89ad" - integrity sha512-JLhNdlnbQhxVQzOnLyiCaTzKFa1lpVrM3nCrkGQKscoG2rY6ARGYMgMN2DkoH6hm7TflQ8+PE1S5MzzASeLs4Q== +"@docusaurus/theme-translations@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.1.tgz#955a687c974265a811bfc743d98ef3eab0379100" + integrity sha512-v1MYYlbsdX+rtKnXFcIAn9ar0Z6K0yjqnCYS0p/KLCLrfJwfJ8A3oRJw2HiaIb8jQfk1WMY2h5Qi1p4vHOekQw== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-rc.1.tgz#032f8afde6b4878e37f984b9949a96b150103c21" - integrity sha512-wX25FOZa/aKnCGA5ljWPaDpMW3TuTbs0BtjQ8WTC557p8zDvuz4r+g2/FPHsgWE0TKwUMf4usQU1m3XpJLPN+g== +"@docusaurus/types@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.1.tgz#8696a70e85c4b9be80b38ac592d520f6fe72618b" + integrity sha512-o+4hAFWkj3sBszVnRTAnNqtAIuIW0bNaYyDwQhQ6bdz3RAPEq9cDKZxMpajsj4z2nRty8XjzhyufAAjxFTyrfg== dependencies: "@types/history" "^4.7.11" "@types/react" "*" @@ -1565,30 +1565,30 @@ webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-rc.1.tgz#3e233a28794325d5d9d3af3f7b1c22b59aa8b847" - integrity sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A== +"@docusaurus/utils-common@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.1.tgz#b6f2b029547f739e1431ec84abd16974edf495e0" + integrity sha512-kajCCDCXRd1HFH5EUW31MPaQcsyNlGakpkDoTBtBvpa4EIPvWaSKy7TIqYKHrZjX4tnJ0YbEJvaXfjjgdq5xSg== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-rc.1.tgz#dded12f036cda8a54a19e01694b35859fe0cf1d5" - integrity sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw== +"@docusaurus/utils-validation@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.1.tgz#69f7d4944288d71f00fdba6dde10f05008f04308" + integrity sha512-f14AnwFBy4/1A19zWthK+Ii80YDz+4qt8oPpK3julywXsheSxPBqgsND3LVBBvB2p3rJHvbo2m3HyB9Tco1JRw== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" - "@docusaurus/utils" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.1" + "@docusaurus/utils" "2.0.1" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.0-rc.1": - version "2.0.0-rc.1" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-rc.1.tgz#53584b800df9e13864d5ef1a76aa7655a90ec86e" - integrity sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg== +"@docusaurus/utils@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.1.tgz#37b4b42e29175e5d2d811fcbf9f93bffeca7c353" + integrity sha512-u2Vdl/eoVwMfUjDCkg7FjxoiwFs/XhVVtNxQEw8cvB+qaw6QWyT73m96VZzWtUb1fDOefHoZ+bZ0ObFeKk9lMQ== dependencies: - "@docusaurus/logger" "2.0.0-rc.1" + "@docusaurus/logger" "2.0.1" "@svgr/webpack" "^6.2.1" file-loader "^6.2.0" fs-extra "^10.1.0" From 298751c6294ed76bc167b4b3fb8036ff6b480e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 5 Aug 2022 16:33:12 +0800 Subject: [PATCH 15/34] Add new blogs --- ...etl-introduce-01-why-we-need-sharp-etl.md} | 12 +- ...rp-etl-introduce-02-beyond-existing-etl.md | 137 +++++++++++++++ ...rp-etl-introduce-03-what-is-log-driven.md} | 12 +- website/docusaurus.config.js | 165 ++++++++++-------- website/package.json | 5 +- website/sidebars.js | 7 - website/yarn.lock | 2 +- 7 files changed, 249 insertions(+), 91 deletions(-) rename website/blog/{why-we-need-sharp-etl.md => sharp-etl-introduce-01-why-we-need-sharp-etl.md} (96%) create mode 100644 website/blog/sharp-etl-introduce-02-beyond-existing-etl.md rename website/{docs/log-driven.md => blog/sharp-etl-introduce-03-what-is-log-driven.md} (96%) diff --git a/website/blog/why-we-need-sharp-etl.md b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md similarity index 96% rename from website/blog/why-we-need-sharp-etl.md rename to website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md index 0e62523..b562dd0 100644 --- a/website/blog/why-we-need-sharp-etl.md +++ b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md @@ -1,7 +1,8 @@ --- -slug: 为什么我们需要Sharp ETL -title: 为什么我们需要Sharp ETL +slug: sharp-etl-introduce-01-why-we-need-sharp-etl +title: Sharp ETL介绍(一):为什么我们需要Sharp ETL tags: [sharp etl] +date: 2022-08-01T00:00:00+08:00 --- ## 导言 @@ -120,8 +121,8 @@ workflow一开始是一个header,描述workflow本身的属性,包括workflo -- tableName=t_device -- options -- idColumn=order_id --- column.device_id.qualityCheckRules=power null check(error) --- column.status.qualityCheckRules=empty check(warn) +-- column.device_id.qualityCheckRules=power null check +-- column.status.qualityCheckRules=empty check -- target=temp -- tableName=t_device__extracted -- writeMode=overwrite @@ -231,6 +232,7 @@ ${DWD_UPDATED_PARTITION}; 其实上一段SQL是通过代码生成的,并非人工手写!在实际操作中,只需要填写我们的excel [ods模板](https://docs.google.com/spreadsheets/d/1Zn_Q-QUTf6us4RwdgUgBosXL09-D-TowmgwWlDskvlA) 或 [dwd模板](https://docs.google.com/spreadsheets/d/1CetkqBsXj_E8oZBsws9iGdaJB1QJUajnwqH4FoKhXKA)即可生成代码,可以成倍的提高开发效率。 -后续文章还将对内置的数据工程实践(包括但不限于“日志驱动”、“数据质量分级分类”等)和 Sharp ETL的实现等等进行介绍 + +*后续文章还将对内置的数据工程实践(包括但不限于“日志驱动”、“数据质量分级分类”等)和 Sharp ETL的实现等等进行介绍* diff --git a/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md b/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md new file mode 100644 index 0000000..2fcbf25 --- /dev/null +++ b/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md @@ -0,0 +1,137 @@ +--- +slug: sharp-etl-introduce-02-beyond-existing-etl +title: Sharp ETL介绍(二):超越现有ETL +tags: [sharp etl, data quality check] +date: 2022-08-02T00:00:00+08:00 +--- + +## 导言 + + +本文将从以下几个维度展开Sharp ETL的数据工程化实践: + +* 通过step组合成为workflow +* 支持通过自定义代码逻辑扩展 +* 工程化代码生成,固化统一且标准的数据工程实践 + * 事实表和维度表的关联检查 + * 记录表与表关联过程中的未知值和不适用值 + * 数据质量问题分级分类记录 + * ... ... + +## 通过workflow组织任务逻辑 + +在软件工程中,处理超长代码的方式可能是将代码逻辑为小而易于理解的单元,然后抽取方法,并给方法起通俗易懂的名字。这使得代码可重用并可以提高可读性。在处理超长SQL时经常会用到`WITH`语法: + +```sql +WITH query_name1 AS ( + SELECT ... + ) + , query_name2 AS ( + SELECT ... + FROM query_name1 + ... + ) +SELECT ... +``` + +不可否认通过with语法重写之后可读性大大提升,但是我们认为这仍然不够。通过Sharp ETL的step拆分过后的SQL可读性更好,且debug更为容易。 +乍一看似乎通过workflow组织的SQL更加长或者复杂,实则不然,每一个step都可以有名称来解释这个step的作用,其实通过with语句组织的SQL也经常需要注释来解释。同时这里还有一个隐藏点:如果source是temp,就可以不用写source,一定程度上能够简化理解。同时因为日志驱动的存在,每一个step在执行时都记录了source和target的条数,这个相对于直接写WITH语法更容易调试和排错。 + + +```sql +-- step=define query name 1 +-- source=source type xxx +-- target=temp +-- tableName=query_name1 +SELECT ... + +-- step=define query name 2 +-- target=temp +-- tableName=query_name2 +SELECT ... + FROM query_name1 + +-- step=output +-- target=target type xxx +-- tableName=target table +SELECT ... + +``` + +## workflow的未来 + +实际上最初版本的workflow是顺序执行的,一个step接着一个step。但在真正使用时我们往往需要例如 分支判断、循环、抛出异常、错误处理分支 等等功能,这些都在Sharp ETL未来的计划中,未来会逐步增加这些功能。 + +## 通过[`Transformer`](https://github.com/SharpData/SharpETL/blob/97f303cbd1f40a29780551851f690c283bcb2061/spark/src/main/scala/com/github/sharpdata/sharpetl/spark/transformation/Transformer.scala)来进行自定义逻辑扩展 + +我们可以先看一下`Transformer`的API,它提供了在读写数据时插入自定义逻辑的机制,用户可以轻易的通过实现这个API来插入自己的逻辑。甚至可以通过动态加载scala脚本文件来扩展而不需要重新build jar包,可以参考[这里](/docs/transformer-guide)。 + +```scala +trait Transformer { + + /** + * read + */ + def transform(args: Map[String, String]): DataFrame = ??? + + /** + * write + */ + def transform(df: DataFrame, step: WorkflowStep, variables: Variables): Unit = ??? +} +``` + +## 工程化代码生成 + + +如果是完全手写SQL来完成所有功能,包括数据工程功能,整个逻辑会非常长和复杂。为了降低使用门槛,使得整个过程更加轻松,我们需要通过一些手段将复杂度封装起来。考虑到相同场景下不同表的ETL实现可能是十分类似的,我们想到了通过定义模板来进行数据建模,通过模板来生成workflow这样的方式。你在 [quick start](/docs/quick-start-guide#generate-sql-files-from-excel-config) 里面肯定也见到了通过填写excel模板来生成workflow的方式。实际上我们认为除了具有非常特殊逻辑的任务可以手写以外,绝大多数任务都应该通过模板定义,然后生成。这样有几个好处: + +* 避免了手写任务可能造成的数据工程化实践不一致甚至出错 +* 当大量任务需要修改时,只需要修改模板内容,并重新生成即可 +* excel模板作为大家都能理解的中间产物,可以作为数据BA和数据工程师DE的沟通桥梁,降低团队间的沟通和摩擦成本 +* 团队可以不需重复造轮子,在一个新的项目可以快速进入业务开发,减少大量的基础设置投入 + + +### 数据质量问题分级分类 + +“事实表、维度表的关联检查”、“记录表与表关联过程中的未知值和不适用值” 前一篇文章已经提过了,这里重点展开下 “数据质量问题分级分类” + +首先看一下我们的数据质量检查配置文件,我们允许通过类SQL或者自定义代码(User Defined Rule)的方式来定义数据质量规则。这其中可以使用 `$column` 来引用被应用规则的column name,可以使用UDF,也可以加载一段代码来实现数据质量检查的规则。 + +```yaml +- dataCheckType: power null check + rule: powerNullCheck($column) + errorType: error +- dataCheckType: null check + rule: $column IS NULL + errorType: error +- dataCheckType: duplicated check + rule: UDR.com.github.sharpdata.sharpetl.core.quality.udr.DuplicatedCheck + errorType: warn +- dataCheckType: mismatch dim check + rule: $column = '-1' + errorType: warn +``` + +配置文件中定义的数据质量规则是全局共享的,需要使用数据质量检查的地方可以通过column.column name.qualityCheckRules=rule name引用已有的规则: + +```sql +-- step=1 +-- source=hive +-- dbName=ods +-- tableName=t_device +-- options +-- idColumn=order_id +-- column.device_id.qualityCheckRules=power null check +-- column.status.qualityCheckRules=empty check +-- target=temp +-- tableName=t_device__extracted +-- writeMode=overwrite + +select .... +``` + +数据质量规则同时支持定义error和warn级别的错误,通常warn级别的错误是可以接受的,而error级别的错误是不被认为可接受的,往往不会进入数据仓库。但是error和warn级别的错误都会分级分类记录下来,方便后续排错或者发送通知来解决问题。 + + +*下一篇文章将具体介绍日志驱动的逻辑和实现。* \ No newline at end of file diff --git a/website/docs/log-driven.md b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md similarity index 96% rename from website/docs/log-driven.md rename to website/blog/sharp-etl-introduce-03-what-is-log-driven.md index 3796f8b..6cc4754 100644 --- a/website/docs/log-driven.md +++ b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md @@ -1,10 +1,14 @@ --- -title: "Log driven" -sidebar_position: 6 -toc: true -last_modified_at: 2022-02-23T18:25:57-04:00 +slug: sharp-etl-introduce-03-what-is-log-driven +title: Sharp ETL介绍(三):什么是日志驱动 +tags: [sharp etl, log driven] +date: 2022-08-03T00:00:00+08:00 --- +## 导言 + +本文将从为什么需要日志驱动和日志驱动如何解决问题展开来对日志驱动做详细介绍 + ## 常规的任务调度 ![Log Driven](/assets/images/logdriven-1.svg) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 142d922..558e15c 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -18,6 +18,7 @@ const config = { onBrokenLinks: 'ignore', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', + //themes: ['@docusaurus/theme-search-algolia'], organizationName: 'SharpData', projectName: 'SharpETL', @@ -45,79 +46,99 @@ const config = { ], themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - navbar: { - title: 'Sharp ETL', - logo: { - alt: 'Sharp ETL Logo', - src: 'img/sharp_etl.png', - }, - items: [ - { - type: 'doc', - docId: 'quick-start-guide', - position: 'left', - label: 'Docs', - }, - { to: 'blog', label: 'Blog', position: 'left' }, - // { to: 'concept', label: 'Concept', position: 'left' }, - { - href: 'https://github.com/SharpData/SharpETL', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Learn', - items: [ - { - label: 'Style Guide', - to: 'docs/', - }, - { - label: 'Documents', - to: 'docs/', - }, - ], - }, - { - title: 'More', - items: [ - { - label: 'Blog', - to: 'blog', - }, - { - label: 'GitHub', - href: 'https://github.com/SharpData/SharpETL', - }, - ], - }, - ], - // logo: { - // alt: 'Sharp ETL Logo', - // src: '/img/sharp_etl.png', - // href: 'https://github.com/SharpData/SharpETL', - // width: 128, - // height: 128, - // }, - copyright: `Copyright © ${new Date().getFullYear()} Sharp Data`, - }, - prism: { - theme: require('prism-react-renderer/themes/dracula'), - additionalLanguages: ['java', 'scala', 'sql'], - }, - announcementBar: { - id: 'announcementBar-2', - content: - '⭐️ If you like Sharp ETL, give it a star on GitHub! ⭐', + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + { + navbar: { + title: 'Sharp ETL', + logo: { + alt: 'Sharp ETL Logo', + src: 'img/sharp_etl.png', }, - }), + items: [ + { + type: 'doc', + docId: 'quick-start-guide', + position: 'left', + label: 'Docs', + }, + { to: 'blog', label: 'Blog', position: 'left' }, + // { to: 'concept', label: 'Concept', position: 'left' }, + { + href: 'https://github.com/SharpData/SharpETL', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Learn', + items: [ + { + label: 'Style Guide', + to: 'docs/', + }, + { + label: 'Documents', + to: 'docs/', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: 'blog', + }, + { + label: 'GitHub', + href: 'https://github.com/SharpData/SharpETL', + }, + ], + }, + ], + // logo: { + // alt: 'Sharp ETL Logo', + // src: '/img/sharp_etl.png', + // href: 'https://github.com/SharpData/SharpETL', + // width: 128, + // height: 128, + // }, + copyright: `Copyright © ${new Date().getFullYear()} Sharp Data`, + }, + prism: { + theme: require('prism-react-renderer/themes/dracula'), + additionalLanguages: ['java', 'scala', 'sql'], + }, + announcementBar: { + id: 'announcementBar-2', + content: + '⭐️ If you like Sharp ETL, give it a star on GitHub! ⭐', + }, + // algolia: { + // // The application ID provided by Algolia + // appId: 'YOUR_APP_ID', + + // // Public API key: it is safe to commit it + // apiKey: 'YOUR_SEARCH_API_KEY', + + // indexName: 'YOUR_INDEX_NAME', + + // // Optional: see doc section below + // contextualSearch: true, + + // // Optional: Algolia search parameters + // searchParameters: {}, + + // // Optional: path for search page that enabled by default (`false` to disable it) + // searchPagePath: 'search', + + // //... other Algolia params + // }, + }, }; module.exports = config; diff --git a/website/package.json b/website/package.json index 9df658d..9c9d7a3 100644 --- a/website/package.json +++ b/website/package.json @@ -20,11 +20,12 @@ "dependencies": { "@docusaurus/core": "2.0.1", "@docusaurus/preset-classic": "2.0.1", + "@docusaurus/theme-search-algolia": "^2.0.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", + "prism-react-renderer": "^1.2.1", "react": "^17.0.2", - "react-dom": "^17.0.2", - "prism-react-renderer": "^1.2.1" + "react-dom": "^17.0.2" }, "devDependencies": { "@babel/eslint-parser": "^7.18.2", diff --git a/website/sidebars.js b/website/sidebars.js index 82cfd4c..1d81f0b 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -14,13 +14,6 @@ module.exports = { 'end-to-end-showcase', 'end-to-end-showcase-postgres' ], - }, { - type: 'category', - label: 'Concept', - collapsed: false, - items: [ - 'log-driven', - ], }, { type: 'category', label: 'Configuration', diff --git a/website/yarn.lock b/website/yarn.lock index 8960980..372ba62 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1521,7 +1521,7 @@ tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.1": +"@docusaurus/theme-search-algolia@2.0.1", "@docusaurus/theme-search-algolia@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.1.tgz#0aab8407b2163f67eb4c48f1de33944e1695fa74" integrity sha512-cw3NaOSKbYlsY6uNj4PgO+5mwyQ3aEWre5RlmvjStaz2cbD15Nr69VG8Rd/F6Q5VsCT8BvSdkPDdDG5d/ACexg== From 3bb8133adf4dcac3a15c26e7b8e1d6e55ed0d2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 5 Aug 2022 16:44:23 +0800 Subject: [PATCH 16/34] update blog of log driven --- .../blog/sharp-etl-introduce-03-what-is-log-driven.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md index 6cc4754..061785b 100644 --- a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md +++ b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md @@ -57,7 +57,7 @@ date: 2022-08-03T00:00:00+08:00 ## 待执行队列的具体计算逻辑 -* [time-based](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L148-L161) +* [time-based](https://github.com/SharpData/SharpETL/blob/97f303cbd1f40a29780551851f690c283bcb2061/core/src/main/scala/com/github/sharpdata/sharpetl/core/api/LogDrivenInterpreter.scala#L189) 包括 db的增量和全量、API的增量和全量、文件的增量和全量 等 @@ -70,18 +70,23 @@ date: 2022-08-03T00:00:00+08:00 对于一个运行过的任务,之前已经设定过`--default-start`为 20220101000000,但是已经运行过一段时间,假设当前任务对应的`dataRangeEnd`的最大值为20220107000000,当前时间为2022-01-08 14:00:00,那么会schedule 1个任务(20220107000000-20220108000000)。 -* [auto-incremental primary key](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L126-L146) +* [auto-incremental primary key](https://github.com/SharpData/SharpETL/blob/97f303cbd1f40a29780551851f690c283bcb2061/core/src/main/scala/com/github/sharpdata/sharpetl/core/api/LogDrivenInterpreter.scala#L148) 数据库自增主键场景 `dataRangeStart`取 ‘开始主键值’ option `--default-start`(默认:0) 和 ‘上次成功任务的’ `dataRangeEnd` 的最大值, `dataRangeEnd`取值 `max(primary key)`, 任务运行结束后会更新这次任务的实际取到的最大主键值到`dataRangeEnd`中。 -* [kafka topic](https://github.com/big-data-platform/sharp-etl/blob/master/core/src/main/scala/com/thoughtworks/bigdata/etl/core/LogDrivenJob.scala#L76-L123) +* [kafka topic](https://github.com/SharpData/SharpETL/blob/97f303cbd1f40a29780551851f690c283bcb2061/core/src/main/scala/com/github/sharpdata/sharpetl/core/api/LogDrivenInterpreter.scala#L95) 与自增主键类似, `dataRangeStart`取 ‘开始主键值’ option `--default-start`(默认:`earlist`) 和 ‘上次成功任务的’ `dataRangeEnd` 的最大值, `dataRangeEnd`取值 `latest`, 任务运行结束后会更新这次任务的实际取到的最大offset到`dataRangeEnd`中。 +* [upstream](https://github.com/SharpData/SharpETL/blob/97f303cbd1f40a29780551851f690c283bcb2061/core/src/main/scala/com/github/sharpdata/sharpetl/core/api/LogDrivenInterpreter.scala#L173) + + upstream方式驱动的任务有点特殊,它往往是贴源层(ODS)之后的层需要的,例如我们在明细层(DWD)创建一个新的任务,这个任务天然有依赖,它依赖于贴源层(ODS)的任务,这个时候我们不像针对当前任务多做配置,而是希望当前任务完全fellow贴源层(ODS)任务的配置,只要ODS任务跑过了,就会自动跑DWD的任务。 + 这种方式还有一个额外的好处,如果ODS的任务需要重刷,如果DWD是timewindow的任务,则需要重新配置,但是如果DWD是upstream,则不需要配置,只要ODS重刷了,DWD也会跟着重刷,它们完全同频,大大降低了配置任务依赖的难度。 + ## 日志驱动的表设计 From 6341393f95d10233fd0729f15ca993e12edfb401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 5 Aug 2022 19:08:10 +0800 Subject: [PATCH 17/34] Update blogs --- ...-etl-introduce-01-why-we-need-sharp-etl.md | 4 +- ...rp-etl-introduce-02-beyond-existing-etl.md | 2 + ...arp-etl-introduce-03-what-is-log-driven.md | 4 +- ...p-etl-introduce-04-workflow-in-a-glance.md | 119 +++++++++ website/docs/datasource.md | 30 ++- website/src/css/custom.css | 227 +++++++++++++++--- 6 files changed, 338 insertions(+), 48 deletions(-) create mode 100644 website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md diff --git a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md index b562dd0..0c58e4f 100644 --- a/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md +++ b/website/blog/sharp-etl-introduce-01-why-we-need-sharp-etl.md @@ -9,7 +9,9 @@ date: 2022-08-01T00:00:00+08:00 本文结合目前的数据工程实践,尝试展开数据工程实践中ETL的原则,并对Sharp ETL做简要介绍。 -ETL或ELT是进行数据处理的常见手段之一,随着数据平台渡过蛮荒时代开始精细化治理,原始的编码方式和无组织的SQL脚本已经不能满足需求。 +ETL或ELT是进行数据处理的常见手段之一,随着数据平台渡过蛮荒时代开始精细化治理,原始的编码方式和无组织的SQL脚本已经不能满足需求。我们将会通过展开现有ETL在当前遇到的困境来引入Sharp ETL的独有但必不可缺的功能。 + + ## 之前的ETL有什么问题 diff --git a/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md b/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md index 2fcbf25..9890ff9 100644 --- a/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md +++ b/website/blog/sharp-etl-introduce-02-beyond-existing-etl.md @@ -18,6 +18,8 @@ date: 2022-08-02T00:00:00+08:00 * 数据质量问题分级分类记录 * ... ... + + ## 通过workflow组织任务逻辑 在软件工程中,处理超长代码的方式可能是将代码逻辑为小而易于理解的单元,然后抽取方法,并给方法起通俗易懂的名字。这使得代码可重用并可以提高可读性。在处理超长SQL时经常会用到`WITH`语法: diff --git a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md index 061785b..ed3e8ab 100644 --- a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md +++ b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md @@ -7,7 +7,9 @@ date: 2022-08-03T00:00:00+08:00 ## 导言 -本文将从为什么需要日志驱动和日志驱动如何解决问题展开来对日志驱动做详细介绍 +本文将从为什么需要日志驱动和日志驱动如何解决问题展开来对日志驱动做详细介绍。 + + ## 常规的任务调度 diff --git a/website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md new file mode 100644 index 0000000..6c30fed --- /dev/null +++ b/website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md @@ -0,0 +1,119 @@ +--- +slug: sharp-etl-introduce-04-workflow-in-a-glance +title: Sharp ETL介绍(四):Workflow入门 +tags: [sharp etl, workflow] +date: 2022-08-04T00:00:00+08:00 +--- + +## 导言 + + +本文将快速讲解workflow的基本用法,包括 + +* 变量 +* 临时表 +* 控制流 workflow_spec.sql +* step读写数据 +* 数据源 +* 扩展 + * UDF + * Transformer + * Dynamic transformer + + + +## 变量 + +Sharp ETL对变量有丰富的支持,包括任务运行内建的变量和用户自定义变量。 + +内置变量包括 + +* `${DATA_RANGE_START}` +* `${DATA_RANGE_END}` +* `${JOB_ID}` +* `${JOB_NAME}` +* `${WORKFLOW_NAME}` + +针对timewindow任务还包括 + +* `${YEAR}` +* `${MONTH}` +* `${DAY}` +* `${HOUR}` +* `${MINUTE}` + +用户可以在任意step中新增或覆盖变量,声明结束后,后续step即可使用该变量,例如 + +```sql +-- step=1 +-- source=temp +-- target=variables +select from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy') as `YEAR`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'MM') as `MONTH`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'dd') as `DAY`, + from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR`, + 'temp_source' as `sources`, + 'temp_target' as `target`, + 'temp_end' as `end` +``` + +## 临时表 + +临时表是Sharp ETL能够将复杂任务拆分的基础,当前Spark的实现就是使用了Spark的临时表。一段复杂的逻辑可以拆分为输出到多个临时表来简化逻辑。对于从temp表读数据的step而言,source可以忽略掉,不写source默认认为从temp读取数据。 + +```sql +-- step=1 +-- target=temp +-- tableName=temp_table +select 'SUCCESS' as `RESULT`; + +-- step=2 +-- target=console +select * from temp_table; +``` + + + +## 数据源 + +每个step都有source和target两个配置,具体配置使用可以参考 [datasource](/docs/datasource) 这一节来使用。同一个workflow里面datasource之间可以任意组合使用,没有严格限制,用户也可以很方便的自定义新的数据源。 + + +## 扩展 + +Sharp ETL从设计之初就一直考虑让用户可以很方便的扩展功能,无论是在step设计、transformer设计、UDF、动态加载transformer脚本、自定义数据质量规则、自定义数据质量检查脚本都能够很好的支持用户实现自定义逻辑。未来还会支持 分支判断、循环、抛出异常、错误处理分支 等等控制流,使得Sharp ETL的workflow更加像一个编程语言,这样用户就可以完全依赖于SQL来实现所有的功能。 + +### UDF + +用户可以通过build自己的jar包来实现UDF的支持,这个jar包不需要基于Sharp ETL来实现,甚至仅仅是普通的Scala function即可。 + +例如,用户需要注册一个新的UDF来实现自定义逻辑,只需要编写普通代码即可: + +```scala +class TestUdfObj extends Serializable { + def testUdf(value: String): String = { + s"$value-proceed-by-udf" + } +} +``` + +打包完成后需要将jar包与Sharp ETL的jar包一起提交,这样就可以很轻易的引用自己的UDF了。 + +```sql +-- step=1 +-- source=class +-- className=com.github.sharpdata.sharpetl.spark.end2end.TestUdfObj +-- target=udf +-- methodName=testUdf +-- udfName=test_udf + +-- step=2 +-- source=temp +-- target=temp +-- tableName=udf_result +select test_udf('input') as `result`; +``` + +### Transformer + +Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-guide) \ No newline at end of file diff --git a/website/docs/datasource.md b/website/docs/datasource.md index 0643385..268eb65 100644 --- a/website/docs/datasource.md +++ b/website/docs/datasource.md @@ -2,7 +2,7 @@ title: "Datasource" sidebar_position: 1 toc: true -last_modified_at: 2021-11-03T18:25:57-04:00 +last_modified_at: 2022-08-05T18:25:57-04:00 --- ## 支持的数据源 @@ -47,7 +47,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 -- tableName=temp_table select 1 as a; - -- stepId=2 + -- step=2 -- source=temp -- target=console select * @@ -98,7 +98,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 cast(max(id) as int8) as upperBound from test_table; - -- stepId=2 + -- step=2 -- source=postgres -- dbName=test -- numPartitions=10000 @@ -265,9 +265,11 @@ last_modified_at: 2021-11-03T18:25:57-04:00 ``` - sftp + 对于sftp,会将匹配的文件先下载到本地,然后再将本地文件上传到hdfs 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | | --------------- | ------ | -------- | ------------------------------------------------------------ | | sourceDir | 无 | 否 | 表示sftp服务器里的绝对路径 | @@ -297,6 +299,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 - mount(sharefolder) 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | | --------------- | ------ | -------- | ------------------------------------------------------------ | | sourceDir | 无 | 否 | 表示sftp服务器里的绝对路径 | @@ -473,7 +476,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 -- methodName=desDecryptHex -- udfName=des_decrypt - -- stepId=2 + -- step=2 -- source=hive -- target=hive -- tableName=test_table @@ -509,7 +512,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 -- methodName=predict -- udfName=predict - -- stepId=2 + -- step=2 -- source=hive -- target=hive -- tableName=test_table @@ -525,12 +528,14 @@ last_modified_at: 2021-11-03T18:25:57-04:00 - bigquery 参数 + | 参数名称 | 默认值 | 是否可空 | 说明 | | -------------- | ------ | -------- | ----------------------- | | dataSourceType | 无 | 否 | 值必须为bigquery | | system | 无 | 否 | 通过bigquery.${system}.*来获取数据源的配置信息 | bigquery在application.properties里的配置信息 + ```properties bigquery.test.proxyAddress=localhost:8080 bigquery.test.parentProject=project1 @@ -543,12 +548,11 @@ last_modified_at: 2021-11-03T18:25:57-04:00 示例 ```sql - -- stepId=2 + -- step=2 -- source=bigquery -- system=test -- target=temp -- tableName=`login_raw` - -- skipFollowStepWhenEmpty=true select * from project2.table1 ``` @@ -581,7 +585,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 -- tableName=temp_table select 1 as a; - -- stepId=2 + -- step=2 -- source=temp -- target=temp select * @@ -645,7 +649,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 select '1' as a, '2' as b; - -- stepId=2 + -- step=2 -- source=temp -- target=hive -- tableName=temp_table @@ -678,7 +682,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 -- methodName=predict -- udfName=predict - -- stepId=2 + -- step=2 -- source=hive -- target=temp -- tableName=temp1 @@ -686,7 +690,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 cast(1.0 as float) as x2, cast(1.0 as float) as x3; - -- stepId=3 + -- step=3 -- source=temp -- target=temp -- tableName=temp2 @@ -938,7 +942,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 示例: ```sql - -- stepId=3 + -- step=3 -- source=hive -- target=hdfs -- configPrefix=test @@ -956,7 +960,7 @@ last_modified_at: 2021-11-03T18:25:57-04:00 示例: ```sql - -- stepId=3 + -- step=3 -- source=hive -- target=csv -- filePath=/test.csv diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 2396bcc..c665f35 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -1,37 +1,198 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format + :root { + /* + See css var + hsl color palette technique: + https://blog.maximeheckel.com/posts/the-power-of-composition-with-css-variables/ + */ + --site-primary-hue-saturation: 167 68%; + --site-primary-hue-saturation-light: 167 56%; + /* do we really need this extra one? */ + --site-color-favorite-background: #f6fdfd; + --site-color-tooltip: #fff; + --site-color-tooltip-background: #353738; + --site-color-svg-icon-favorite: #e9669e; + --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%); + --site-color-feedback-background: #fff; + --docusaurus-highlighted-code-line-bg: rgb(0 0 0 / 10%); + /* Use a darker color to ensure contrast, ideally we don't need important */ + --ifm-breadcrumb-color-active: var(--ifm-color-primary-darker) !important; + --ifm-menu-color-active: var(--ifm-color-primary-darker) !important; + } + + html[data-theme='dark'] { + --site-color-feedback-background: #f0f8ff; + --site-color-favorite-background: #1d1e1e; + --site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%); + --docusaurus-highlighted-code-line-bg: rgb(66 66 66 / 35%); + } + + /* + * This selector will be dynamically replaced by the color generator. Don't put + * other properties here. */ + [data-theme='light'] { + --ifm-color-primary: hsl(var(--site-primary-hue-saturation) 30%); + --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%); + --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%); + --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%); + + --ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 39%); + --ifm-color-primary-lighter: hsl(var(--site-primary-hue-saturation-light) 47%); + --ifm-color-primary-lightest: hsl(var(--site-primary-hue-saturation-light) 58%); + } -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. + /* + * This selector will be dynamically replaced by the color generator. Don't put + * other properties here. */ + [data-theme='dark'] { + --ifm-color-primary: hsl(var(--site-primary-hue-saturation) 45%); + --ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%); + --ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%); + --ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%); + + --ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 54%); + --ifm-color-primary-lighter: hsl(var(--site-primary-hue-saturation-light) 62%); + --ifm-color-primary-lightest: hsl(var(--site-primary-hue-saturation-light) 73%); + } + + .header-github-link:hover { + opacity: 0.6; + } + + .header-github-link::before { + content: ''; + width: 24px; + height: 24px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; + } + + [data-theme='dark'] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; + } + + .footer--dark { + --ifm-footer-background-color: #2b3137; + } + + .unique-tabs .tabs__item { + line-height: 16px; + margin-right: 8px; + } + + .unique-tabs .tabs__item--active { + border: 0; + color: #fff; + border-radius: var(--ifm-global-radius); + background-color: var(--ifm-tabs-color-active); + } + + [data-theme='light'] .themedDocusaurus [fill='#FFFF50'] { + fill: greenyellow; + } + + [data-theme='dark'] .themedDocusaurus [fill='#FFFF50'] { + fill: seagreen; + } + + [data-theme='light'] .DocSearch { + /* --docsearch-primary-color: var(--ifm-color-primary); */ + /* --docsearch-text-color: var(--ifm-font-color-base); */ + --docsearch-muted-color: var(--ifm-color-emphasis-700); + --docsearch-container-background: rgb(94 100 112 / 70%); + /* Modal */ + --docsearch-modal-background: var(--ifm-color-secondary-lighter); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-color-secondary); + --docsearch-searchbox-focus-background: var(--ifm-color-white); + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: var(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-white); + /* Footer */ + --docsearch-footer-background: var(--ifm-color-white); + } + + [data-theme='dark'] .DocSearch { + --docsearch-text-color: var(--ifm-font-color-base); + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgb(47 55 69 / 70%); + /* Modal */ + --docsearch-modal-background: var(--ifm-background-color); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-background-color); + --docsearch-searchbox-focus-background: var(--ifm-color-black); + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: var(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-emphasis-100); + /* Footer */ + --docsearch-footer-background: var(--ifm-background-surface-color); + --docsearch-key-gradient: linear-gradient(-26.5deg, + var(--ifm-color-emphasis-200) 0%, + var(--ifm-color-emphasis-100) 100%); + } + + div[class^='announcementBar_'] { + --site-announcement-bar-stripe-color1: hsl(var(--site-primary-hue-saturation) 85%); + --site-announcement-bar-stripe-color2: hsl(var(--site-primary-hue-saturation) 95%); + background: repeating-linear-gradient(35deg, + var(--site-announcement-bar-stripe-color1), + var(--site-announcement-bar-stripe-color1) 20px, + var(--site-announcement-bar-stripe-color2) 10px, + var(--site-announcement-bar-stripe-color2) 40px); + font-weight: bold; + } + + .screen-reader-only { + border: 0; + clip: rect(0 0 0 0); + clip-path: polygon(0 0, 0 0, 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; + } + + [data-theme='light'] img[src$='#gh-dark-mode-only'], + [data-theme='dark'] img[src$='#gh-light-mode-only'] { + display: none; + } + + /* Used to test CSS insertion order */ + .test-marker-site-custom-css-unique-rule { + content: 'site-custom-css-unique-rule'; + } + + .video-container { + position: relative; + overflow: hidden; + width: 100%; + max-width: 560px; + margin: 0 auto; + } + + .yt-lite>.lty-playbtn { + cursor: pointer; + border: 0; + } + + .dropdown-separator { + margin: 0.3rem 0; + } + + .dropdown-archived-versions { + font-size: 0.875rem; + padding: 0.2rem 0.5rem; + } -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #2e8555; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; - --ifm-code-font-size: 95%; -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: #25c2a0; - --ifm-color-primary-dark: #21af90; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; -} + .code-block-error-line { + background-color: #ff000020; + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); + border-left: 3px solid #ff000080; + } \ No newline at end of file From 8dc7b27aaf1b744a3c18a90db1d3275553e891b2 Mon Sep 17 00:00:00 2001 From: chenli23 <62692106+chenli23@users.noreply.github.com> Date: Fri, 5 Aug 2022 21:01:35 +0800 Subject: [PATCH 18/34] update docker-setup.md (#3) Co-authored-by: li chen --- website/docs/docker-setup.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/website/docs/docker-setup.md b/website/docs/docker-setup.md index 565eddb..596386d 100644 --- a/website/docs/docker-setup.md +++ b/website/docs/docker-setup.md @@ -16,7 +16,7 @@ This guide provides quick docker setup for local testing ```bash cd docker -docker compose up -d # to start ETL database(mysql 5.7) & hive instance(version 2.3.7) +docker compose up -d # to start ETL database(mysql 5.7.28) & hive instance(version 3.1.2) ``` To access local hive instance you need @@ -24,15 +24,7 @@ To access local hive instance you need in `spark/build.gradle` ```diff --compileOnly(project(":datasource:hive3")) -+compileOnly(project(":datasource:hive2")) -+implementation "org.apache.spark:spark-hive_$scalaVersion:$sparkVersion" -``` - -in `datasource/hive2/build.gradle` - -```diff -+api 'org.apache.hive:hive-metastore:2.1.0' ++ implementation "org.apache.spark:spark-hive_$scalaVersion:$sparkVersion" ``` add `hive-site.xml` in `spark/src/main/resources/hive-site.xml` From 2e4cc7fbfeb179cce3a814ad199b39cda9eab8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Sat, 6 Aug 2022 09:59:41 +0800 Subject: [PATCH 19/34] Update blogs --- ...arp-etl-introduce-03-what-is-log-driven.md | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md index ed3e8ab..0eb59aa 100644 --- a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md +++ b/website/blog/sharp-etl-introduce-03-what-is-log-driven.md @@ -97,39 +97,42 @@ date: 2022-08-03T00:00:00+08:00 ```sql create table job_log ( - job_id bigint auto_increment comment '任务id,主键' primary key, - job_name varchar(128) charset utf8 not null, - job_period int not null comment '周期', - job_schedule_id varchar(128) charset utf8 not null comment 'job_name + data_range_start 拼接的字符串', - data_range_start varchar(1024) charset utf8 null, - data_range_end varchar(1024) charset utf8 null, - job_start_time datetime null comment '任务开始时间', - job_end_time datetime null comment '任务结束时间', - status varchar(32) charset utf8 not null comment '任务结果: SUCCESS,FAILURE,RUNNING', - create_time datetime default CURRENT_TIMESTAMP not null comment '数据插入时间', - last_update_time datetime default CURRENT_TIMESTAMP not null comment '数据更新时间', - incremental_type varchar(16) null, - current_file varchar(1024) charset utf8 null comment '文件数据源会记录文件名', - application_id varchar(64) charset utf8 null comment '执行引擎的任务id,例如spark的applicationId', - project_name varchar(256) charset utf8 null -); + job_id bigint auto_increment primary key, + workflow_name varchar(128) charset utf8 not null, + `period` int not null, + job_name varchar(128) charset utf8 not null, + data_range_start varchar(128) charset utf8 null, + data_range_end varchar(128) charset utf8 null, + job_start_time datetime null, + job_end_time datetime null, + status varchar(32) charset utf8 not null comment 'job status: SUCCESS,FAILURE,RUNNING', + create_time datetime default CURRENT_TIMESTAMP not null comment 'log create time', + last_update_time datetime default CURRENT_TIMESTAMP not null comment 'log update time', + load_type varchar(32) null, + log_driven_type varchar(32) null, + file text charset utf8 null, + application_id varchar(64) charset utf8 null, + project_name varchar(64) charset utf8 null, + runtime_args text charset utf8 null +) charset = utf8; create table step_log ( - job_id bigint not null, - step_id varchar(64) not null, - status varchar(32) not null, - start_time datetime not null, - end_time datetime not null, + job_id bigint not null, + step_id varchar(64) not null, + status varchar(32) not null, + start_time datetime not null, + end_time datetime null, duration int(11) unsigned not null, - output text not null comment 'info日志', - source_count bigint null, - target_count bigint null, - success_count bigint null comment '执行成功条数', - failure_count bigint null comment '执行失败条数', - error varchar(10000) null comment 'error日志', - source_type varchar(256) null comment '数据源类型', - target_type varchar(256) null comment '目标源类型', + output text not null, + source_count bigint null, + target_count bigint null, + success_count bigint null comment 'success data count', + failure_count bigint null comment 'failure data count', + error text null, + source_type varchar(32) null, + target_type varchar(32) null, primary key (job_id, step_id) -); +) charset = utf8; + ``` \ No newline at end of file From 7cb2680eb19218ad225242526762e8d2c63d7755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Sat, 6 Aug 2022 10:12:12 +0800 Subject: [PATCH 20/34] Add new blogs --- ...ata-engineering-meets-chaos-engineering.md | 102 ++++++++++++++++++ ...introduce-04-log-driven-implementation.md} | 50 +-------- ...-etl-introduce-05-workflow-in-a-glance.md} | 6 +- 3 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 website/blog/sharp-etl-introduce-03-when-data-engineering-meets-chaos-engineering.md rename website/blog/{sharp-etl-introduce-03-what-is-log-driven.md => sharp-etl-introduce-04-log-driven-implementation.md} (58%) rename website/blog/{sharp-etl-introduce-04-workflow-in-a-glance.md => sharp-etl-introduce-05-workflow-in-a-glance.md} (96%) diff --git a/website/blog/sharp-etl-introduce-03-when-data-engineering-meets-chaos-engineering.md b/website/blog/sharp-etl-introduce-03-when-data-engineering-meets-chaos-engineering.md new file mode 100644 index 0000000..357bbff --- /dev/null +++ b/website/blog/sharp-etl-introduce-03-when-data-engineering-meets-chaos-engineering.md @@ -0,0 +1,102 @@ +--- +slug: sharp-etl-introduce-03-when-data-engineering-meets-chaos-engineering +title: Sharp ETL介绍(三):当数据工程遇到混沌工程 +tags: [sharp etl, log driven, chaos engineering, data engineering] +date: 2022-08-03T00:00:00+08:00 +--- + +## 导言 + +本文将从混沌工程在数据工程领域的遐想来引入“日志驱动”的必要性。 + + + +## 什么是混沌工程? + +混沌工程是在系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。([混沌工程原则](https://principlesofchaos.org/zh/)) + +现代系统正变得越来越复杂,从单线程到多线程,从单体到微服务,从单节点到高可用,从本地到云端... ...复杂度使得程序产生预期的结果需要越来越多的必要条件,而每种条件都有其自身的成功概率,即使每种条件的成功概率都很高,根据墨菲定律,或早或晚一定会遇到不可预知的结果。 + +混沌工程通过一下四个步骤来找出系统中隐藏的“混沌”: + + 首先,用系统在正常行为下的一些可测量的输出来定义“稳定状态”。 + 其次,假设这个在控制组和实验组都会继续保持稳定状态。 + 然后,在实验组中引入反映真实世界事件的变量,如服务器崩溃、硬盘故障、网络连接断开等。 + 最后,通过控制组和实验组之间的状态差异来反驳稳定状态的假说。 + +混沌工程实验是通过向现有系统注入故障,从而发现系统的薄弱点,从而可以有针对性的提高整个系统的健壮性。 + +## 环境都是高可用(HA)的,应该很健壮啊 + +有同学可能会有疑问,“我们环境都是高可用(HA)的,应该很健壮啊”。这个问题还是要分开来看,健壮的系统能够忠实的执行程序逻辑并得到最终结果。但是如果程序逻辑是错的呢?或者,程序逻辑没有错但是因为其自身的脆弱性,当系统从错误中恢复时没有处理一些必要的逻辑,导致最终的结果出现了问题。所以系统级别的高可用或者健壮性和程序级别的健壮性是两回事,一定要分开看待,且二者缺一不可。而在数据工程实践中我们往往聚焦于基础设置有没有做到高可用,而忽略了程序逻辑的健壮性。 + + +## 仅仅是幂等就足够了吗? + +有些同学觉得无所谓,我的程序是幂等的呀,报错了重跑不就完了。这里先讲一下幂等的定义:能够用同样的参数重复执行,并总能得到相同的结果。 + +那我们可以按照混沌工程的四个步骤来模拟一个场景出来: + +1. 用系统在正常行为下的一些可测量的输出来定义“稳定状态”,这里尝试定义“稳定状态”为: + 1. ETL计算结果稳定且正确(幂等) + 2. 资源队列占用合理,提交的任务不需要等待太久就可以运行 + 3. 过去的数据不会被重复计算 + 4. 同一时刻不发生重复计算 +2. 假设这个在控制组和实验组都会继续保持稳定状态。 +3. 在实验组中引入反映真实世界事件的变量:手动调度任务时页面卡住了,习惯性多点了几次,刷新页面后发现调度起来了十几个任务。 +4. 通过控制组和实验组之间的状态差异来反驳稳定状态的假说: + * 资源队列被打满,新调度的任务都得排队(不符合稳定状态条件2) + * 重跑并覆盖过去已经运行过的数据(计算资源浪费,不符合稳定状态条件3) + * 计算同一天的数据几十次,而最终只留了最后那份(计算资源浪费,不符合稳定状态条件4) + +通过上面的模拟实验我们可以知道,虽然ETL是满足幂等性(即稳定状态条件1)的,但是由于没有满足其他记得稳定状态所以我们可以说它是存在脆弱性的。 + +## 常规的任务调度的其他问题 + +![Log Driven](/assets/images/logdriven-1.svg) + +对于一个daily的任务,理想情况下是每天都会成功,但是实际上肯定会遇到失败的场景,不同的调度引擎往往对于失败的case有不同的处理逻辑。 +这里以忽略过去失败的任务,继续开启下一个调度周期为例,对比实例,跳过了2022-02-02的任务,继续运行 2022-02-03的任务。当发现任务出问题之后,需要手动补数据,手动重新运行2022-02-02的任务,把数据补上去。(这里如果有报表使用了2022-02-02的数据,那么报表的数据肯定是不准确的) + +缺点:完全依赖于调度工具的任务历史记录,如果没有配置失败通知机制,需要一个个去看哪个任务挂掉了。如果允许失败任务之后的任务继续运行,可能会导致对顺序有要求的场景下出问题,比如 2月3日的数据在mysql做了upsert操作,2月2日的又做了一次(在修复失败之后),就会导致用旧的数据覆盖新的数据的问题。 + +**这里也不否认有些调度框架在适当的配置时也能解决上述问题,但是没有人能保证所有的调度框架都能解决上面的问题或者你的项目对于调度框架有自由选择的空间。所以在实践中我们需要在ETL任务和实际调度框架(如airflow)中通过“日志驱动”做一层隔离,加入的这一层统一的逻辑处理可以使得ETL任务在不同的调度框架下行为一致,符合大家的预期,而不是让所有人都精通常见的调度框架。** + + +## 那该怎么办? + +针对这个问题,我认为“日志解耦”是必要的解决方案。观察上面的问题可以思考,重复提交的任务应该怎么组织呢?我们需要判断是不是有任务已经提交过了,对不对?同时要考虑到隔离不同调度系统,所以方案自然是需要一个单独的地方保存这些调度日志,以便在调度任务时检查是否需要调度(是否有相同任务在运行或者这个任务是否已经运行过等)。 + +注意这里的“日志”并不是任务运行的日志,而是调度任务的日志,记录的是那个任务在哪个时间调度,状态是什么等等。 + +“日志解耦”的结果是通过日志来驱动任务运行,所谓的“日志驱动”,其实和“断点续传”这个概念很像,只不过没有应用在下载文件上,而是应用到了任务调度。日志驱动有几个核心要点: + +* 自行记录任务运行历史,而不依赖与调度框架的功能。这样就做到了与不同调度框架解绑; +* 调度是有序的,上个周期任务失败了,不会跳过它运行下个周期的任务,每次调度还是会先执行之前失败的任务,直到它成功; + +**日志驱动也带来了几点好处**: + +* 可以解决重复调度的问题,当任务运行后发现有相同任务在运行或者已经运行过了,当前任务可以直接退出或者kill掉之前的任务 +* 补数据操作更加容易实现且灵活而不容易出错 +* 更加灵活的任务依赖配置(任务上下游不一定是同频率或者必须在一个dag里面) +* 更加灵活的调度起始设置,例如对于kafka offset和自增主键的支持 +* 更加统一且容易的运维操作(不同的项目、不同的调度引擎,都可以基于日志驱动(的表)来进行运维操作) +* 可以记录更加详细的任务状态,比如读到多少条数据,写了多少条数据等等(特指结构化记录,而不是普通的执行日志),方便做统计查看 +* 可以自行选择事务级别,或者说可以让用户选择是否要“脏读”数据 +* 还有其他的好处,篇幅有限就不在此展开了 + +![Log Driven](/assets/images/logdriven-2.svg) + +回到现实场景,任务失败的情况大致可以分为两种: + +* 重试就可以成功(网络闪崩,排队超时等) +* 代码、环境有问题需要人工介入的 + +对于重试就可以成功的情况,往往在下一次调度就可以自动补上之前失败的任务的数据;如果不想等到下一个周期,可以人工马上调度一次。 + +对于无法重试成功的情况,往往每次调度都会挂掉,但是只会尝试最开始的那天的任务,因为前置的任务没有成功,只是在每天重试 2022-02-02 的任务; +无法重试成功的任务,仍然需要人工介入,修复(环境、逻辑、上游数据等问题)之后,自动(按顺序)补上之前挂掉的任务的数据; + +## 总结 + +通过混沌工程的虚拟实验我们知道常规的任务调度并不够稳定,而日志驱动的加入可以让ETL任务更加稳定。同时日志驱动也带来了诸多好处,不仅仅解决了混沌工程的稳定性问题。 diff --git a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md b/website/blog/sharp-etl-introduce-04-log-driven-implementation.md similarity index 58% rename from website/blog/sharp-etl-introduce-03-what-is-log-driven.md rename to website/blog/sharp-etl-introduce-04-log-driven-implementation.md index 0eb59aa..6d15ee0 100644 --- a/website/blog/sharp-etl-introduce-03-what-is-log-driven.md +++ b/website/blog/sharp-etl-introduce-04-log-driven-implementation.md @@ -1,58 +1,16 @@ --- -slug: sharp-etl-introduce-03-what-is-log-driven -title: Sharp ETL介绍(三):什么是日志驱动 +slug: sharp-etl-introduce-04-log-driven-implementation +title: Sharp ETL介绍(四):日志驱动实现 tags: [sharp etl, log driven] -date: 2022-08-03T00:00:00+08:00 +date: 2022-08-04T00:00:00+08:00 --- ## 导言 -本文将从为什么需要日志驱动和日志驱动如何解决问题展开来对日志驱动做详细介绍。 +本文将具体展开日志驱动的实现逻辑和细节 -## 常规的任务调度 - -![Log Driven](/assets/images/logdriven-1.svg) - -对于一个daily的任务,理想情况下是每天都会成功,但是实际上肯定会遇到失败的场景,不同的调度引擎往往对于失败的case有不同的处理逻辑。 -这里以忽略过去失败的任务,继续开启下一个调度周期为例,对比实例,跳过了2022-02-02的任务,继续运行 2022-02-03的任务。当发现任务出问题之后,需要手动补数据,手动重新运行2022-02-02的任务,把数据补上去。(这里如果有报表使用了2022-02-02的数据,那么报表的数据肯定是不准确的) - -缺点:完全依赖于调度工具的任务历史记录,如果没有配置失败通知机制,需要一个个去看哪个任务挂掉了。如果允许失败任务之后的任务继续运行,可能会导致对顺序有要求的场景下出问题,比如 2月3日的数据在mysql做了upsert操作,2月2日的又做了一次(在修复失败之后),就会导致用旧的数据覆盖新的数据的问题。 - -**这里也不否认有些调度框架在适当的配置时也能解决上述问题,但是没有人能保证所有的调度框架都能解决上面的问题或者你的项目对于调度框架有自由选择的空间。** - -## 日志驱动 - -所谓的“日志驱动”,其实和“断点续传”这个概念很像,只不过没有应用在下载文件上,而是应用到了数仓。日志驱动有几个核心要点: - -* 自行记录任务运行历史,而不依赖与调度框架的功能。这样就做到了与不同调度框架解绑; -* 调度是有序的,上个周期任务失败了,不会跳过它运行下个周期的任务,每次调度还是会先执行之前失败的任务,直到它成功; - -日志驱动也带来了几点好处: - -* 可以解决重复调度的问题,当任务运行后发现有相同任务在运行或者已经运行过了,当前任务可以直接退出或者kill掉之前的任务 -* 补数据操作更加容易实现且灵活而不容易出错 -* 更加灵活的任务依赖配置(任务上下游不一定是同频率或者必须在一个dag里面) -* 更加灵活的调度起始设置,例如对于kafka offset和自增主键的支持 -* 更加统一且容易的运维操作(不同的项目、不同的调度引擎,都可以基于日志驱动(的表)来进行运维操作) -* 可以记录更加详细的任务状态,比如读到多少条数据,写了多少条数据等等(特指结构化记录,而不是普通的执行日志),方便做统计查看 -* 可以自行选择事务级别(单独一篇展开讲) -* 数据模型分层解耦的作用(单独一篇展开讲) - -![Log Driven](/assets/images/logdriven-2.svg) - -回到现实场景,任务失败的情况大致可以分为两种: - -* 重试就可以成功(网络闪崩,排队超时等) -* 代码、环境有问题需要人工介入的 - -对于重试就可以成功的情况,往往在下一次调度就可以自动补上之前失败的任务的数据;(如果不想等到下一个周期,可以马上调度一次) - -对于无法重试成功的情况,往往每次调度都会挂掉,但是只会尝试最开始的那天的任务,因为前置的任务没有成功,只是在每天重试 2022-02-02 的任务; -无法重试成功的任务,仍然需要人工介入,修复(环境、逻辑、上游数据等问题)之后,自动(按顺序)补上之前挂掉的任务的数据; - - ## 日志驱动的执行逻辑 ![Log Driven](/assets/images/logdriven-3.svg) diff --git a/website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md similarity index 96% rename from website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md rename to website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md index 6c30fed..4177a37 100644 --- a/website/blog/sharp-etl-introduce-04-workflow-in-a-glance.md +++ b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md @@ -1,8 +1,8 @@ --- -slug: sharp-etl-introduce-04-workflow-in-a-glance -title: Sharp ETL介绍(四):Workflow入门 +slug: sharp-etl-introduce-05-workflow-in-a-glance +title: Sharp ETL介绍(五):Workflow入门 tags: [sharp etl, workflow] -date: 2022-08-04T00:00:00+08:00 +date: 2022-08-05T00:00:00+08:00 --- ## 导言 From 86135de59f99d76b001702ad59af867c583e13a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Sat, 6 Aug 2022 15:29:59 +0800 Subject: [PATCH 21/34] Update doc of datasource --- website/docs/datasource.md | 192 +++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 103 deletions(-) diff --git a/website/docs/datasource.md b/website/docs/datasource.md index 268eb65..dc0e987 100644 --- a/website/docs/datasource.md +++ b/website/docs/datasource.md @@ -7,8 +7,8 @@ last_modified_at: 2022-08-05T18:25:57-04:00 ## 支持的数据源 -### Read -- hive +## Read +### hive 该 step 直接通过 SparkSession (需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作。 @@ -28,7 +28,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from table1; ``` -- temp +### temp 该 step 直接通过 SparkSession (不需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作。 @@ -54,7 +54,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from temp_table; ``` -- jdbc 类 +### jdbc - mysql - oracle @@ -112,7 +112,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- kudu +### kudu 该 step 通过 kudu spark 去读取 kudu 表中的数据,之后根据 selectSql 对 load 出来的数据做其他操作(基本的查询谓词可下推到 kudu)。 @@ -142,7 +142,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- impala_kudu +### impala_kudu impale_kudu 与 kudu 查询的逻辑基本一致,都是通过 kudu spark 去操作数据,但不同的是 impale_kudu 是操作由 impala 托管的 kudu 表。由于 impala 默认会在建表时给表名加一个前缀,因此我们在 impala 中操作 kudu 表时使用的表名可能是 'test_db.test_table',但通过 kudu 直接去操作时表名可能就是 `impala::test_db.test_table` 了。 @@ -173,7 +173,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- 文件传输类 +### 文件传输类 该 step 只是 copy 文件,不解析文件内容(不涉及 spark 操作)。暂时只支持 copy 文件到 hdfs。 @@ -322,7 +322,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 -- dateRangeInterval=0 ``` -- hdfs 文件读取类 +### hdfs 文件 该 step 会读取并解析文件内容,返回一个 DataFrame 以供后续使用。 @@ -453,7 +453,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 -- target=console ``` -- udf 注册类 +### udf注册 该 step 在 read 时会将指定类路径下的类加载到内存中。普通的 object 和 class 没什么差别,可以混着用。如果是带参的 class ,需要修改代码支持(pmml即是这种类型)。 @@ -525,7 +525,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from temp; ``` -- bigquery +### bigquery 参数 @@ -556,7 +556,75 @@ last_modified_at: 2022-08-05T18:25:57-04:00 select * from project2.table1 ``` -### Write +### http & http_file + + 参数 + + | 参数名称 | 默认值 | 是否可空 | 说明 | + | -------------- | ------ | -------- | ----------------------- | + | connectionName | 无 | 否 | 连接信息 | + | url | 无 | 否 | 请求地址 | + | httpMethod | GET | 否 | 请求方式 | + | timeout | 无 | 否 | timeout时长 | + | requestBody | 无 | 否 | 请求体 | + | fieldName | value | 否 | 解析response | + | jsonPath | $ | 否 | 解析response | + | splitBy | 空字符串 | 否 | 解析response | + | tempDestinationDir | /tmp | 否 | 本地临时目录 | + | hdfsDir | /tmp | 否 | HDFS保存目录 | + + 在application.properties里的配置信息 + + ```properties + your_connection_name.http.header.Authorization=Basic 123456 + your_connection_name.http.proxy.host=localhost + your_connection_name.http.proxy.port=8080 + ``` + + 示例 + ```sql + -- step=1 + -- source=http + -- url=http://localhost:1080/get_workday?satrt=${START_TIME_TIMESTAMP}&end=${START_TIME_TIMESTAMP} + -- target=temp + -- tableName=source_data + + -- step=2 + -- source=temp + -- tableName=source_data + -- target=temp + -- tableName=source_data_workday + -- writeMode=append + with `workday_temp` as (select explode(from_json(value, + 'struct>>').Report_Entry) + as Report_Entry + from `source_data`) + select Report_Entry.`a` as `a`, + Report_Entry.`b` as `b`, + Report_Entry.`c` as `c`, + Report_Entry.`d` as `d`, + Report_Entry.`e` as `e`, + Report_Entry.`f` as `f`, + Report_Entry.`g` as `g`, + Report_Entry.`h` as `h`, + Report_Entry.`i` as `i`, + Report_Entry.`j` as `j`, + Report_Entry.`k` as `k`, + Report_Entry.`l` as `l`, + Report_Entry.`m` as `m`, + Report_Entry.`n` as `n`, + Report_Entry.`o` as `o`, + Report_Entry.`p` as `p`, + Report_Entry.`q` as `q`, + '${YEAR}' as `year`, + '${MONTH}' as `month`, + '${DAY}' as `day`, + '${HOUR}' as `hour` + from `workday_temp`; + ``` + + +## Write 输出类型分为以下几类: @@ -565,7 +633,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 详细输出类型如下: -- temp +### temp 该 step 的计算结果将注册为当前 SparkSession 生命周期内可用的内存临时表,可在后续 Read 类型为 `hive` 或 `temp` 的 step 中直接在 sql 中调用。 @@ -592,7 +660,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from temp_table; ``` -- hive +### hive 该 step 的计算结果将写入到目标 hive 表,默认采用动态分区的方式。 @@ -615,7 +683,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 2 as b; ``` -- 命令行输出 +### 命令行输出 该 step 的计算结果将输出到 console ,最多显示前 10000 行。 @@ -634,7 +702,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 select 1 as a; ``` -- variables +### variables 该 step 的执行结果为只有一行(可以为多列)数据的 DataFrame,每个字段都将被设置为全局变量,可以在后续 step 的 sql 中直接引用。 @@ -707,7 +775,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from temp1; ``` -- do_nothing +### do_nothing 该 step 只执行 Read 部分的操作,Write 部分不做任何处理。 @@ -767,7 +835,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 - postgres - ms_sql_server -- es +### ElasticSearch es 操作需在 application.properties 中配置基本连接信息,格式为 `es.*`,示例: @@ -805,7 +873,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- kudu +### kudu | 参数名称 | 默认值 | 是否可空 | 说明 | | -------------- | ------ | -------- | ------------------------------- | @@ -822,7 +890,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- impala_kudu +### impala_kudu impale_kudu 与 kudu 查询的逻辑基本一致,都是通过 kudu spark 去操作数据,但不同的是 impale_kudu 是操作由 impala 托管的 kudu 表。由于 impala 默认会在建表时给表名加一个前缀,因此我们在 impala 中操作 kudu 表时使用的表名可能是 'test_db.test_table',但通过 kudu 直接去操作时表名可能就是 `impala::test_db.test_table` 了。 @@ -852,7 +920,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- 文件传输类 +### 文件传输类 此类操作的数据源格式为文件(ftp、scp、hdfs),输出类型也是文件,整个过程不需要解析文件内容,只需完成文件传输。 @@ -916,7 +984,7 @@ last_modified_at: 2022-08-05T18:25:57-04:00 -- writeMode=overwrite ``` -- hdfs 文件写出类 +### hdfs 文件 此类 step 数据源格式为结构化数据(各种类型的表),整个输出过程需要将源数据按照指定规则处理好并最终输出。 @@ -970,86 +1038,4 @@ last_modified_at: 2022-08-05T18:25:57-04:00 from test_table; ``` -- yellowbrick - - yellowbrick此数据库目前只支持用作目标数据库,会将此step里read的DataFrame存入yellowbrick里 - yellowbrick操作需在 application.properties 中配置基本连接信息,格式为 `${dbName}.yellowbrick.*`,示例: - - ```properties - test.yellowbrick.host=localhost - test.yellowbrick.port=5432 - test.yellowbrick.user=root - test.yellowbrick.password=root - test.yellowbrick.relayHost=localhost - test.yellowbrick.relayPort=21212 - test.yellowbrick.partition=4 - ``` - - 参数: - - | 参数名称 | 默认值 | 是否可空 | 说明 | - | -------------- | ------ | -------- | ----------------------- | - | dataSourceType | 无 | 否 | 值必须为yellowbrick | - | dbName | 无 | 否 | 数据库名字,用以从配置文件里读取连接信息 | - | primaryKeys | 无 | 是 | 只有当writeMode是upsert时,才需要使用, 并且此值不能为空, 当有多个primaryKeys使用","拼接 | - - 示例 - ```sql - -- step=1 - -- source=impala_kudu - -- dbName=test_db - -- tableName=test_table - -- target=console - -- dbName=test - -- writeMode=append - select * - from test_table; - ``` - - 目前yellowbrick支持的writeMode有三种: append, overwrite和upsert - - - append - - 示例 - ```sql - -- step=1 - -- source=impala_kudu - -- dbName=test_db - -- tableName=test_table - -- target=console - -- dbName=test - -- writeMode=append - select * - from test_table; - ``` - - - overwrite - 示例 - ```sql - -- step=1 - -- source=impala_kudu - -- dbName=test_db - -- tableName=test_table - -- target=console - -- dbName=test - -- writeMode=overwrite - select * - from test_table; - ``` - - - upsert - - 示例 - ```sql - -- step=1 - -- source=impala_kudu - -- dbName=test_db - -- tableName=test_table - -- target=console - -- dbName=test - -- primaryKeys=loginhistory_id - -- writeMode=upsert - select * - from test_table; - ``` \ No newline at end of file From 3f1d156e766451b4c4ece6c5685f20bec9cfd5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 10 Aug 2022 11:58:00 +0800 Subject: [PATCH 22/34] Update doc for UDF --- ...p-etl-introduce-05-workflow-in-a-glance.md | 5 +++ website/docs/UDF-guide.md | 41 +++++++++++++++++++ website/sidebars.js | 1 + 3 files changed, 47 insertions(+) create mode 100644 website/docs/UDF-guide.md diff --git a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md index 4177a37..9a7df63 100644 --- a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md +++ b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md @@ -99,6 +99,11 @@ class TestUdfObj extends Serializable { 打包完成后需要将jar包与Sharp ETL的jar包一起提交,这样就可以很轻易的引用自己的UDF了。 +```bash +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar /path/to/your-udf.jar ... ... +``` + + ```sql -- step=1 -- source=class diff --git a/website/docs/UDF-guide.md b/website/docs/UDF-guide.md new file mode 100644 index 0000000..d9d0f70 --- /dev/null +++ b/website/docs/UDF-guide.md @@ -0,0 +1,41 @@ +--- +title: "UDF guide" +sidebar_position: 10 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## UDF + +用户可以通过build自己的jar包来实现UDF的支持,这个jar包不需要基于Sharp ETL来实现,甚至仅仅是普通的Scala function即可。 + +例如,用户需要注册一个新的UDF来实现自定义逻辑,只需要编写普通代码即可: + +```scala +class TestUdfObj extends Serializable { + def testUdf(value: String): String = { + s"$value-proceed-by-udf" + } +} +``` + +打包完成后需要将jar包与Sharp ETL的jar包一起提交,这样就可以很轻易的引用自己的UDF了。 + +```bash +spark-submit --class com.github.sharpdata.sharpetl.spark.Entrypoint spark/build/libs/spark-1.0.0-SNAPSHOT.jar /path/to/your-udf.jar ... ... +``` + +```sql +-- step=1 +-- source=class +-- className=com.github.sharpdata.sharpetl.spark.end2end.TestUdfObj +-- target=udf +-- methodName=testUdf +-- udfName=test_udf + +-- step=2 +-- source=temp +-- target=temp +-- tableName=udf_result +select test_udf('input') as `result`; +``` diff --git a/website/sidebars.js b/website/sidebars.js index 1d81f0b..01ca49c 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -45,6 +45,7 @@ module.exports = { collapsed: false, items: [ 'transformer-guide', + 'UDF-guide', ], }, { type: 'category', From 54ec93edc87405569a72c39923ed516ed88fc202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 10 Aug 2022 13:19:49 +0800 Subject: [PATCH 23/34] Update doc for data source --- website/docs/custom-datasource-guide.md | 93 +++++++++++++++++++++++++ website/docs/transformer-guide.md | 62 ++--------------- website/sidebars.js | 1 + 3 files changed, 98 insertions(+), 58 deletions(-) create mode 100644 website/docs/custom-datasource-guide.md diff --git a/website/docs/custom-datasource-guide.md b/website/docs/custom-datasource-guide.md new file mode 100644 index 0000000..34bc977 --- /dev/null +++ b/website/docs/custom-datasource-guide.md @@ -0,0 +1,93 @@ +--- +title: "custom-datasource-guide" +sidebar_position: 10 +toc: true +last_modified_at: 2021-12-23T18:25:57-04:00 +--- + +## 自定义数据源 + +实现自定义数据源包括两个API:[Source](https://github.com/SharpData/SharpETL/blob/main/core/src/main/scala/com/github/sharpdata/sharpetl/core/datasource/Source.scala)和[Sink](https://github.com/SharpData/SharpETL/blob/main/core/src/main/scala/com/github/sharpdata/sharpetl/core/datasource/Sink.scala)。 + +```scala +trait Source[DataFrame, Context] extends Serializable { + def read(step: WorkflowStep, jobLog: JobLog, executionContext: Context, variables: Variables): DataFrame +} + +trait Sink[DataFrame] extends Serializable { + def sink(df: DataFrame, step: WorkflowStep, variables: Variables): Unit +} +``` + +:::tip +针对支持JDBC的数据源无需额外实现,只需提交任务时提供该数据源的JDBC driver jar和在properties文件中配置链接即可, 例如对于informix的JDBC支持需要配置: + +```properties +sysmaster.informix.url=jdbc:informix-sqli://localhost:9088/sysmaster:INFORMIXSERVER=informix;DELIMIDENT=Y +sysmaster.informix.user=informix +sysmaster.informix.password=in4mix +sysmaster.informix.driver=com.informix.jdbc.IfxDriver +sysmaster.informix.fetchsize=100 +``` +::: + +## 以DataBricks Delta为例扩展新的数据源 + +### 创建Config class + +因为Delta可以看做是表结构,所以这里沿用了`DBDataSourceConfig`, 你也可以根据实际情况按需添加新的配置。 + + +```scala +import com.github.sharpdata.sharpetl.core.annotation.configFor + +@configFor(types = Array("delta_lake")) +class DeltaLakeDataSourceConfig extends DBDataSourceConfig { + @BeanProperty + var yourConfig: String = _ +} +``` + +:::tip +注意这里使用了`@configFor`注册了新的数据源类型,注册过后便可以在workflow里面作为source或target的值使用。 +::: + +### 实现 Source&Sink API + +这里为了方便阅读,代码经过一定程度的简化。 + +```scala +import com.github.sharpdata.sharpetl.core.api.Variables +import com.github.sharpdata.sharpetl.core.datasource.{Sink, Source} +import com.github.sharpdata.sharpetl.core.datasource.config.DBDataSourceConfig +import com.github.sharpdata.sharpetl.core.repository.model.JobLog +import com.github.sharpdata.sharpetl.core.syntax.WorkflowStep +import com.github.sharpdata.sharpetl.core.annotation._ +import com.github.sharpdata.sharpetl.core.util.ETLLogger +import org.apache.spark.sql.{DataFrame, SparkSession} + +@source(types = Array("delta_lake")) +@sink(types = Array("delta_lake")) +class DeltaLakeDataSource extends Source[DataFrame, SparkSession] with Sink[DataFrame] { + + override def read(step: WorkflowStep, jobLog: JobLog, executionContext: SparkSession, variables: Variables): DataFrame = { + spark + .read + .format("delta") + .load(s"$deltaLakeBasePath/${step.source.asInstanceOf[DBDataSourceConfig].tableName}") + } + + override def sink(df: DataFrame, step: WorkflowStep, variables: Variables): Unit = { + df + .write + .format("delta") + .mode(step.getWriteMode) + .save(targetPath) + } +} + +``` + +:::tip +注意这里使用了`@source`和`@sink`与数据源类型做关联,一个DataSource可以同时关联多个数据类型(只要他们的实现是一致的),也可以只实现Source或者Sink API。 +::: \ No newline at end of file diff --git a/website/docs/transformer-guide.md b/website/docs/transformer-guide.md index 98c14c7..83c2df4 100644 --- a/website/docs/transformer-guide.md +++ b/website/docs/transformer-guide.md @@ -82,29 +82,6 @@ last_modified_at: 2021-12-23T18:25:57-04:00 - `dependencies`: 上游依赖job的名称,`jobName`即为需要检测的job名 -- `HttpTransformer`: 该transformer是将从api获得的json类型数据进行解析和落表,还支持url中的动态传参,可以采用`variables`定义具体参数并调用 - - ```sql - -- step=1 - -- source=transformation - -- className=com.github.sharpdata.sharpetl.spark.transformation.HttpTransformer - -- methodName=transform - -- transformerType=object - -- url=https:xxxx - -- connectionName=connection_demo - -- fieldName=centerIds - -- jsonPath=$.centers[*].id - -- splitBy=, - -- target=variables - -- checkPoint=false - -- dateRangeInterval=0 - ``` - - - `url`: 具体的API连接,其中可以包含动态传入的参数,与`variables`结合使用,如`https://${DAY}` - - `connectionName`: 部分url可能需要代理访问,该参数配置访问的代理参数,需要进行配置,格式为`http.{connectionName}.proxy.host`, `http.{connectionName}.proxy.port`, `http.{connectionName}.header.Authorization`,若api无需代理或鉴权则无需配置 - - `fieldName`: api返回的json字符串一级名称,和`splitBy`参数一起对json字符串进行解析 - - `splitBy`: json字符串中分隔符 - - `FileCleanTransformer`: 该transformer将删除目标路径下固定格式的文件,需要输入`filePath`和`fileNamePattern`,后者支持正则表达式 ```sql @@ -154,40 +131,6 @@ last_modified_at: 2021-12-23T18:25:57-04:00 - `datasource`: 写入的数据库类型,用于汇总具体的`errorMessage` -- `G2ApiTransformer`: 该transformer主要解析api来的json数据并将其存入`kafka topic`,随后写入到hdfs再进行后续dataflow - - ```sql - -- step=1 - -- source=transformation - -- className=com.github.sharpdata.sharpetl.spark.transformation.G2ApiTransformer - -- methodName=launch - -- transformerType=object - -- url=https://xxxx - -- checkPoint=/checkpoint - -- totalOpenCount=${TOTAL_OPEN_COUNT} - -- totalClosedCount=${TOTAL_CLOSED_COUNT} - -- openDDL=`demo1` STRING, `demo2` STRING - -- openSelectExpr=demo1, demo2 - -- closedDDL=`demo1` STRING, `demo2` STRING, `demotimestamp` STRING - -- closedSelectExpr=demo1, demo2, demotimestamp - -- closedTimestampColumns=demotimestamp - -- openHdfsDest=hdfs:///open_ratings_demo.csv - -- closedHdfsDest=hdfs:///closed_ratings_demo.csv - -- dbName=bigdata - -- openTableName=quantumdbuser.open_ratings_demo - -- closedTableName=quantumdbuser.closed_ratings_demo - -- target=do_nothing - -- checkPoint=false - -- dateRangeInterval=0 - ``` - - - 该段step大部分参数均为定制化参数,主要适用于本项目的业务场景,也是唯一的流失数据处理场景 - - `url`: api的具体信息 - - `openDDL`&`closedDDL`: 具体的数据结构信息,可以自定义参数名称,open和closed为业务场景需要 - - `openSelectExpr`&`closedSelectExpr`: 落表时的具体字段名,用于拼接sql写入数据 - - `openHdfsDest`&`closedHdfsDest`: 写入到hdfs的文件路径及文件名 - - `openTableName`&`closedTableName`: 在yb落表时表名 - - `CheckAllConnectorStatusTransformer`: 该transformer集成了`kafka restapi`,通过调用接口返回各个`connector`的运行状态,若有`connector`状态为`failed`或`pause`,则会及时预警 ```sql @@ -272,6 +215,9 @@ object LoopHttpTransformer extends Transformer { } ``` +### Pro tips + +:::tip 编写scala脚本实现的transformer,需要注意几个要点: * 文件开头不可带有package信息,在sql中调用时,会根据package.fileName中的fileName找到scala脚本 @@ -279,4 +225,4 @@ object LoopHttpTransformer extends Transformer { * 部分package需使用全名例如 `scala.collection.mutable.Map[String, String]`, 而不是 `mutable.Map[String, String]` * 如果你遇到了类似于`illegal cyclic reference involving object InterfaceAudience`的错误,你需要spark-submit option `--conf "spark.executor.userClassPathFirst=true" --conf "spark.driver.userClassPathFirst=true"` * 如果你遇到了错误`object x is not a member of package x`,你需要使用全引用例如 `scala.collection.mutable.Map[String, String]` - +::: diff --git a/website/sidebars.js b/website/sidebars.js index 01ca49c..8c159ca 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -46,6 +46,7 @@ module.exports = { items: [ 'transformer-guide', 'UDF-guide', + 'custom-datasource-guide', ], }, { type: 'category', From 11f529385441334b217eb5c25dcbe0d169324c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 10 Aug 2022 13:25:48 +0800 Subject: [PATCH 24/34] Update doc for data source --- website/docs/custom-datasource-guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/custom-datasource-guide.md b/website/docs/custom-datasource-guide.md index 34bc977..c7df7e6 100644 --- a/website/docs/custom-datasource-guide.md +++ b/website/docs/custom-datasource-guide.md @@ -15,7 +15,7 @@ trait Source[DataFrame, Context] extends Serializable { } trait Sink[DataFrame] extends Serializable { - def sink(df: DataFrame, step: WorkflowStep, variables: Variables): Unit + def write(df: DataFrame, step: WorkflowStep, variables: Variables): Unit } ``` @@ -77,7 +77,7 @@ class DeltaLakeDataSource extends Source[DataFrame, SparkSession] with Sink[Data .load(s"$deltaLakeBasePath/${step.source.asInstanceOf[DBDataSourceConfig].tableName}") } - override def sink(df: DataFrame, step: WorkflowStep, variables: Variables): Unit = { + override def write(df: DataFrame, step: WorkflowStep, variables: Variables): Unit = { df .write .format("delta") From ba4aea227b711db92c079a2bd6f9dd647134440d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 10 Aug 2022 14:55:01 +0800 Subject: [PATCH 25/34] Update docs --- website/docs/excel-template-dwd.md | 84 +++++++++++++++--------------- website/docs/sql-scripts-guide.md | 2 +- website/docs/transformer-guide.md | 4 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/website/docs/excel-template-dwd.md b/website/docs/excel-template-dwd.md index ba1d7bf..26b707b 100644 --- a/website/docs/excel-template-dwd.md +++ b/website/docs/excel-template-dwd.md @@ -56,7 +56,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_cust @@ -78,7 +78,7 @@ select `id` as `id`, '${DATE_END}' as dw_insert_date from `usecase_ods`.`test_cust`; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=t_fact_test_cust @@ -93,7 +93,7 @@ from `usecase_dwd`.`t_fact_test_cust` `t_fact_test_cust` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`t_fact_test_cust` `t_fact_test_cust`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -158,7 +158,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_user @@ -181,7 +181,7 @@ select `id` as `id`, '${DATE_END}' as dw_insert_date from `usecase_ods`.`test_user`; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=t_dim_user @@ -196,7 +196,7 @@ from `usecase_dwd`.`t_dim_user` `t_dim_user` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`t_dim_user` `t_dim_user`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -226,7 +226,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_split @@ -250,7 +250,7 @@ from `usecase_ods`.`test_split` `test_split` left join `usecase_dwd`.`t_dim_user` `t_dim_user` on `test_split`.`user_id` = `t_dim_user`.`id` and `t_dim_user`.is_latest = '1'; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=test_fact_split @@ -265,7 +265,7 @@ from `usecase_dwd`.`test_fact_split` `test_fact_split` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_fact_split` `test_fact_split`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -323,7 +323,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_fact_case_3 @@ -338,7 +338,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), select * from `usecase_ods`.`test_fact_case_3`; --- stepId=3 +-- step=3 -- source=temp -- target=temp -- tableName=`ce47db66` @@ -374,7 +374,7 @@ group by `real_cust_id` having 1 = 1 and (`real_cust_id` is not null); --- stepId=4 +-- step=4 -- source=temp -- target=temp -- tableName=test_cust_case_3__f1e256b9 @@ -396,7 +396,7 @@ where 1 = 1 and (`real_cust_id` is not null) and `distinct_count_num` = 1; --- stepId=5 +-- step=5 -- source=hive -- dbName=usecase_dwd -- tableName=test_cust_case_3 @@ -409,7 +409,7 @@ select `(dw_insert_date)?+.+`, '${DATE_END}' as `dw_insert_date` from `usecase_dwd`.`test_cust_case_3`; --- stepId=6 +-- step=6 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -426,7 +426,7 @@ from `usecase_dwd`.`test_cust_case_3`; -- dateRangeInterval=0 -- writeMode=overwrite --- stepId=7 +-- step=7 -- source=temp -- target=temp -- tableName=test_fact_target_case_3__6637c70e @@ -458,14 +458,14 @@ from `a8cc8c22` `test_fact_case_3` left join `duplicate_dimension_temp` `duplicate_dimension_temp_0` on `test_fact_case_3`.`real_cust_id` = `duplicate_dimension_temp_0`.`real_cust_id`; --- stepId=8 +-- step=8 -- source=temp -- target=variables -- checkPoint=false -- dateRangeInterval=0 select '' as `DW_PARTITION_CLAUSE`; --- stepId=9 +-- step=9 -- source=hive -- dbName=usecase_dwd -- tableName=test_fact_target_case_3 @@ -538,7 +538,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_fact_auto_dim @@ -552,7 +552,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), select * from `usecase_ods`.`test_fact_auto_dim`; --- stepId=3 +-- step=3 -- source=temp -- target=temp -- tableName=`cb939fe5` @@ -589,7 +589,7 @@ group by `area_code`, `area_name` having 1 = 1 and (`area_code` is not null and `area_name` is not null); --- stepId=4 +-- step=4 -- source=temp -- target=temp -- tableName=test_area__f5045d67 @@ -613,7 +613,7 @@ where 1 = 1 `area_name` is not null) and `distinct_count_num` = 1; --- stepId=5 +-- step=5 -- source=hive -- dbName=usecase_dwd -- tableName=test_area @@ -628,7 +628,7 @@ from `usecase_dwd`.`test_area` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_area`); --- stepId=6 +-- step=6 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -645,7 +645,7 @@ where `dw_insert_date` = (select max(`dw_insert_date`) -- dateRangeInterval=0 -- writeMode=overwrite --- stepId=7 +-- step=7 -- source=temp -- target=temp -- tableName=test_fact_target_auto_dim__d3531bfc @@ -679,7 +679,7 @@ from `634737e2` `test_fact_auto_dim` on `test_fact_auto_dim`.`area_code` = `duplicate_dimension_temp_0`.`area_code` and `test_fact_auto_dim`.`area_name` = `duplicate_dimension_temp_0`.`area_name`; --- stepId=8 +-- step=8 -- source=hive -- dbName=usecase_dwd -- tableName=test_fact_target_auto_dim @@ -694,7 +694,7 @@ from `usecase_dwd`.`test_fact_target_auto_dim` `test_fact_target_auto_dim` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_fact_target_auto_dim` `test_fact_target_auto_dim`); --- stepId=9 +-- step=9 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -760,7 +760,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_fact_case_6 @@ -774,7 +774,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), select * from `usecase_ods`.`test_fact_case_6`; --- stepId=3 +-- step=3 -- source=temp -- target=temp -- tableName=`6954aac5` @@ -810,7 +810,7 @@ group by `area_id` having 1 = 1 and (`area_id` is not null); --- stepId=4 +-- step=4 -- source=temp -- target=temp -- tableName=test_area_case_6__ebc46690 @@ -832,7 +832,7 @@ where 1 = 1 and (`area_id` is not null) and `distinct_count_num` = 1; --- stepId=5 +-- step=5 -- source=hive -- dbName=usecase_dwd -- tableName=test_area_case_6 @@ -845,7 +845,7 @@ select `(dw_insert_date)?+.+`, '${DATE_END}' as `dw_insert_date` from `usecase_dwd`.`test_area_case_6`; --- stepId=6 +-- step=6 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -862,7 +862,7 @@ from `usecase_dwd`.`test_area_case_6`; -- dateRangeInterval=0 -- writeMode=overwrite --- stepId=7 +-- step=7 -- source=temp -- target=temp -- tableName=test_fact_target_case_6__e9ae24c3 @@ -893,14 +893,14 @@ from `b53c9449` `test_fact_case_6` left join `duplicate_dimension_temp` `duplicate_dimension_temp_0` on `test_fact_case_6`.`area_id` = `duplicate_dimension_temp_0`.`area_id`; --- stepId=8 +-- step=8 -- source=temp -- target=variables -- checkPoint=false -- dateRangeInterval=0 select '' as `DW_PARTITION_CLAUSE`; --- stepId=9 +-- step=9 -- source=hive -- dbName=usecase_dwd -- tableName=test_fact_target_case_6 @@ -1057,7 +1057,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_region_source @@ -1083,7 +1083,7 @@ select `id` as `id`, '${DATE_END}' as dw_insert_date from `usecase_ods`.`test_region_source`; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=test_region @@ -1098,7 +1098,7 @@ from `usecase_dwd`.`test_region` `test_region` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_region` `test_region`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -1129,7 +1129,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_fact_case8 @@ -1153,7 +1153,7 @@ from `usecase_ods`.`test_fact_case8` `test_fact_case8` left join `usecase_dwd`.`test_region` `test_region` on `test_fact_case8`.`region_id` = `test_region`.`id` and `test_region`.is_latest = '1'; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=test_fact_target_case8 @@ -1168,7 +1168,7 @@ from `usecase_dwd`.`test_fact_target_case8` `test_fact_target_case8` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_fact_target_case8` `test_fact_target_case8`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform @@ -1199,7 +1199,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), from_unixtime(unix_timestamp('${DATA_RANGE_END}', 'yyyy-MM-dd HH:mm:ss'), 'HH') as `HOUR_END`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd HH:mm:ss') as `EFFECTIVE_START_TIME`; --- stepId=2 +-- step=2 -- source=hive -- dbName=usecase_ods -- tableName=test_store_fact @@ -1223,7 +1223,7 @@ from `usecase_ods`.`test_store_fact` `test_store_fact` left join `usecase_dwd`.`test_region` `test_region` on `test_store_fact`.`region_id` = `test_region`.`id` and `test_region`.is_latest = '1'; --- stepId=3 +-- step=3 -- source=hive -- dbName=usecase_dwd -- tableName=test_store_fact_target @@ -1238,7 +1238,7 @@ from `usecase_dwd`.`test_store_fact_target` `test_store_fact_target` where `dw_insert_date` = (select max(`dw_insert_date`) from `usecase_dwd`.`test_store_fact_target` `test_store_fact_target`); --- stepId=4 +-- step=4 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.ZipTableTransformer -- methodName=transform diff --git a/website/docs/sql-scripts-guide.md b/website/docs/sql-scripts-guide.md index 7070e70..da7dbd8 100644 --- a/website/docs/sql-scripts-guide.md +++ b/website/docs/sql-scripts-guide.md @@ -21,7 +21,7 @@ select from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss' from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'MM') as `MONTH`, from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'dd') as `DAY`; --- stepId=2 +-- step=2 -- source=hive -- dbName=sql_demo_db -- tableName=sql_demo diff --git a/website/docs/transformer-guide.md b/website/docs/transformer-guide.md index 83c2df4..992256d 100644 --- a/website/docs/transformer-guide.md +++ b/website/docs/transformer-guide.md @@ -101,7 +101,7 @@ last_modified_at: 2021-12-23T18:25:57-04:00 - `DropExternalTableTransformer`: 该transformer将删除hive和hdfs中以`tableNamePrefix`开头的在`databaseName`数据库中相应`partition`的表和文件, `partition`支持动态传参,可以与`variables`结合使用 ```sql - -- stepId=2 + -- step=2 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.DropExternalTableTransformer -- methodName=transform @@ -162,7 +162,7 @@ last_modified_at: 2021-12-23T18:25:57-04:00 - `EnsureSinkConnectorFinished`: 该transformer用于确认`sink connector`即`consumer`端是否消费完数据,是否将数据全部写入hive/hdfs,一般接在`CheckConnectorStatusTransformer`后,为step2,若`consumer`还未写入完成,会等待5分钟,若5分钟后还未完成,则下游任务不会执行 ```sql - -- stepId=2 + -- step=2 -- source=transformation -- className=com.github.sharpdata.sharpetl.spark.transformation.EnsureSinkConnectorFinished -- methodName=transform From 3aebe46f2b54fe84b612e5168f6739f2510ef052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Wed, 10 Aug 2022 15:03:29 +0800 Subject: [PATCH 26/34] Drop unused doc --- ...p-etl-introduce-05-workflow-in-a-glance.md | 8 +- website/docs/sql-scripts-guide.md | 100 ------------------ website/sidebars.js | 1 - website/static/assets/images/roadmap.png | Bin 146918 -> 0 bytes website/static/assets/images/sql-scripts.png | Bin 141676 -> 0 bytes .../static/assets/images/workflowarrow.png | Bin 3595 -> 0 bytes 6 files changed, 6 insertions(+), 103 deletions(-) delete mode 100644 website/docs/sql-scripts-guide.md delete mode 100644 website/static/assets/images/roadmap.png delete mode 100644 website/static/assets/images/sql-scripts.png delete mode 100644 website/static/assets/images/workflowarrow.png diff --git a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md index 9a7df63..ddfde82 100644 --- a/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md +++ b/website/blog/sharp-etl-introduce-05-workflow-in-a-glance.md @@ -18,7 +18,7 @@ date: 2022-08-05T00:00:00+08:00 * 扩展 * UDF * Transformer - * Dynamic transformer + * 自定义数据源 @@ -121,4 +121,8 @@ select test_udf('input') as `result`; ### Transformer -Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-guide) \ No newline at end of file +Transformer的相关详细使用可以参考 [Transformer](/docs/transformer-guide) + +### 自定义数据源 + +自定义数据源的相关详细使用可以参考 [Transformer](/docs/custom-datasource-guide) \ No newline at end of file diff --git a/website/docs/sql-scripts-guide.md b/website/docs/sql-scripts-guide.md deleted file mode 100644 index da7dbd8..0000000 --- a/website/docs/sql-scripts-guide.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "SQL script quick start" -sidebar_position: 9 -toc: true -last_modified_at: 2021-12-23T18:25:57-04:00 ---- - -## sql脚本的使用 - -ETL通过sql文件来定义,ETL的流程通过sql脚本中的step来划分,每个step都包含输入(`sourceConfig`)输出(`targetConfig`)的配置。source、target通过`dataSourceType`支持一系列数据源。同时还支持通过`transformer`等方式来ETL扩展自定义逻辑。 - -### 原生sql的结构如下: - -```sql --- step=1 --- source=temp --- target=variables --- checkPoint=false --- dateRangeInterval=0 -select from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'yyyy') as `YEAR`, - from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'MM') as `MONTH`, - from_unixtime(unix_timestamp('${DATA_RANGE_START}', 'yyyy-MM-dd HH:mm:ss'), 'dd') as `DAY`; - --- step=2 --- source=hive --- dbName=sql_demo_db --- tableName=sql_demo --- target=yellowbrick --- dbName=sql_demo_yb --- tableName=sql_demo --- checkPoint=false --- dateRangeInterval=0 --- writeMode=overwrite -select * from sql_demo_db.sql_demo where year = '${YEAR}' and month = '${MONTH}' and day = '${DAY}'; -``` - -- step1中`DATA_RANGE_START`为执行etl job时传入的内置参数,除`DATA_RANGE_START`外还包括`DATA_RANGE_END`以及`job_id`等参数,这些参数可以在sql脚本中直接进行调用 -- step1将`DATA_RANGE_START`参数的年月日分别提取出来,并赋值给变量`YEAR`, `MONTH`, `DAY`,这三个变量可以在后面的step中以`'${变量名}'`的形式进行调用 -- step2则从`hive`中`sql_demo_db`的`sql_demo`表中读取出满足where子句的数据,并将其写入`yellowbrick`中的`sql_demo`表中 - -![image-sql-structure](/assets/images/sql-scripts.png) - - - - - - -各个参数的含义及使用: - -- `sourceConfig`: 源系统相关信息,读取数据 - - `dataSourceType`: 无默认值,支持`hive`, `temp`, `jdbc类型`, `batch_kafka`, `transformation`等 - - `hive`: 通过 SparkSession (需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作 - - `temp`: 直接通过 SparkSession (不需启用 hive 支持)执行 hive sql 并返回 DataFrame 以供后续操作 - - `jdbc类数据库`: 源数据库类型,需要配置基本连接信息,格式为`${dbName}.${dataSourceType}.*`, - - `batch_kafka`: 支持从kafka topic读取数据,需要配置`kafka bootstrop server`信息,和`topics`参数, `schemaDDL`参数结合使用,前者表示kafka topic名称,后者为对应topic中的数据结构(`columnName columnType`) - - `transformation`: 支持自定义transformer接入多种数据源,一般为`sourceConfig`中参数,且需要和`className`, `methodName`, `transfermerType`结合使用,不同transformer有自定义参数,需要结合使用 - - `dbName`: 无默认值,源数据库库名 - - `tableName`:无默认值,源表表名 - - - -- `targetConfig`: 目标数据库相关信息,写出数据 - - - `dataSourceType`: 无默认值,支持`hive`,` jdbc类型`, `variables`, `console`, `temp`,`do_nothing`等 - - - `hive`: 该 step 的计算结果将写入到目标 hive 表,默认采用动态分区的方式。 - - `Jdbc`类数据库: 目标数据库类型,需要配置基本连接信息,格式为`${dbName}.${dataSourceType}.*`, - - - `variables`:将执行结果为只有一行(可以为多列)数据的 DataFrame中每个字段都设置为全局变量,可以在后续 step 的 sql 中直接引用 - - - `console`: 将该step中的执行结果进行输出 - - `temp`: 该 step 的计算结果将注册为当前 SparkSession 生命周期内可用的内存临时表,可在后续 `targetConfig/dataSourceConfig` 类型为 `hive` 或 `temp` 的 step 中直接在 sql 中调用 - - `do_nothing`: 该step将不对读取出的数据做任何操作,通常用于执行`delete`,`update`等无返回值的sql语句 - - - -- `WriteMode`:数据写入方式,指从源系统向目标系统写入时的方式 - - - `upsert`: update+insert,需要和`primaryKey`参数结合使用 - - `append`: 追加写入 - - `overwrite`: 覆盖写入 - -- `incrementalType`: 日志驱动所依赖的增量类型,默认为`timeBased`,即`step_log`和`job_log`中`dataRangeStart`和`dataRageEnd`为时间 - - - `incremental_kafka_offset`: 指从`kafka topic`中读取数据,此时在表中记录和维护的是`kafka topic`内的`offset`值 - - `incremental_auto_inc_id`: 并非`timebased`,记录和维护一个`int`值 - - - -PS: -- 由于不同类型的数据库在sql语法上会有所区别,故每个step中的sql语句语法是取决于`sourceConfig`中的数据库类 - - - - - - - - - diff --git a/website/sidebars.js b/website/sidebars.js index 8c159ca..11c29a4 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -20,7 +20,6 @@ module.exports = { collapsed: false, items: [ 'encrypt-in-properties-file', - 'sql-scripts-guide', 'datasource', ], }, { diff --git a/website/static/assets/images/roadmap.png b/website/static/assets/images/roadmap.png deleted file mode 100644 index b46bc49398038032659a69ccc6f325ab22f69486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146918 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